我正在尝试实现以下场景:一个 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