我正在尝试将端口 53 从主机转发到 virtbr0 接口(使用 NAT)上的一个 KVM 虚拟机客户机。
客户虚拟机将运行自定义 DNS 服务器。但是,在端口转发端口 53 之后,DNS 将无法在客户机中解析。我只是不断收到以下错误Temporary failure in name resolution
如果我从主机中删除 iptables 规则,DNS 会在客户虚拟机中再次解析。需要做什么才能使 DNS 在客户机中工作,同时允许端口 53 从主机转发到客户机?
我在钩子脚本中使用的IP表规则:
/sbin/iptables -I FORWARD -o virbr0 -d 192.168.122.5 -j ACCEPT
/sbin/iptables -t nat -I PREROUTING -p tcp --dport 53 -j DNAT --to 192.168.122.5:53
/sbin/iptables -t nat -I PREROUTING -p udp --dport 53 -j DNAT --to 192.168.122.5:53
有人知道吗?以同样的方式转发的其他端口似乎可以正常工作。但是 DNS 不行,我不知道为什么。我的家庭网络路由器上转发了端口 53,但没有出现此问题。也许是 KVM 错误?我正在运行 CentOS 8,并安装了最新版本的 qemu 和 kvm。
答案1
您的 DNAT 规则过于笼统。它们试图转发全部DNS 流量到您的虚拟机,而不仅仅是应该适用于来自外部的 DNS 流量。因此,当您的客户 DNS 服务器发送自己的 DNS 查询时,它们会被重定向回自身。
为了解决这个问题,还需要指定从网络传入的 DNS 流量的接口,或者要排除的接口。
/sbin/iptables -t nat -I PREROUTING -i enp4s0 -p udp --dport 53 -j DNAT --to 192.168.122.5:53
或者
/sbin/iptables -t nat -I PREROUTING \! -i virbr0 -p udp --dport 53 -j DNAT --to 192.168.122.5:53