[LEDE-DEV] [PATCH v3] dnsmasq: manage resolv.conf if when listening on 127.0.0.1#53

Paul Oranje phoranje at gmail.com
Tue Jun 20 01:41:58 PDT 2017


For those that want to test the dnsmasq patch on LEDE 17.01, see the attached patch file adapted for 17.01(.2).
In the LEDE source root dir:

git apply 0001-dnsmasq-manage-resolv.conf-iff-when-listening-on-127-lede-17.01.2.patch

For those that also want to test the accompanying unbound patch on LEDE 17.01, see the attached patch file adapted for 17.01(.2).
In the feeds/packages dir:

git apply 0001-unbound-manage-resolv.conf-iff-when-listening-on-127-17.01.patch

Good luck,
Paul

> Op 19 jun. 2017, om 21:08 heeft Ben Pfountz <netprince at vt.edu> het volgende geschreven:
> 
> I tested this patch with a standard install, as well as with noresolv=1 and 2 servers configured with opendns, and it worked fine. /etc/resolv.conf still correctly listed 127.0.0.1 and ::1 as the local nameserver.
> 
> Ben
> 
> On 6/19/2017 6:16 AM, Paul Oranje wrote:
>> this patch has been resend with corrected title (not "if", but "iff")
>> sorry for the spamming
>>> Op 18 jun. 2017, om 09:46 heeft Paul Oranje <por at xs4all.nl> het volgende geschreven:
>>> 
>>> With this patch the dnsmasq init script manages resolv.conf if and only if
>>> when dnsmasq will listen on 127.0.0.1#53 (is main resolver instance).
>>> Also adds ::1 to the resolver file.
>>> 
>>> For unbound a likewise patch exists (PR#4454).
>>> Fixes (combined with the unbound PR) FS#785
>>> 
>>> Signed-off-by: Paul Oranje <por at xs4all.nl>
>>> ---
>>> The intended invariant is that resolv.conf is managed whenever a resolver
>>> listens on 127.0.0.1#53. Besides dnsmasq, unbound can take that role as well
>>> (but only when dnsmasq is not already listens on 127.0.0.1#53).
>>> When no instance of dnsmasq has been configured to listen on 127.0.0.1#53 then
>>> resolv.conf is not touched by dnsmasq.
>>> 
>>> Currently unbound handles resolv.conf also, but leaves it to dnsmasq whenever
>>> that will run, even when no dnsmasq instance will listen on localhost:53. So
>>> for unbound PR#4454  has been submitted to make sure it always manages
>>> resov.conf when it owns localhost:domain.
>>> 
>>> 
>>> Tests performed:
>>> 
>>> - with/without unbound, dhcp linkages none and dnsmasq
>>> - dnsmasq listens on #53, not #53 (dnsmasq takes precedence when also on #53)
>>> - listen on localhost, not localhost
>>> - noresolv false and true
>>> - one/multiple dnsmasq instances (useless combinations are omitted in testing)
>>> 
>>> single dnsmasq instance
>>>    standard setup
>>> ==> dnsmasq manages resolv.conf
>>> 
>>> two dnsmasq instances, each serving another LAN
>>>    both dnsmasq on #53
>>>    dnsmasq-2 notinterface loopback
>>> ==> dnsmasq-1 manages resolv.conf
>>> 
>>> two dnsmasq unstances and unbound (dhcp_link: none, one dnsmasq behind ubound)
>>>    both dnsmasq on #53
>>>    dnsmasq-2 on #53, notinterface loopback
>>>        noresolv true and server 127.0.0.1#1053
>>>    unbound on #1053
>>> ==> dnsmasq-1 manages resolv.conf
>>> 
>>> two dnsmasq instances and unbound (dhcp_link: dnsmasq)
>>>    dnsmasq-1 on #1053, noresolv true
>>>    dnsmasq-2 on #2053, noresolv true
>>>    unbound on #53
>>>        forward LAN1 to 127.0.0.1#1053, forward LAN2 to 127.0.0.1#2053
>>> ==> unbound manages resolv.conf
>>> 
>>> on init stops resolv.conf is reset to the auto resolvfile.
>>> 
>>> 
>>> History:
>>> v1 -> v2        corrected synxtax error
>>> 		increased PKG_RELEASE
>>> v2		reverted with commit 8180bbac7c237a31bd6e06c63e342c72342b7303
>>> v3		corected errors, setup/teardown routines and thoroughly tested
>>> 
>>> Paul
>>> 
>>> 
>>> package/network/services/dnsmasq/Makefile          |  2 +-
>>> .../network/services/dnsmasq/files/dnsmasq.init    | 79 +++++++++++++++-------
>>> 2 files changed, 55 insertions(+), 26 deletions(-)
>>> 
>>> diff --git a/package/network/services/dnsmasq/Makefile b/package/network/services/dnsmasq/Makefile
>>> index f9ab13aef0..35ac6b2891 100644
>>> --- a/package/network/services/dnsmasq/Makefile
>>> +++ b/package/network/services/dnsmasq/Makefile
>>> @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
>>> 
>>> PKG_NAME:=dnsmasq
>>> PKG_VERSION:=2.77
>>> -PKG_RELEASE:=3
>>> +PKG_RELEASE:=4
>>> 
>>> PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
>>> PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq/
>>> diff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init
>>> index d5177ecb0c..2a4d7b2239 100644
>>> --- a/package/network/services/dnsmasq/files/dnsmasq.init
>>> +++ b/package/network/services/dnsmasq/files/dnsmasq.init
>>> @@ -707,9 +707,51 @@ dhcp_relay_add() {
>>> 	fi
>>> }
>>> 
>>> +_resolv_setup()
>>> +{
>>> +	local cfg="$1"
>>> +	local port notinterfaces
>>> +
>>> +	config_get port "$cfg" port "53"
>>> +	[ $port = "53" ] || return
>>> +
>>> +	config_get notinterfaces "$cfg" notinterface ""
>>> +	[ -n "$notinterfaces" ] && list_contains notinterfaces "loopback" && return
>>> +
>>> +	# dnsmasq instance is designated to listen on 127.0.0.1#53.
>>> +	# rewrite /tmp/resolv.conf
>>> +	rm -f /tmp/resolv.conf
>>> +	{
>>> +		echo "# /tmp/resolv.conf generated by dnsmasq $cfg $( date )"
>>> +		[ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {
>>> +			echo "search $DOMAIN"
>>> +		}
>>> +		DNS_SERVERS="$DNS_SERVERS 127.0.0.1 ::1"
>>> +		for DNS_SERVER in $DNS_SERVERS ; do
>>> +			echo "nameserver $DNS_SERVER"
>>> +		done
>>> +	} > /tmp/resolv.conf
>>> +
>>> +	return
>>> +}
>>> +
>>> +_resolv_teardown()
>>> +{
>>> +	cfg="$1"
>>> +
>>> +	case $( cat /tmp/resolv.conf ) in
>>> +	*"generated by dnsmasq $cfg"*)
>>> +		# resolv.conf was written by this instance,
>>> +		# reset /tmp/resolv.conf to default.
>>> +		[ -f /tmp/resolv.conf ] && rm -f /tmp/resolv.conf
>>> +		ln -s /tmp/resolv.conf.auto /tmp/resolv.conf
>>> +		;;
>>> +	esac
>>> +}
>>> +
>>> dnsmasq_start()
>>> {
>>> -	local cfg="$1" disabled resolvfile user_dhcpscript
>>> +	local cfg="$1" disabled noresolv resolvfile user_dhcpscript
>>> 
>>> 	config_get_bool disabled "$cfg" disabled 0
>>> 	[ "$disabled" -gt 0 ] && return 0
>>> @@ -785,7 +827,6 @@ dnsmasq_start()
>>> 	append_bool "$cfg" nonegcache "--no-negcache"
>>> 	append_bool "$cfg" strictorder "--strict-order"
>>> 	append_bool "$cfg" logqueries "--log-queries=extra"
>>> -	append_bool "$cfg" noresolv "--no-resolv"
>>> 	append_bool "$cfg" localise_queries "--localise-queries"
>>> 	append_bool "$cfg" readethers "--read-ethers"
>>> 	append_bool "$cfg" dbus "--enable-dbus"
>>> @@ -854,14 +895,15 @@ dnsmasq_start()
>>> 	config_get_bool cachelocal "$cfg" cachelocal 1
>>> 
>>> 	config_get_bool noresolv "$cfg" noresolv 0
>>> -	if [ "$noresolv" != "1" ]; then
>>> +	if [ "$noresolv" = "1" ]; then
>>> +		xappend "--no-resolv"
>>> +	else
>>> 		config_get resolvfile "$cfg" resolvfile "/tmp/resolv.conf.auto"
>>> +		xappend "--resolv-file=$resolvfile"
>>> 		# So jail doesn't complain if file missing
>>> -		[ -n "$resolvfile" -a \! -e "$resolvfile" ] && touch "$resolvfile"
>>> +		[ -e "$resolvfile" ] && touch "$resolvfile"
>>> 	fi
>>> 
>>> -	[ -n "$resolvfile" ] && xappend "--resolv-file=$resolvfile"
>>> -
>>> 	config_get hostsfile "$cfg" dhcphostsfile
>>> 	[ -e "$hostsfile" ] && xappend "--dhcp-hostsfile=$hostsfile"
>>> 
>>> @@ -973,16 +1015,6 @@ dnsmasq_start()
>>> 	echo >> $CONFIGFILE_TMP
>>> 	mv -f $CONFIGFILE_TMP $CONFIGFILE
>>> 
>>> -	[ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
>>> -		rm -f /tmp/resolv.conf
>>> -		[ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {
>>> -			echo "search $DOMAIN" >> /tmp/resolv.conf
>>> -		}
>>> -		DNS_SERVERS="$DNS_SERVERS 127.0.0.1"
>>> -		for DNS_SERVER in $DNS_SERVERS ; do
>>> -			echo "nameserver $DNS_SERVER" >> /tmp/resolv.conf
>>> -		done
>>> -	}
>>> 
>>> 	procd_open_instance $cfg
>>> 	procd_set_param command $PROG -C $CONFIGFILE -k -x /var/run/dnsmasq/dnsmasq."${cfg}".pid
>>> @@ -1000,21 +1032,18 @@ dnsmasq_start()
>>> 	procd_add_jail_mount_rw /var/run/dnsmasq/ $leasefile
>>> 
>>> 	procd_close_instance
>>> +
>>> +
>>> +	# rewrite /tmp/resolv.conf only for main instance
>>> +	_resolv_setup $cfg
>>> }
>>> 
>>> dnsmasq_stop()
>>> {
>>> 	local cfg="$1"
>>> 
>>> -	config_get resolvfile "$cfg" "resolvfile"
>>> -
>>> -	#relink /tmp/resolve.conf only for main instance
>>> -	[ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
>>> -		[ -f /tmp/resolv.conf ] && {
>>> -			rm -f /tmp/resolv.conf
>>> -			ln -s "$resolvfile" /tmp/resolv.conf
>>> -		}
>>> -	}
>>> +	#relink /tmp/resolv.conf only for main instance
>>> +	_resolv_teardown $cfg
>>> 
>>> 	rm -f ${BASEDHCPSTAMPFILE}.${cfg}.*.dhcp
>>> }
>>> -- 
>>> 2.13.1
>>> 
>>> 
>>> _______________________________________________
>>> Lede-dev mailing list
>>> Lede-dev at lists.infradead.org
>>> http://lists.infradead.org/mailman/listinfo/lede-dev
>> _______________________________________________
>> Lede-dev mailing list
>> Lede-dev at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/lede-dev
> 
> _______________________________________________
> Lede-dev mailing list
> Lede-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/lede-dev

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-dnsmasq-manage-resolv.conf-iff-when-listening-on-127-lede-17.01.2.patch
Type: application/octet-stream
Size: 5030 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/lede-dev/attachments/20170620/f81cb9cf/attachment-0002.obj>
-------------- next part --------------

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-unbound-manage-resolv.conf-iff-when-listening-on-127-17.01.patch
Type: application/octet-stream
Size: 5763 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/lede-dev/attachments/20170620/f81cb9cf/attachment-0003.obj>


More information about the Lede-dev mailing list