当我清除IPtables 然后添加以下规则时,传入连接可以毫无问题地连接到端口1234上的KVM VM。
-A PREROUTING -i br0 -p tcp -m tcp --dport 1234 -j DNAT --to-destination 192.168.122.194:1234
-A FORWARD -d 192.168.122.194/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 1234 -j ACCEPT
-A FORWARD -s 192.168.122.194/32 -p tcp -m tcp --sport 1234 -j ACCEPT
-A FORWARD -d 192.168.122.194/32 -p tcp -m tcp --dport 1234 -j ACCEPT
但我还希望NAT能够在我的KVM VM中运行。默认情况下,libvirt会设置一些规则,为我的VM提供NAT。但是当我尝试将SIGHUP发送到libvirt时(这就是你要求它将它的规则添加到iptables中),它将以下规则添加到iptables中,这违反了我上面指定的端口转发。
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
我已尝试手动运行这些命令。我可以运行所有FORWARD和OUTPUT命令,它们不会破坏我的端口转发。但是,我无法手动运行任何POSTROUTING命令。我收到一条错误说:"没有链/目标/匹配该名称。"
*上面灰色部分中的这些libvirt iptables规则是通过运行iptables-save并确认端口转发正常工作,然后将SIGHUP发送到libvirt,确认端口转发被破坏,然后再次运行iptables-save并运行差异来获得的在两个输出上找到libvirt添加了哪些新的iptables规则。
答案 0 :(得分:0)
我刚用自己的规则启用了NAT。我没有打扰任何默认的libvirt规则。
添加NAT就像3 iptables命令一样简单。 (其中br0是面向互联网的适配器(可能是ppp0或其他))
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
iptables -A FORWARD -i br0 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i virbr0 -o br0 -j ACCEPT
答案 1 :(得分:-1)
问题很老,但正确的答案是你应该使用libvirt的工具来设置你的iptables规则: https://libvirt.org/firewall.html