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)
对我来说,基于 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)
归档时间: |
|
查看次数: |
8020 次 |
最近记录: |