通过 iptables 和虚拟接口进行 NAT

通过 iptables 和虚拟接口进行 NAT

我正在尝试实现以下场景:一个 VM 主机,多个客户虚拟机,每个人都有自己的自己的 IP 地址(和域)。

我们的服务器只有一个物理接口,因此预期用途是添加eth0 上的虚拟接口。为了使我们的情况复杂化,提供商使用端口安全在他们的交换机上,所以我无法在桥接模式下运行客户接口,因为交换机会检测到“欺骗的”MAC 地址并终止接口(永久性地迫使我打电话给支持人员,我相信第三次他们会有些生气;))。

我的第一个猜测是使用 iptables 和 NAT 将所有包从一个虚拟接口转发到另一个虚拟接口,但 iptables 似乎不喜欢虚拟接口(至少我无法让它正常工作)。所以我的第二个猜测是将包的源 IP 用于公共接口。

我们假设 libvirt 创建了一个 virbr0 网络,其 IP 地址为 192.168.100.0/24,并且客户机使用 192.168.100.2 作为 IP 地址。

这是我尝试使用的: iptables -t nat -I PREROUTING --src public_ip_on_eth0:0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:80

这也没有给我预期的结果(访问服务器超时)。

有没有办法完成我想做的事情,甚至将所有流量路由到虚拟机设备虚拟接口上的某个 IP?

答案1

要像这样使用 DNAT,您需要您的客户系统将 VM-host 作为默认网关。

答案2

我有一个类似的网络配置,并使用了这个配置:

localnetwork (192.168.0.0/24) <-> host eth0 (192.168.0.10)

host tun0 (192.168.1.150) <-> vm1 eth0 (192.168.1.200) gw 192.168.1.150
                          <-> vm2 eth0 (192.168.1.201) gw 192.168.1.150

我的所有虚拟机都可以互相 ping 通,并可以通过以下 iptable 规则访问外部网络:

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.1.0/24       0.0.0.0/0            to:192.168.0.10

外部网络可以根据以下规则访问我的虚拟机上的服务:

Chain PREROUTING (policy ACCEPT)
target  prot opt source     destination         
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:22200 to:192.168.1.200:22
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:22201 to:192.168.1.201:22
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:3389  to:192.168.1.202:3389
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:443   to:192.168.1.206:443
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:80    to:192.168.1.206:80

我在 debian 上的文件 /etc/network/interfaces 中使用以下行配置了 tun0 接口:

auto tun0
iface tun0 inet static
  address 192.168.1.150
  netmask 255.255.255.0
  pre-up tunctl -g uml-net -t tun0
  post-down tunctl -d tun0

答案3

答案是克里斯托夫·德雷维特杜克狮我能够使所需的配置工作。

我将自己回答并解释我的解决方案。请随意对此发表评论,因为我已经有几年没有做过网络工作了,很可能在这里遗漏了一些非常重要的东西。

下面的配置运行完美,并允许添加更多虚拟机,每个虚拟机使用不同的公共 IP 地址(这里使用的 172.16.0.0 中的 IP 是“公共”的)。


网络接口

VM-Host, eth0        -> 172.16.0.1
VM-Host, eth0:0      -> 172.16.0.2
VM-Host, br0         -> 192.168.10.1
Virt. machine, eth0  -> 192.168.10.2 (added to br0)
                        gateway: 172.16.0.2

iptables

连接跟踪:

iptables -I FORWARD -m conntrack -d 192.168.10.0/24 --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

我们虚拟机上的 Web 服务器的 DNAT:

iptables -t nat -A PREROUTING -p tcp -d 172.16.0.2 --dport 80 -j DNAT --to-destination 192.168.10.2:80

我们的虚拟机通过 SNAT 访问外界:

iptables -t nat -I POSTROUTING -j SNAT --src 192.168.10.2 --to-source 172.16.0.2

阻止虚拟机上的所有其他端口:

iptables -A INPUT -d 172.16.0.2 -j REJECT --reject-with icmp-port-unreachable

相关内容