Докер делает порт контейнера открытым для общественности

У меня на Centos7 докер контейнер с Nginx.

Порт 80 доступен снаружи, несмотря на то, что этот порт НЕ открыт в firewalld. Здесь правила для публичной зоны:

# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eno3
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

но есть автоматическое правило для этого порта в цепочке DOCKER:

# iptables -L DOCKER
Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:http

как закрыть этот порт снаружи? Я выполнил команду, но это не помогло:

# firewall-cmd --zone=public --remove-port=80/tcp --permanent
Warning: NOT_ENABLED: 80:tcp
success

Я прочитал документы - https://docs.docker.com/engine/userguide/networking/ но до сих пор не получил его.. На самом деле мне нужно открыть этот порт 80 только для указанной сети 1.2.3.4/24.

2 ответа

Может быть, немного запоздали, но:

вы, вероятно, сопоставляете что-то вроде 3000:3000. Это очень похоже на 0.0.0.0:3000:3000.

Что вы хотите, так это сопоставить только с вашим локальным хостом. Вы можете добиться этого, прослушивая определенный IP-адрес, например 127.0.0.1 (локальный).

Измените вашу конфигурацию на 127.0.0.1:[host_port]:[container_port].

Docker устанавливает правила iptables по умолчанию. Посмотрите Докер Понимание связи контейнера для получения дополнительной информации. Вы также можете отключить это в демоне Docker с помощью --iptables=false,

В качестве альтернативы с помощью docker-compose file version 2+ вы можете использовать expose ключевое слово вместо ports чтобы открыть этот порт только в сети Docker в вашем docker-compose.yml файл.

Тем не менее, вы, вероятно, должны отключить iptables, если вы хотите использовать firewalld.

Другие вопросы по тегам