Введение
В современном мире контейнеризации 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 и обеспечение сохранения правил после перезагрузки. Выполнив действия, описанные в этой статье, вы можете гарантировать, что трафик, отправленный на определенный порт на главном компьютере, будет плавно перенаправляться на соответствующий порт в контейнере. Этот подход позволяет вам предоставлять услуги, работающие внутри контейнеров, настраивать обратные прокси-серверы или реализовывать балансировку нагрузки, среди других вариантов использования, тем самым повышая гибкость и эффективность вашей контейнерной инфраструктуры.