#docker #iptables #portforwarding
#docker #iptables #замена портов
Вопрос:
У меня есть несколько веб-сервисов в разных контейнерах, и я перенаправил 80 портов каждого сервера на другой порт на главном сервере. (контейнер 1 80 -> 8003, контейнер 2 80 -> 8004, контейнер 3 80 -> 8005) Я хочу запретить доступ к этим портам, за исключением предварительно настроенного списка ip
Я добавил правила iptables в цепочку «docker-user» следующим образом;
-A INPUT -s 212.154.74.194/32 -p tcp -j ACCEPT //accept all from this ip
-A INPUT -s 185.22.208.0/25 -p tcp -j ACCEPT //accept all from this ip
-A INPUT -p tcp -m tcp --dport 8003 -j DROP //block anyone except allowed ips
-A INPUT -p tcp -m tcp --dport 8004 -j DROP //block anyone except allowed ips
-A INPUT -p tcp -m tcp --dport 8005 -j DROP //block anyone except allowed ips
Но это не работает. К маршрутизируемым портам все еще можно получить доступ извне. Я не знаю, что я сделал не так. Как я могу заблокировать доступ к маршрутизируемым портам?
Ответ №1:
Похоже, что из документов docker довольно исчерпывающе отвечает на ваш вопрос:
По умолчанию всем IP-адресам внешнего источника разрешено подключаться к демону Docker. Чтобы разрешить доступ к контейнерам только определенному IP или сети, вставьте отрицаемое правило в начало цепочки фильтров DOCKER. Например, следующее правило ограничивает внешний доступ ко всем IP-адресам, кроме 192.168.1.1:
$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.1 -j DROP
Разрешить определенную подсеть:
iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP
Бонус: вы также можете полностью ограничить подключения к localhost: docker run -p 127.0.0.1:80:8003
должно автоматически ограничить доступ к localhost.
Альтернативно с помощью docker compose:
webapp:
image: image_name
ports:
- "127.0.0.1:80:8003"