У меня довольно lxc-настройка по умолчанию с одним хостом и несколькими контейнерами. Один веб-интерфейс контейнера получает весь трафик хоста через порты 80 и 443 через DNATing порты. Nginx на веб-интерфейсе решает через 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
- веб-интерфейс (lxcbr0): 10.0.3.100
- webappX (lxcbr0): 10.0.3.200
- webappY (lxcbr0): 10.0.3.201
- ...
Это прекрасно работает и позволяет использовать центральную точку для letsencrypt-сертификатов и т. Д
Однако когда webappX требуется доступ к webappY, соединение отклоняется, и веб-интерфейс никогда не видит запрос. Я могу получить доступ к webappY по частному ip (из webappX), но не могу получить доступ к webappY-public (он же веб-интерфейс):
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-rules и OUTPUT-rules на eth0 и вот безуспешно.
Есть идеи?