У меня довольно 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 и вот безуспешно.

Есть идеи?

1 ответ1

1

То, что вам нужно, это так называемое закрепление NAT (петля NAT, отражение NAT):

NAT loopback, [...] является функцией многих потребительских маршрутизаторов, которая разрешает доступ к услуге через публичный IP-адрес изнутри локальной сети.

Почему это не работает? Правило DNT IPTables, которое вы указали в своем вопросе, указывает входящий интерфейс, к которому должно применяться это правило: -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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .