]> git.ipfire.org Git - ipfire-2.x.git/commitdiff
firewall: always allow outgoing DNS traffic to root servers
authorpeter.mueller@ipfire.org <peter.mueller@ipfire.org>
Tue, 1 Oct 2019 15:22:00 +0000 (15:22 +0000)
committerArne Fitzenreiter <arne_f@ipfire.org>
Tue, 8 Oct 2019 18:48:40 +0000 (18:48 +0000)
Allowing outgoing DNS traffic (destination port 53, both TCP
and UDP) to the root servers is BCP for some reasons. First,
RFC 5011 assumes resolvers are able to fetch new trust ancors
from the root servers for a certain time period in order to
do key rollovers.

Second, Unbound shows some side effects if it cannot do trust
anchor signaling (see RFC 8145) or fetch the current trust anchor,
resulting in SERVFAILs for arbitrary requests a few minutes.

There is little security implication of allowing DNS traffic
to the root servers: An attacker might abuse this for exfiltrating
data via DNS queries, but is unable to infiltrate data unless
he gains control over at least one root server instance. If
there is no firewall ruleset in place which prohibits any other
DNS traffic than to chosen DNS servers, this patch will not
have security implications at all.

The second version of this patch does not use unnecessary xargs-
call nor changes anything else not related to this issue.

Fixes #12183

Cc: Michael Tremer <michael.tremer@ipfire.org>
Suggested-by: Horace Michael <horace.michael@gmx.com>
Signed-off-by: Peter Müller <peter.mueller@ipfire.org>
Acked-by: Michael Tremer <michael.tremer@ipfire.org>
Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
config/rootfiles/core/137/filelists/files
src/initscripts/system/firewall

index 3a2a10a20e3dca378b9adc4060b89833a1fbdaf0..b8ee805497df4c52df0509125c6da00905994059 100644 (file)
@@ -1,8 +1,9 @@
 etc/system-release
 etc/issue
 srv/web/ipfire/cgi-bin/credits.cgi
-usr/lib/firewall/rules.pl
-usr/sbin/firewall-policy
 var/ipfire/langs
 etc/logrotate.conf
+etc/rc.d/init.d/firewall
 srv/web/ipfire/cgi-bin/ovpnmain.cgi
+usr/lib/firewall/rules.pl
+usr/sbin/firewall-policy
index ec396c708c8e6b03396b0033ce2649fb61dec09b..602bd6c5b4ae8df8a68350fe6c1e79955db0189e 100644 (file)
@@ -6,6 +6,7 @@
 eval $(/usr/local/bin/readhash /var/ipfire/ppp/settings)
 eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings)
 eval $(/usr/local/bin/readhash /var/ipfire/optionsfw/settings)
+ROOTHINTS="/etc/unbound/root.hints"
 IFACE=`/bin/cat /var/ipfire/red/iface 2> /dev/null | /usr/bin/tr -d '\012'`
 
 if [ -f /var/ipfire/red/device ]; then
@@ -307,6 +308,17 @@ iptables_init() {
        iptables -A INPUT -j TOR_INPUT
        iptables -N TOR_OUTPUT
        iptables -A OUTPUT -j TOR_OUTPUT
+
+       # Allow outgoing DNS traffic (TCP and UDP) to DNS root servers
+       local rootserverips="$( awk '/\s+A\s+/ { print $4 }' ${ROOTHINTS} )"
+       ipset -N root-servers iphash
+
+       for ip in "${rootserverips[@]}"; do
+               ipset add root-servers $ip
+       done
+
+       iptables -A OUTPUT -m set --match-set root-servers dst -p tcp --dport 53 -j ACCEPT
+       iptables -A OUTPUT -m set --match-set root-servers dst -p udp --dport 53 -j ACCEPT
        
        # Jump into the actual firewall ruleset.
        iptables -N INPUTFW