Iptables masquerade quebra pesquisas de dns

1

Estou testando algo com o disfarce de IP no tráfego gerado localmente, mas parece estar interrompendo as pesquisas de DNS. Tudo o resto funciona bem - todo o tráfego IP sem consultas DNS funciona.

$ iptables -t mangle -A OUTPUT -j MARK --set-mark 2
$ iptables -t nat -A POSTROUTING -m mark --mark 0x2 -j MASQUERADE

Por que isso funciona com todo o tráfego IP, exceto as consultas DNS?

Resultados dos comandos solicitados abaixo:

# ip address

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 54:21:c6:28:99:1f brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether c1:b2:a1:55:34:d2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.108/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp3s0
       valid_lft 242078sec preferred_lft 242078sec
    inet6 fe80::1dd6:f094:be8d:ef51/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
# ip route

default via 192.168.1.1 dev wlp3s0 proto dhcp metric 600 
169.254.0.0/16 dev wlp3s0 scope link metric 1000 
192.168.1.0/24 dev wlp3s0 proto kernel scope link src 192.168.1.108 metric 600

Em uma reviravolta surpresa, o systemd está agindo como um servidor DNS em 127.0.0.53.

systemctl status systemd-resolved está relatando "systemd-resolved [3315]: obteve um pacote em um intervalo de IP inesperado, recusando." depois de ativar os dois comandos.

Eu acredito que esse problema pode estar relacionado.

As partes relevantes desses dois links são:

all queries to 127.0.0.53:53 goes not from 127.0.0.0/8, but from interface with default route due to masquerading, and systemd-resolved rejects all of these requests with

systemd-resolved[21366]: Got packet on unexpected IP range, refusing.

systemd-resolved vai para o esforço extra de validar os endereços de origem / destino do resolvedor de stub e, portanto, a regra de MASQUERADE quebra essas suposições:

if (in_addr_is_localhost(p->family, &p->sender) <= 0 ||
            in_addr_is_localhost(p->family, &p->destination) <= 0) {
                log_error("Got packet on unexpected IP range, refusing.");
                dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
                goto fail;
        }
    
por Bill Zucker 31.08.2018 / 21:06

1 resposta

1

A solução para mim com base no comportamento resolvido pelo systemd foi implementar as regras como esta:

$ iptables -t mangle -A OUTPUT ! -s 127.0.0.1 -j MARK --set-mark 2
$ iptables -t nat -A POSTROUTING -m mark --mark 0x2 -j MASQUERADE
    
por 01.09.2018 / 17:26