我有一个 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 在每个容器运行时都会做一些额外的魔法。