Проброс портов на контейнеры Docker с помощью брандмауэров Linux
Life-Hack [Жизнь-Взлом]/ХакингВ современном мире контейнеров Docker стал популярным решением для развертывания и управления приложениями.
Одним из распространенных вариантов использования является перенаправление сетевого трафика с определенного порта на хост-машине на порт внутри контейнера Docker.
Это может быть особенно полезно, когда необходимо открыть внешний доступ к службе, работающей внутри контейнера, или настроить обратный прокси-сервер для балансировки нагрузки.
В этой статье мы рассмотрим шаги, необходимые для перенаправления порта в контейнер Docker с помощью iptables, мощной и гибкой утилиты межсетевого экрана, доступной в большинстве дистрибутивов Linux.
Шаг 1: Определите IP-адрес контейнера Docker
Выполните следующую команду, чтобы узнать IP-адрес контейнера Docker:
doc
Замените имя или 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 i
Например, если необходимо перенаправить порт 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:prot
Перезагрузите правила межсетевого экрана:
После добавления правил необходимо перезагрузить конфигурацию firewalld, чтобы изменения вступили в силу:
sudo firewall-cmd --reload
Теперь проброс портов должен работать, и любой трафик, приходящий на <HOST_PORT> на хост-машине, будет перенаправляться на <CONTAINER_PORT> в контейнере Docker.
Заключение
В заключение следует отметить, что перенаправление порта на контейнер Docker с помощью iptables – это простой процесс, который включает в себя определение IP-адреса контейнера, добавление необходимых правил iptables и обеспечение сохранения правил при перезагрузке.
Выполнив описанные в этой статье действия, можно добиться того, что трафик, отправляемый на определенный порт хост-машины, будет перенаправлен на соответствующий порт контейнера.
Такой подход позволяет открывать сервисы, работающие внутри контейнеров, устанавливать обратные прокси-серверы, реализовывать балансировку нагрузки и т.д., повышая гибкость и эффективность контейнерной инфраструктуры.