Прозрачное проксирование единственного контейнера докера к другому контейнеру докера

У меня есть пара контейнеров докера, работающих на хост-машине, эти контейнеры вместе подает мою заявку, выполняют. Таким образом для каждого повторения/экземпляра моего приложения требует, чтобы пара контейнеров докера работала. До сих пор я использую - параметр ссылки при выполнении второго контейнера, чтобы связать первый контейнер и заставить IP первого контейнера от файла hosts использовать его программно.

Теперь, я должен установить прозрачный прокси для второго контейнера докера. так, чтобы, весь http (порт 80) трафик второго контейнера проходил порт 8080 из первого контейнера.

Первый контейнерный IP: 172.17.0.4 (Имеет сервисную работу прокси порта 8080). Второй контейнерный IP: 172.17.0.6 (Имеет клиентские инструменты как браузер). Я хотел передать весь трафик HTTP (Порт 80) 172.17.0.6 к порту 8080 из 172.17.0.4.

т.е.) Трафик к 80 из 172.17.0.4 <---> 8080 172.17.0.6

Я попытался добавить правила iptables во втором контейнере для вышеупомянутой конфигурации. Но ни один из них не работал.

~# sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:8080

Не работает.

~# sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:8080

Не работает.

~# sudo iptables -t nat -A POSTROUTING -j MASQUERADE

Таким образом, мой вопрос, как я могу настроить прозрачный прокси в контейнере докера, который может передать весь трафик указанного порта к порту другого контейнера?

P.S.: Если я вручную добавляю настройки прокси к браузеру во втором контейнере. Это хорошо работает. Но я хотел установить прозрачный прокси для всего контейнера, не только браузер. так, чтобы любой сетевой запрос от любого инструмента во втором контейнере был передан к порту прокси первого контейнера.

Я прочитал некоторые учебные руководства на проксировании реверса все контейнеры, работающие вместе использующий nginx/HAProxy. Но я хотел настроить отдельный контейнер со своим собственным контейнером прокси как пара.

3
задан 26 January 2015 в 06:17
3 ответа

Спасибо всем, что уделили время для ответа. В основном то, что я пытаюсь сделать, это проксировать исходящий / исходящий трафик второго контейнера ( ПРИМЕЧАНИЕ: Я НЕ пытаюсь проксировать входящий трафик, поэтому нельзя использовать Apache mod_proxy или Nginx proxy_pass. Эти модули работают для входящего трафика). 1-й контейнер запускает прокси-службу на порту 8080.

Как предложил Тьерно, я могу использовать переменные http_proxy и https_proxy ENV для проксирования исходящего трафика, но, к сожалению, НЕ все приложения / службы, работающие в вашей операционной системе, уважают эти переменные http_proxy и https_proxy ENV. Есть приложения, которые принудительно пропускают настройки прокси. По этой причине я хотел использовать iptables для обеспечения соблюдения правил трафика . Таким образом, ни одно приложение / служба не может пропустить прокси.

Ошибка, которую я сделал в предыдущих настройках этого вопроса, заключается в том,Я пытался направить входящий трафик на порт 80-8080 прокси-сервера. Так как 1-й контейнер не имеет входящего трафика, он не будет работать, и логически неверно PREROUTE / POSTROUTE трафика для достижения того, что я искал. Для маршрутизации исходящего / исходящего трафика нам необходимо использовать OUTPUT цепочку iptables.

Мое решение:

Я использовал комбинацию RedSocks с iptables, чтобы обеспечить прокси для всего исходящего трафика от сервер. Вот конфигурация iptables, которую я использовал:

# Создать новую цепочку для RedSocks

root# iptables -t nat -N REDSOCKS

# Игнорировать локальные сети и некоторые другие зарезервированные адреса

root# iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
root# iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
root# iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
root# iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
root# iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
root# iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
root# iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
root# iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN

# Перенаправить весь http на локальный порт Redsocks

root# sudo iptables -t nat -A REDSOCKS -p tcp --dport 80 -j REDIRECT --to-ports 12345

# только для трафика https замените порт 80 на 443

# Используйте всю цепочку REDSOCKS для всего исходящего трафика на eth0

root# sudo iptables -t nat -A OUTPUT -p tcp -o eth0 -j REDSOCKS

Теперь настройте redsocks для прослушивания локального порта 12345 для входящего трафика и перенаправления его на IP-адрес и порт прокси-сервера. Для этого отредактируйте redsocks.conf вот так,

redsocks {
local_ip = 127.0.0.1;
local_port = 12345;
ip = 172.17.0.4;
port = 8080;
type = http-relay;
}

просто сохраните conf и перезапустите службу redsocks . Теперь весь исходящий трафик, исходящий из 1-го контейнера, будет принудительно использовать прокси. ( ПРИМЕЧАНИЕ: Я использовал iptables-persistent для сохранения правил при перезагрузке сервера) На самом деле я реализовал то же самое для трафика http и https, добавив еще одну строку в конфигурацию iptables. Хотя это непрозрачный прокси-сервер, он выполняет свою работу за меня.

Если у кого-то есть другие альтернативные решения, предложите.

3
ответ дан 3 December 2019 в 06:32

Я думаю, что использование переменной env $ http_proxy должно помочь.

Вы можете установить точку входа в вашем файле докеров (для контейнера №2), чтобы экспортировать переменную окружения при запуске контейнера. Где-то в вашей точке входа должно быть что-то вроде этого:

export http_proxy=http://$CONATAINER1_PORT_8080_TCP_ADDR:$CONATAINER1_PORT_8080_TCP_PORT

Я не знаю точно, может ли ваш клиент (браузер) использовать переменную $ http_proxy env var, но должен существовать аналогичный метод. Например, для firefox:

user_pref("network.proxy.http", "$CONATAINER1_PORT_8080_TCP_ADDR");
user_pref("network.proxy.http_port", $CONATAINER1_PORT_8080_TCP_PORT);
user_pref("network.proxy.type", 1);

Советы: используйте printenv во втором контейнере, чтобы узнать, какое имя переменных следует использовать в своей точке входа

0
ответ дан 3 December 2019 в 06:32

Reciprocal link - это не то, что есть в докере, насколько я знаю (информация, обнаруженная во время работы, о контейнере, перенесенном обратно или возвращенном в ответ прародителю). Вероятно, поэтому в большинстве учебников используется третий, общий предок, 'прокси'.

Если вы хотите использовать фреймворки типа fig или weave, которые, как мне кажется, имеют конфигурационные файлы yaml или json, вы, вероятно, сможете настроить их только с двумя контейнерами reciprocal.

Если вы хотите иметь третий, то все порты и водопровод могут быть соединены через общий предок для обоих ваших 'родственных' контейнеров.

.
0
ответ дан 3 December 2019 в 06:32

Теги

Похожие вопросы