Докер делает порт контейнера открытым для общественности
У меня на 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.