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
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;
}
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