我的本地网络 shcema 是这样的:
internet (WAN)
|
router host IP (resolv.conf)
| |
+------- eth0 - br0 - tap0 - VM (resolv.conf)
| |
localnet localhost (dnsmasq)
(.home)
我的主机主要用于测试虚拟机。目标是让虚拟机只能看到本地网络,而不是从 WAN 获取 DNS,而是从dnsmasq
配置为侦听主机lo
接口并仅了解本地网络中的主机的 DNS 获取:pc1.home
pc2.home
www.home
data.home
printer.home
...
我成功地将 dnsmasq 配置为在tcp/udp 127.0.0.1:53
主机上侦听,并通过从主机 cli 获取答案来检查它:
# dig www.google.com ... 142.251.36.68 (ANSWER 1)
和
# dig @127.0.0.1 www.google.com ... (ANSWER 0)
# dig @127.0.0.1 www.home ... 192.168.1.2 (ANSWER 1)
我以各种方式设置 ip_forwarding
# echo "1" > /proc/sys/net/ip4/conf/all/forwarding
# echo "1" > /proc/sys/net/ipv4/conf/tap0/route_localnet
然后我尝试编写 iptables 规则:
# iptables -t nat -A PREROUTING -i tap0 -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53
# iptables -t nat -A PREROUTING -i tap0 -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53
随后检查
# iptables -v -t nat -L
pkts bytes target prot opt in out source destination
0 0 DNAT udp -- tap0 any anywhere anywhere udp dpt:domain to:127.0.0.1:53
0 0 DNAT tcp -- tap0 any anywhere anywhere tcp dpt:domain to:127.0.0.1:53
但是在运行我的虚拟 Linux 时,DNS 仍然由 中列出的路由器名称服务器应答/etc/resolv.conf
。
好吧,你可以建议我手动重写resolv.conf
虚拟机的配置,但是当我测试许多虚拟机的安装时,每次都这样做很烦人,而且很难说在那里写什么,因为dnsmasq在本地主机上监听主机的。因此 VM 的内容resolv.conf
如下
nameserver 127.0.0.1
可能会非常混乱且无用。我尝试使用 Wireshark 捕获一些数据包,但它只是显示没有发生重定向,但没有显示原因。