如何配置从主机系统到虚拟机的路由?

如何配置从主机系统到虚拟机的路由?

我有一个 Ubuntu 主机系统,它在 eth0 接口上运行 MAC-VLAN 虚拟接口,启用了 ipv4 路由。此外,该系统还运行了一个 Docker (LXC) 容器:

docker0   Link encap:Ethernet  HWaddr d6:00:77:0f:ab:9e  
      inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::d8be:a9ff:fe59:eba6/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:142270 errors:0 dropped:0 overruns:0 frame:0
      TX packets:288893 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:6599880 (6.5 MB)  TX bytes:429869675 (429.8 MB)

eth0      Link encap:Ethernet  HWaddr 00:1e:c9:4d:15:bc  
      inet addr:10.0.1.206  Bcast:10.0.1.255  Mask:255.255.255.0
      inet6 addr: fe80::21e:c9ff:fe4d:15bc/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:498286 errors:0 dropped:0 overruns:0 frame:0
      TX packets:178679 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:571255676 (571.2 MB)  TX bytes:16081465 (16.0 MB)

macvlan0  Link encap:Ethernet  HWaddr 1a:11:5e:36:a0:16  
      inet addr:10.0.1.86  Bcast:10.0.1.255  Mask:255.255.255.0
      inet6 addr: fe80::1811:5eff:fe36:a016/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:85887 errors:0 dropped:0 overruns:0 frame:0
      TX packets:103 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:5623532 (5.6 MB)  TX bytes:33642 (33.6 KB)

Docker 容器有一个来自 172.17.0.0/16 网络的 IP:

eth0      Link encap:Ethernet  HWaddr 36:6a:ef:b5:a8:e8  
      inet addr:172.17.0.37  Bcast:172.17.255.255  Mask:255.255.0.0
      inet6 addr: fe80::346a:efff:feb5:a8e8/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:5928 errors:0 dropped:0 overruns:0 frame:0
      TX packets:2675 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:8899041 (8.8 MB)  TX bytes:159716 (159.7 KB)

我想要做的是让容器对外部机器可见为 10.0.1.86,即分配给 macvlan0 的 IP,因此所有发往 IP 10.0.1.86 的数据包都会自动发往 172.17.0.37。

我的猜测是我应该以某种方式设置 NAT,根据我在互联网上找到的文章,以下是我尝试做的事情:

iptables -t nat -A PREROUTING -i macvlan0 -j DNAT --to-destination 172.17.0.37
iptables -t nat -A POSTROUTING -o macvlan0 -j MASQUERADE

但是,当我尝试 ssh 到 10.0.1.86 时,我仍然登录到主机系统。

我在这里做错了什么?

UPD:也许,我应该将容器的 eth0 和主机系统的 docker0 的 IP 地址设置为 10.0.1.0/24 中的某个值,然后直接通过其 IP 地址查询容器?

答案1

因此,我几乎明白了这一点。

首先,macvlan0接口确实不需要。

其次,应该使用 DHCP 配置 docker0。

最后,容器的 lxc.network.ipv4 应该为空,并且 lxc.network.hwaddr 应该设置为某个唯一值。

不幸的是,这只适用于 vanilla lxc 容器,docker 在每个容器运行时都会做一些额外的魔法。

相关内容