![应用程序在其网络命名空间之外使用 DNS 吗?](https://linux22.com/image/223944/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%9C%A8%E5%85%B6%E7%BD%91%E7%BB%9C%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E4%B9%8B%E5%A4%96%E4%BD%BF%E7%94%A8%20DNS%20%E5%90%97%EF%BC%9F.png)
我正在使用 unshare 创建网络命名空间:
unshare -rn bash
我已经有了 veth 接口的工作设置,如本指南中所述:
https://josephmuia.ca/2018-05-16-net-namespaces-veth-nat/
或者在这个脚本中:https://gist.github.com/dpino/6c0dca1742093346461e11aa8f608a99
用于互联网连接。我还禁用了 veth 设备的 IPv6。我使用 nftables 将所有传出 DNS 流量发送到我的 dns-proxy。
/usr/sbin/nft add table nat
/usr/sbin/nft add chain nat output "{ type nat hook output priority filter; policy accept;}"
/usr/sbin/nft add rule nat output udp dport 53 dnat 10.200.1.1:53
我尝试过dig example.com
,它按照我的意愿发送到我的 dns 代理,并且 ping 工作正常。
接下来我创建一个用户和 PID 命名空间
unshare -pf --mount-proc --map-user=1000 --map-group=1000
在网络命名空间内部,我还确认ip a
我仍然在网络命名空间中,并且dig example.com
返回时与以前一样。现在,当我启动像 vs code 这样的应用程序时,我注意到 dns 流量显示在主机 eth 设备上,但没有显示在 veth 设备上。而且它不会转发到我的 DNS 代理。至于为什么会发生这种情况,我不清楚,因为只有与 DNS 相关的流量不通过 veth 设备。我还尝试更改/etc/resolv.conf
网络命名空间内部,但这没有改变任何内容,我想提一下 resolv.conf 是由 NetworkManager 生成的。