У меня есть хост, на котором работает несколько контейнеров докеров.
У этого хоста есть несколько сетевых интерфейсов, моя цель - сделать некоторые открытые порты контейнеров доступными только для определенных интерфейсов и предотвратить доступ из других.
Я хотел бы использовать для этого iptables хоста.
Но это невозможно сделать просто с помощью:
iptables -I INPUT -i vlan2 --dport 80 -j DROP
потому что пакеты пересылаются предварительной маршрутизацией.
iptables -t nat -L PREROUTING 2
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:mysql to:172.17.0.2:33066
DNAT tcp -- anywhere anywhere tcp dpt:http to:172.17.0.4:80
Есть два открытых порта 80 и 3306 для разных контейнеров, и я хочу сделать его недоступным из интерфейса vlan2.
После того, как я добавил это:
iptables -I FORWARD -i vlan2 -p tcp --dport 80 -j REJECT
Веб-сервер перестал работать, но
iptables -I FORWARD -i vlan2 -p tcp --dport 3306 -j REJECT
не препятствуйте подключению к mysql, я все еще могу подключиться. И tcpdump это доказывает:
tcpdump -n -i vlan2 port 3306
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vlan2, link-type EN10MB (Ethernet), capture size 262144 bytes
22:48:13.066636 IP 3.2.2.2.47259 > 1.1.2.3.3306: Flags [S], seq 3619220560, win 29200, options [mss 1460,sackOK,TS val 90183390 ecr 0,nop,wscale 7], length 0
22:48:13.066740 IP 1.1.2.3.3306 > 3.2.2.2.47259: Flags [S.], seq 2743923517, ack 3619220561, win 28960, options [mss 1460,sackOK,TS val 10989883 ecr 90183390,nop,wscale 7], length 0
И я не могу понять разницу между этими двумя правилами.
Как использовать iptables хоста для предотвращения доступа к контейнерам
Проблема в том, что ваше правило NAT в PREROUTING
цепочка нат таблицы транслирует порт хоста 3306
к 172.17.0.2:
33066
а не 172.17.0.2:
3306
таким образом, правило в FORWARD
цепочка таблицы фильтров ничего не соответствует, так как пытается отбросить трафик, перенаправленный на порт назначения 3306
.