Docker игнорирует правила iptable при использовании "-p: "

только что понял несколько дней назад, что докер, похоже, обходит мои правила iptable. У меня нет невероятного опыта работы с Docker и iptables. В последние дни я перепробовал много разных вещей. Также увидел, что в последних версиях docker произошли большие изменения со специальной цепочкой докеров, которая должна позволить мне это сделать. Однако не уверен, что я делаю неправильно, но он никогда не делает то, что я ожидаю от него.

Итак, то, что я хочу, довольно просто. Я хочу, чтобы он вел себя так, как ожидалось. Что если у меня правило ACCEPT для прохождения, а если нет, оно блокируется.

мой iptable выглядел первоначально так (так что перед моими многочисленными неудачными попытками):

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [779:162776]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 1.2.3.4 -p tcp -m tcp --dport 123 -j ACCEPT
-A INPUT -j DROP
COMMIT

надеялся, что он делает именно то, что я хочу. Просто разрешите доступ к портам 22 и 80, а также разрешите порт 123 от ip 1.2.3.4. Однако, если я создам контейнер с "- p 123: 123", каждый может получить к нему доступ. Может ли кто-нибудь помочь мне и сказать мне, как я должен изменить вышеизложенное файл?

спасибо!

Docker-Версия: 1.6.2

Edit:

слева изначально мои разные попытки не усложнять вопрос. Однако добавление хотя бы одного из них может быть полезно.

*nat
:PREROUTING ACCEPT [319:17164]
:INPUT ACCEPT [8:436]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [16:960]
:DOCKER - [0:0]
COMMIT


*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [779:162776]
:DOCKER - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER -s 1.2.3.4 -p tcp -m tcp --dport 123 -j ACCEPT
-A DOCKER -j DROP
-A INPUT -j DROP
COMMIT

вышеуказанный вид работ. Однако получите тогда много других проблем. Например, у меня возникают проблемы с связыванием контейнеров, DNS больше не работает и так далее. Так что в конечном итоге добавьте много дополнительных правил, чтобы исправить это проблемы, но я никогда не добираюсь до состояния, когда он работает должным образом. Так что я думаю, что большинство из них будет лучше и проще.

устранение:

в конечном итоге делает более или менее точно, что сказал larsks. Просто не добавил его в переднюю цепочку, вместо этого я добавил его в цепочку докеров. Проблема с прямой цепью заключается в том, что Docker добавляет туда свои вещи, когда он перезапускается в первой позиции. Что приводит к тому, что мои правила оттесняются и не имеют никакого эффекта. Однако для цепочки докеров кажется, что докер добавляет только дополнительные правила, поэтому мои остаются в силе. Поэтому, когда я сохраняю свои правила, а затем перезапускаю сервер, все по-прежнему работает нормально.

Так что теперь это выглядит более или менее так:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [779:162776]
:DOCKER - [0:0]
# That I can access from IP 1.2.3.4
-A DOCKER -s 1.2.3.4/32 -p tcp -m tcp --dport 123 -j ACCEPT
# That I can access from other Docker containers
-A DOCKER -o docker0 -p tcp -m tcp --dport 123 -j ACCEPT
# Does not allow it for anything else
-A DOCKER -p tcp --dport 123 -j DROP

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
COMMIT

3 ответов


ваша конфигурация iptables выглядит немного сломанной прямо сейчас, как будто вы очистили ее в какой-то момент без перезапуска Docker. Например, у вас есть


Я не эксперт по iptables, но я знаю, что если вы запустите контейнер с -p 127.0.0.1:123:123 тогда порт не будет отображаться на всех интерфейсах, только на петле.


в конечном итоге делает более или менее точно, что сказал larsks. Просто не добавила это к передней цепи, я добавил его к цепи докера вместо этого.

Я нашел то же самое в документах:https://docs.docker.com/v1.5/articles/networking/#the-world

Docker не будет удалять или изменять какие-либо ранее существующие правила из Цепочка фильтров докера. Это позволяет пользователю создать заранее любой правила требуется ограничить доступ к контейнерам.

правила переадресации Docker разрешают все внешние исходные IPs по умолчанию. To разрешить доступ к контейнерам только определенному IP-адресу или сети вставить отрицаемое правило в верхней части цепочки фильтров DOCKER. Например, ограничьте внешний доступ, чтобы только исходный IP 8.8.8.8 мог получить доступ в контейнеры можно добавить следующее правило:

$ iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP