Назад | Перейти на главную страницу

Как мне настроить маршрутизацию от хост-системы к виртуальной машине?

У меня есть хост-система 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 творит дополнительную магию при каждом запуске контейнера.