iptables,转发主机本身不活跃的 ip 流量

iptables,转发主机本身不活跃的 ip 流量

我有 kvm guest,其网卡使用 tap 设备连接到主机。tap 设备与 eth0 一起构成主机上的桥接器的一部分,因此它可以访问公共网络。到目前为止一切正常,guest 可以访问公共网络,也可以从公共网络访问它。

现在,主机上的 kvm 进程为客户机提供了一个 vnc 服务器,该服务器在主机上侦听 127.0.0.1:5901。有没有办法让此 vnc 服务器可以通过客户机正在使用的 ip 地址(例如 192.168.0.249)访问,而不会中断客户机使用相同的 ip(客户机不使用端口 5901)?当客户机根本不使用任何 ip 地址时,它也应该可以工作。所以基本上我只想假装 IP xx 在主机上,并且只将到端口 5901 的流量应答/转发到主机本身。

我尝试在主机上使用此 NAT 规则,但不起作用。主机上已启用 IP 转发。

iptables -t nat -A PREROUTING -p tcp --dst 192.168.0.249 --dport 5901 -j DNAT --to-destination 127.0.0.1:5901

我认为这是因为 IP 192.168.0.249 没有绑定到任何接口,因此没有针对它的 ARP 请求得到答复,因此没有针对此 IP 的数据包到达主机。如何让它工作?:)

答案1

您的 iptables 规则是正确的,但由于您的主机充当桥梁而不是路由器,因此您的客户的数据包永远不会到达 IP 层,而 iptables 正是在此运行。

幸运的是,Linux 在以太网层有一个与 iptables 相当的程序,称为ebtables。使用 ebtables,你可以编写以下规则:

ebtables -t nat -A PREROUTING -p ipv4 --ip-protocol tcp --ip-dst 192.168.0.249 --ip-destination-port 5901 -j redirect

此规则将匹配发往该地址/端口的任何 IP 数据包并“重定向”它,这意味着将其 MAC 地址重写为与它到达的桥接设备相同。这将导致数据包最终进入您的 IP 层,此时您可以使用 iptables 对目标 IP 地址进行 DNAT(就像您当前所做的那样)。

大多数发行版的内核都支持 ebtables。您可能需要安装一个包(Debian 和 Ubuntu 中为“ebtables”)以获取 ebtables 用户空间程序。

相关内容