LXC-Маршрутизація між контейнерами


0

У мене досить lxc-налаштування за замовчуванням з одним хостом і кількома контейнерами. Один контейнер webfrontend отримує весь хост-трафік на портах 80 та 443 через DNATing порти. Nginx на webfrontend вирішує через vhosts, який контейнер webappX повинен отримати запит і проксі-сервер запитує до приватного ip webappX:

host:443 <--prerouting--> webfrontend:443 <--nginx--> webappX-private:80

-A PREROUTING -d 80.x.x.x/32 -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.3.100:443
  • Ведучий (громадський): 80.xxx
  • webfrontend (lxcbr0): 10.0.3.100
  • webappX (lxcbr0): 10.0.3.200
  • webappY (lxcbr0): 10.0.3.2018
  • ...

Це чудово працює і дає центральну точку для сертифікатів letsencrypt тощо.

Однак, коли webappX потребує доступу до webappY, з'єднання відмовляється, і webfrontend ніколи не бачить запит. Я можу отримати доступ до webappY на приватному ip (від webappX), але я не можу отримати доступ до webappY-public (він же webfrontend):

root@webappX:~# curl -I http://10.0.3.201
HTTP/1.1 200 OK
[...]

root@webappX:~# curl -I http://webappY.example.com
curl: (7) Failed to connect to webappY.example.com port 80: Connection refused

root@webappX:~# nslookup webappY.example.com
[...]
Name: webappY.example.com
Address: 80.x.x.x

Переадресація між контейнерами надається:

*filter
-A FORWARD -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -j ACCEPT

Поки я намагався без успіху встановити правила POSTROUTING і OUTPUT на eth0 і lo.

Якісь ідеї?


1
Те, що ви хочете - це закріплення волосся NAT. Ви не вражаєте свої DNATправила, головним чином через те, що трафік надходить через інший інтерфейс, ніж eth0. Однак я не впевнений, що це все.
Даніель Б

@DanielB чорт у подробицях ... що це зробили. Чи можете ви опублікувати це як відповідь? Я додам правило iptables до відповіді та нагороджу репутацією. Дякую!
Ларс

Відповіді:


1

Вам потрібна так звана NAT-шпилька (також NAT петля, NAT відображення):

NAT-цикл, [...] - це особливість у багатьох маршрутизаторах споживачів, яка дозволяє отримати доступ до послуги через загальнодоступну IP-адресу з локальної мережі.

Чому це не працює? IPTables DNAT правилом ви надали в ваше запитання вказує входить інтерфейс це правило повинно застосовуватися до: -i eth0. eth0Однак ваш трафік не надходить , а віртуальний мережевий інтерфейс чи будь-який інший. Просто видалення цього обмеження eth0може бути достатнім для його роботи.

Крім того, окреме правило можна додати до lxcbr0:

iptables -t nat -A PREROUTING -i lxcbr0 -p tcp --dport 443 \
    --destination 80.x.x.x -j DNAT --to 10.0.3.100:443
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.