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

В современном мире контейнеров Docker стал популярным решением для развертывания и управления приложениями.

Одним из распространенных вариантов использования является перенаправление сетевого трафика с определенного порта на хост-машине на порт внутри контейнера Docker.

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

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

Шаг 1: Определите IP-адрес контейнера Docker

Выполните следующую команду, чтобы узнать IP-адрес контейнера Docker:

 

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

 

Замените имя или ID вашего контейнера.

Запишите IP-адрес, отображаемый в выходных данных.

 

Шаг 2: Перенаправление портов на контейнеры 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

 

Использование firewall-cmd

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

Добавьте правила firewall-cmd для переадресации: Теперь настройте правила firewall-cmd для перенаправления нужного порта в ваш Docker-контейнер.

Замените <HOST_PORT> номером порта на хост-машине, <CONTAINER_IP> – IP-адресом вашего контейнера, а <CONTAINER_PORT> – номером порта внутри контейнера.

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

 

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.

 

Заключение

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

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

Такой подход позволяет открывать сервисы, работающие внутри контейнеров, устанавливать обратные прокси-серверы, реализовывать балансировку нагрузки и т.д., повышая гибкость и эффективность контейнерной инфраструктуры.