Шаги по ограничению внешних подключений к контейнеру docker с помощью iptables?

Две вещи, которые следует иметь в виду при работе с правилами брандмауэра docker:

  1. Чтобы избежать того, чтобы ваши правила были заблокированы docker, используйте DOCKER-USER цепь
  2. 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 в любом случае.