[PATCH] vpnc-script: add dnsmasq split-horizon DNS support

Joe MacDonald joe_macdonald at mentor.com
Tue Jun 24 07:56:59 PDT 2014


Attempt to determine if dnsmasq is being used to manage name resolution
and, if so, update the configuration with VPN-supplied DNS information.

Signed-off-by: Joe MacDonald <joe_macdonald at mentor.com>
---

Adding any level of dnsmasq interaction makes it pretty easy to set up
best-effort split-horizon DNS.  This does depend on having resolvconf
managing things as well, but the concept should apply equally well to a
non-resolvconf scenario.  It just seemed easiest and least invasive to
create / remove the dnsmasq.d configuration piece in the
*_resolvconf_manager() functions.  I try to err on the side of asking the
VPN DNS more often rather than less but still use the
previously-configured resolver for what looks like non-VPN traffic.


 vpnc-script |   54 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 47 insertions(+), 7 deletions(-)

diff --git a/vpnc-script b/vpnc-script
index 79cf6e2..bbde4cd 100755
--- a/vpnc-script
+++ b/vpnc-script
@@ -360,6 +360,22 @@ fi
 
 # =========== resolv.conf handling for any OS =========================
 
+do_restart_dnsmasq() {
+	SERVICE=`which service`
+	if [ -x $SERVICE ] ; then
+		$SERVICE dnsmasq restart
+	else
+		if [ -x /etc/init.d/dnsmasq ] ; then
+			/etc/init.d/dnsmasq restart
+		else
+			SYSTEMCTL=`which systemctl`
+			if [ -x $SYSTEMCTL ] ; then
+				$SYSTEMCTL restart dnsmasq
+			fi
+		fi
+	fi
+}
+
 modify_resolvconf_generic() {
 	grep '^#@VPNC_GENERATED@' /etc/resolv.conf > /dev/null 2>&1 || cp -- /etc/resolv.conf "$RESOLV_CONF_BACKUP"
 	NEW_RESOLVCONF="#@VPNC_GENERATED@ -- this file is generated by vpnc
@@ -542,19 +558,43 @@ restore_resolvconf_openwrt() {
 
 modify_resolvconf_manager() {
 	NEW_RESOLVCONF=""
-	for i in $INTERNAL_IP4_DNS; do
-		NEW_RESOLVCONF="$NEW_RESOLVCONF
+	if [[ -d /etc/dnsmasq.d/ && `pgrep dnsmasq` ]] ;
+	then
+		# the system has dnsmasq installed and appears to be using it so inform
+		# dnsmasq about the new servers and domains
+		if [ -n "$CISCO_DEF_DOMAIN" ]; then
+			#  limit searching the VPN servers for only VPN addresses, but it is
+			#  better to cast too wide a net on this than miss VPN address lookups.
+			VPN_DNS=`echo $CISCO_DEF_DOMAIN | awk -F. '{ print "/" $(NF-1) "." $NF "/" }'`
+		fi
+		for i in $INTERNAL_IP4_DNS; do
+			NEW_RESOLVCONF="$NEW_RESOLVCONF
+server=$VPN_DNS$i"
+		done
+		echo "$NEW_RESOLVCONF" > /etc/dnsmasq.d/$TUNDEV.conf
+		# inform dnsmasq that there is a new configuraiton fragment to consider.
+		do_restart_dnsmasq
+	else
+		for i in $INTERNAL_IP4_DNS; do
+			NEW_RESOLVCONF="$NEW_RESOLVCONF
 nameserver $i"
-	done
-	if [ -n "$CISCO_DEF_DOMAIN" ]; then
-		NEW_RESOLVCONF="$NEW_RESOLVCONF
+		done
+		if [ -n "$CISCO_DEF_DOMAIN" ]; then
+			NEW_RESOLVCONF="$NEW_RESOLVCONF
 domain $CISCO_DEF_DOMAIN"
+		fi
+		echo "$NEW_RESOLVCONF" | /sbin/resolvconf -a $TUNDEV
 	fi
-	echo "$NEW_RESOLVCONF" | /sbin/resolvconf -a $TUNDEV
 }
 
 restore_resolvconf_manager() {
-	/sbin/resolvconf -d $TUNDEV
+	if [[ -d /etc/dnsmasq.d/ && `pgrep dnsmasq` ]] ;
+	then
+		rm -f /etc/dnsmasq.d/$TUNDEV.conf
+		do_restart_dnsmasq
+	else
+		/sbin/resolvconf -d $TUNDEV
+	fi
 }
 
 # ========= Toplevel state handling  =======================================
-- 
1.7.10.4




More information about the openconnect-devel mailing list