为什么使用路由模式

lxc默认使用的是桥模式,这也是我在家里和公司里部署的模式。在这种模式下,lxc虚拟机可以直接和真实网络中的机器互相访问,就如同一台真的机器一样。路由模式则没有这个便利性。

但是桥模式有个缺陷,必须能够做出桥来。我们有做不出桥来的时候么?有,如果你用笔记本,大部分AP会拒绝第二个MAC地址的包。导致网桥可以组建,却永远无法正常使用。

第一种路由模式,双重NAT简版

双重NAT可以用于几乎所有场景,并且不会带来后遗症。然而,双重NAT的问题在于,物理网络不能直接访问虚拟机。对于很多设备来说,这就失去了价值。另外说一点,之所以叫做双重NAT,是因为多数时候物理网络接到外网还需要一次NAT。

lxc的双重NAT可以视为两步,建立NAT连接的虚拟网络,将lxc连接到虚拟网络。

第一步比较复杂,我们先从br0的建立开始说起。首先,你需要为虚拟网络分配一个不同的保留内网网段。如果使用同样的内网网段,在ARP查询的时候会从一个端口发出超过一个的MAC回应,这就退回了桥模式。

然后我们需要建立一个br0网桥作为配置的起点,对这个网桥赋予IP,配置路由和防火墙,并启动dnsmasq以便于dhcp和dns。这个模式之所以叫做简版,是因为我们先不讨论dnsmasq。

假如你的lxc内网网段是192.168.66.0/24,那么你大致可以如下配置:

brctl addbr br0
ifconfig br0 192.168.66.1
route add -net 192.168.66.0/24 dev br0
iptables -A INPUT -s 192.168.66.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -j MASQUERADE

实际上,对于任何一种网口设备,将其配置为NAT的过程都是一样的。

第二步非常容易,在lxc的config文件内,指定网桥为br0就OK了。当然,作为略去dnsmasq的代价,你需要手工配置每台机器的IP地址和DNS服务器。

第二种路由模式,双重NAT

双重NAT的完整版需要在内网网口上启动dns,作为dns缓存代理和dhcp服务器。其余和第一种模式没有区别,只是你不需要手工指定IP和DNS服务器了。

当然,其实任何一种网口的NAT配置都是一样的。

第三种路由模式,双边交互路由

第三种路由模式的效果最好,虚拟机和真实机可以互相访问。但是这种模式需要能够修改物理网络网关的路由表。这种模式使用主机作为路由器,中转真实网络和虚拟网络。

我略去如何创造br以及如何将lxc连接到上面,这些前面有叙述。下面我简述一下双边路由最关键的几点。

  1. 最重要的重点,就是在真实网络的网关上,将你的真实物理机在外网的IP,配置为虚拟网络的下一跳网关。例如,对于上面的例子,我们应当在网关上如此配置。

    route add -net 192.168.66.0/24 gw 192.168.1.4

如果不进行如此配置,物理网络所发出的包在到达网关后就不知道应当如何转发了。

  1. 在物理机上允许双边网络的所有包透过。你的包当然不能被防火墙挡掉。
  2. 虚拟网络的dhcp是不会传递到外网的,因此如果打算使用dhcp,还是需要开dnsmasq。