У меня есть хост-система Ubuntu, на которой запущен виртуальный интерфейс MAC-VLAN поверх интерфейса eth0, включена маршрутизация 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 имеет IP из сети 172.17.0.0/16:
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, то есть IP, назначенный macvlan0, чтобы все пакеты, которые поступают на 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: может быть, я должен просто установить IP-адреса для eth0 контейнера и docker0 хост-системы вместо 10.0.1.0/24 и запросить контейнер напрямую по его IP-адресу?
Итак, я почти понял это.
Во-первых, интерфейс macvlan0 действительно не нужен.
Во-вторых, docker0 следует настроить с использованием DHCP.
Наконец, lxc.network.ipv4 должен быть пустым для контейнера, а lxc.network.hwaddr должен иметь уникальное значение.
К сожалению, это работает только с контейнерами vanilla lxc, docker творит дополнительную магию при каждом запуске контейнера.