Две вещи, которые следует иметь в виду при работе с правилами брандмауэра docker:
- Чтобы избежать того, чтобы ваши правила были заблокированы docker, используйте
DOCKER-USER
цепь - Docker выполняет сопоставление портов в
PREROUTING
цепочка изnat
стол. Это происходит до того, какfilter
правила, так что--dest
и--dport
будет отображаться внутренний IP-адрес и порт контейнера. Чтобы получить доступ к исходному пункту назначения, вы можете использовать-m conntrack --ctorigdstport
.
Например:
iptables -A DOCKER-USER -i eth0 -s 8.8.8.8 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPTiptables -A DOCKER-USER -i eth0 -s 4.4.4.4 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPTiptables -A DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j DROP
ПРИМЕЧАНИЕ: Без --ctdir ORIGINAL
, это также соответствовало бы ответным пакетам, возвращающимся для подключения из контейнера к порту 3306 на каком-либо другом сервере, что почти наверняка не то, что вы хотите! Вам это строго не нужно, если, как и я, ваше первое правило таково -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
, так как это будет иметь дело со всеми ответными пакетами, но было бы безопаснее по-прежнему использовать --ctdir ORIGINAL
в любом случае.