У мене досить 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.
Якісь ідеї?
DNAT
правила, головним чином через те, що трафік надходить через інший інтерфейс, ніжeth0
. Однак я не впевнений, що це все.