Как перенаправить порты в контейнеры Docker с помощью брандмауэра Linux

26 set 2023 4 min di lettura
Как перенаправить порты в контейнеры Docker с помощью брандмауэра Linux
Indice dei contenuti

Введение

В современном мире контейнеризации Docker стал популярным решением для развертывания приложений и управления ими. Распространенный вариант использования включает пересылку сетевого трафика с определенного порта на главном компьютере на порт внутри контейнера Docker. Это может быть особенно полезно, когда вы хотите предоставить доступ внешнему миру к службе, работающей внутри вашего контейнера, или когда вам нужно настроить обратный прокси-сервер для балансировки нагрузки.

В этой статье мы покажем вам, как перенаправить порт в контейнер Docker с помощью iptables, мощной и гибкой утилиты брандмауэра, доступной в большинстве дистрибутивов Linux.

Определите IP-адрес контейнера Docker.

Запустите следующую команду, чтобы найти IP-адрес вашего контейнера Docker:

docker inspect -f '{{.NetworkSettings.IPAddress }}' <CONTAINER_NAME_OR_ID>

Замените на имя или идентификатор контейнера. Обратите внимание на IP-адрес, отображаемый в выходных данных.

Перенаправление портов в Docker-контейнеры

Использование Iptables

Чтобы перенаправить порт в контейнер Docker с помощью iptables, вы можете выполнить следующие действия:

Добавьте правила iptables для переадресации. Теперь установите правила iptables для перенаправления нужного порта в ваш контейнер Docker. Замените <HOST_PORT> номером порта на главном компьютере, <CONTAINER_IP> IP-адресом вашего контейнера и <CONTAINER_PORT> номером порта внутри контейнера.

sudo iptables -t nat -A PREROUTING -p tcp --dport <HOST_PORT> -j DNAT --to-destination <CONTAINER_IP>:<CONTAINER_PORT>
sudo iptables -t nat -A POSTROUTING -j MASQUERADE

Например, если вы хотите перенаправить порт 8080 с главного компьютера на порт 80 в контейнере Docker с IP-адресом 172.21.0.7, выполните следующие команды:

sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.21.0.7:80
sudo iptables -t nat -A POSTROUTING -j MASQUERADE 

Сохранение правил iptables. Чтобы правила iptables сохранялись после перезагрузки, вы можете сохранить их с помощью команды iptables-save:

sudo iptables-save > /etc/iptables/rules.v4

Обратите внимание, что путь к файлу правил может отличаться в зависимости от вашего дистрибутива Linux.

Сделайте правило iptables постоянным: если вы используете дистрибутив на основе Debian/Ubuntu, вы можете установить пакет iptables-persistent, чтобы правила сохранялись после перезагрузки:

sudo apt-get install iptables-persistent

Во время установки вас спросят, хотите ли вы сохранить текущие правила iptables. Выберите «Да», чтобы сохранить правила.

Чтобы перенаправить порт в контейнер Docker с помощью firewall-cmd, который является частью утилиты firewalld в системах на базе RHEL/CentOS/Fedora, выполните следующие действия:

Добавьте правила firewall-cmd для переадресации. Теперь настройте правила firewall-cmd для перенаправления нужного порта в ваш контейнер Docker. Замените <HOST_PORT> номером порта на главном компьютере, <CONTAINER_IP> IP-адресом вашего контейнера и <CONTAINER_PORT> номером порта внутри контейнера.

Сначала включите маскирование активной зоны:

sudo firewall-cmd --zone=public --add-masquerade --permanent

Далее создайте правило переадресации портов:

sudo firewall-cmd --zone=public --add-forward-port=port=<HOST_PORT>:proto=tcp:toaddr=<CONTAINER_IP>:toport=<CONTAINER_PORT> --permanent

Например, чтобы перенаправить порт 8080 на главном компьютере на порт 80 в контейнере Docker с IP-адресом 172.17.0.7, вы должны использовать следующую команду:

sudo firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toaddr=172.17.0.7:toport=80 --permanent

Перезагрузите правила брандмауэра. После добавления правил необходимо перезагрузить конфигурацию firewalld, чтобы изменения вступили в силу:

sudo firewall-cmd --reload

Теперь переадресация портов должна работать, и весь трафик, поступающий в <HOST_PORT> на главном компьютере, будет перенаправляться в <CONTAINER_PORT> в контейнере Docker.

Использование UFW

Чтобы перенаправить порт в контейнер Docker с помощью ufw (несложный брандмауэр), который является инструментом брандмауэра по умолчанию в Ubuntu и других системах на базе Debian, вам необходимо выполнить следующие шаги:

Включите пересылку UFW: отредактируйте файл конфигурации UFW в /etc/default/ufw:

sudo nano /etc/default/ufw

Найдите строку, содержащую DEFAULT_FORWARD_POLICY="DROP" и измените ее на DEFAULT_FORWARD_POLICY="ACCEPT":

DEFAULT_FORWARD_POLICY="ACCEPT"

Сохраните файл и выйдите из редактора.

Настройте переадресацию IP: отредактируйте файл конфигурации sysctl в /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Добавьте или удалите комментарий к следующей строке:

net.ipv4.ip_forward=1

Сохраните файл и выйдите из редактора. Примените изменения, выполнив:

sudo sysctl -p

Обновите правила UFW. Сначала создайте новый файл правил UFW для переадресации портов. Замените <HOST_PORT> номером порта на главном компьютере, <CONTAINER_IP> IP-адресом вашего контейнера и <CONTAINER_PORT>> номером порта внутри контейнера.

sudo nano /etc/ufw/before.rules

Добавьте следующие строки в начало файла после комментариев заголовка:

*nat:PREROUTING ACCEPT [0:0]
 -A PREROUTING -p tcp --dport <HOST_PORT> -j DNAT --to-destination <CONTAINER_IP>:<CONTAINER_PORT>
 COMMIT

Например, чтобы перенаправить порт 8080 на главном компьютере на порт 80 в контейнере Docker с IP-адресом 172.17.0.7, вы должны добавить:

*nat:PREROUTING ACCEPT [0:0]
 -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.7:80
 COMMIT

Сохраните файл и выйдите из редактора.

Перезагрузите UFW. Наконец, перезагрузите конфигурацию UFW, чтобы изменения вступили в силу:

sudo ufw disable
sudo ufw enable

Теперь переадресация портов должна работать, и весь трафик, поступающий в <HOST_PORT> на главном компьютере, будет перенаправляться в <CONTAINER_PORT> в контейнере Docker.

Заключение

В заключение, перенаправление порта в контейнер Docker с помощью iptables — это простой процесс, который включает в себя определение IP-адреса контейнера, добавление необходимых правил iptables и обеспечение сохранения правил после перезагрузки. Выполнив действия, описанные в этой статье, вы можете гарантировать, что трафик, отправленный на определенный порт на главном компьютере, будет плавно перенаправляться на соответствующий порт в контейнере. Этот подход позволяет вам предоставлять услуги, работающие внутри контейнеров, настраивать обратные прокси-серверы или реализовывать балансировку нагрузки, среди других вариантов использования, тем самым повышая гибкость и эффективность вашей контейнерной инфраструктуры.

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.