Всем доброго дня
Бьюсь с docker и iptables. Использую Docker Swarm и все работает корректно, кроме контейнеров с публикацие порта типом ‘host’. Ingress работает как нужно. Есть правило для публикации 80 и 443 портов в интернет (сервис Nginx):
-A FILTERS -p tcp -m multiport --dports 80,443 -j ACCEPT
Оно работает, кроме сервисов с типом публикации host аля 61245:80
в Интернет. Вот как выглядит контейнер в docker ps
, у которого порт 61245
не фильтруется.
1d828a18d4a6 443/tcp, 0.0.0.0:61245->80/tcp test_my-container.1.mauafd2zp4uzqaceyaoqhqh9g
Ниже пример правила (запускается при старте ОС через сервис ‘ExecStart=/sbin/iptables-restore -n /etc/iptables_rules_docker.ipv4’):
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:FILTERS - [0:0]
:DOCKER-USER - [0:0]
-F INPUT
-F DOCKER-USER
-F FILTERS
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j FILTERS
-A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-USER -i eth0 -j FILTERS
-A DOCKER-USER -i eth1 -j FILTERS
-A FILTERS -s 192.168.0.0/16 -j ACCEPT
-A FILTERS -s 172.16.0.0/16 -j ACCEPT
-A FILTERS -s 10.0.0.0/8 -j ACCEPT
-A FILTERS -p tcp -m multiport --dports 80,443 -j ACCEPT
-A FILTERS -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: "
-A FILTERS -p tcp -j DROP
COMMIT
Если я уберу правило с 80,443, то в логах при попытке зайти на 80 и на 61245 одну и ту же строку (меняется только ID и SPT):
iptables_INPUT_denied: IN=eth1 OUT=docker_gwbridge SRC=1.2.3.4 DST=172.18.0.17 LEN=60 TOS=0x00 PREC=0x00 TTL=53 ID=45802 DF PROTO=TCP SPT=41820 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0
Подскажите, пожалуйста, как сделать так, чтобы порты типа 61245 фильтровались, а 80 оставался доступным.