由于这个原因,我想用 lxc/virsh 虚拟化我的网络服务器,我想将 IP 传递给 lxc 容器。但我的IP来自不同的子网,我尝试过(但没有成功):
维什网络:
<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
IP 1:xxx.xxx.184.96(专用服务器IP)
xxx.xxx.37.220(对于 LXC)
/etc/网络/接口:
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address xxx.xxx.184.96
netmask 255.255.255.128
network xxx.xxx.184.0
broadcast xxx.xxx.184.127
gateway xxx.xxx.184.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 8.8.8.8 8.8.4.4
iface br0 inet static
bridge_ports eth0
bridge_stp on
address xxx.xxx.37.220
netmask 255.255.255.255
答案1
您不能使用桥接接口在子网之间转发流量。网桥用于连接两个第 2 层网络,而不是 2 个子网(它们是第 3 层)。您必须在网络之间路由流量。
好吧,从技术上讲,您可以桥接它们,但这需要您向两个子网上的每个主机添加路由规则,让它们知道它们可以直接与另一个子网通信。这非常麻烦,我怀疑这不是你想要做的。
因此,路由流量。基本上,您必须将虚拟机管理程序盒变成一个小型路由器。您必须告诉它,任何到某些端口的传入流量都应该转发到您的虚拟化实例。然后,当虚拟化实例回复时,您的虚拟机管理程序框会修改流量,使其看起来像是来自其自身的流量。这是通过 DNAT 完成的。
iptables -t nat -I PREROUTING -i eth0 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 172.0.0.2
该规则表示接收传入eth0
TCP 端口 80 和 443 的任何流量并将其转发到172.0.0.2
(更改172.0.0.2
为虚拟 Web 服务器的 IP)。
现在您需要保存此规则,以便在重新启动系统时它会恢复。这部分会有所不同。 Ubuntu 中有一个iptables-persistent
包可以让你这样做/etc/init.d/iptables-persistent save
。但如果您使用其他东西来管理防火墙,则需要使用它。