Как мне предотвратить открытие перенаправленных портов docker для внешнего мира?

#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"