iptables 伪装破坏 DNS 查找

Bil*_*ker 9 linux dns iptables

我正在本地生成的流量上使用 IP 伪装进行测试,但它似乎破坏了 DNS 查找。其他一切都工作正常——所有没有 DNS 查询的 IP 流量都可以工作。

$ iptables -t mangle -A OUTPUT -j MARK --set-mark 2
$ iptables -t nat -A POSTROUTING -m mark --mark 0x2 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

为什么这适用于除 DNS 查询之外的所有 IP 流量?

请求命令的结果如下:

# 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
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,systemd 充当 127.0.0.53 上的 DNS 服务器。


systemctl status systemd-resolved正在报告“systemd-resolved[3315]:在意外的 IP 范围内收到数据包,拒绝。” 启用这两个命令后。


我相信这个问题可能是相关的。

这两个链接的相关部分是:

所有对 127.0.0.53:53 的查询都不是来自 127.0.0.0/8,而是来自由于伪装而具有默认路由的接口,并且 systemd-resolved 拒绝所有这些请求

systemd-resolved[21366]:在意外的 IP 范围内收到数据包,拒绝。

systemd-resolved需要付出额外的努力来验证存根解析器源/目标地址,因此 MASQUERADE 规则打破了这些假设:

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;
        }
Run Code Online (Sandbox Code Playgroud)

小智 6

这对我来说效果很好。只需排除本地接口,nslookup 就可以正常工作。

sudo iptables ! -o lo -t nat -A POSTROUTING -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)


Bil*_*ker 1

对我来说,基于 systemd 解析行为的解决方案是实现如下规则:

$ 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
Run Code Online (Sandbox Code Playgroud)