Как я могу создать туннель между несколькими Docker-контейнерами и хостом? - PullRequest
1 голос
/ 16 апреля 2019

Я устанавливаю два док-контейнера (скажем, A (172.17.0.2) и B (172.17.0.3)), соединенных с помощью моста. Я хочу перенаправить все запросы из хост-контейнера в контейнер A, а затем в контейнер B, а затем в Интернет. Ответ должен следовать по обратному пути.

До сих пор я мог делать это, используя хост и один контейнер (скажем, A). Я настроил запуск mitmproxy в прозрачном режиме на контейнере A. Я начал запускать mitmproxy на порту 8080 (с привязкой к хосту, поэтому порт 8080 на A привязан к порту 8081 на хосте). Я могу направить все соединения на хосте через A, а затем вернуться к хосту. Я пересылаю все соединения через порты 80 и 443 на порт 8080 в контейнере докера.

Эти правила выполняют маршрутизацию от имени пользователя без полномочий root с использованием одного контейнера Docker.

iptables -I OUTPUT -t nat -p tcp --dport 80 -m owner ! --uid-owner 0 -j DNAT --to 127.0.0.1:8080
iptables -I OUTPUT -t nat -p tcp --dport 443 -m owner ! --uid-owner 0 -j DNAT --to 127.0.0.1:8080

Я попробовал аналогичные правила для контейнера A, запустив mitmproxy в прозрачном режиме для контейнера B на порту 8500. Я думаю, что это правильный подход для этого:

Направляет весь трафик хоста через порт 80/443 на порт 8080 контейнера A Направьте весь трафик контейнера A на порт 8080 (здесь должен быть весь трафик) на порт 8500 на контейнере B Контейнер B должен сделать фактический запрос в Интернет и отправить ответ обратно A, который отправит его обратно на хост.

Когда я устанавливаю правила, подобные приведенным ниже, для контейнера A, я вижу бесконечный цикл запросов GET, выполняемых для контейнера B

iptables -I OUTPUT -t nat -p tcp --dport 8080 -m owner ! --uid-owner 0 -j DNAT --to 172.17.0.3:8500

Я думаю, что это как-то связано с существующими правилами iptables, которые были установлены docker на хост-машине, но я не могу понять, как заставить это работать.

Ценю помощь!

...