Руководство по докеру (http://docs.docker.com/installation/ubuntulinux/#docker-and-ufw) заявляет, что необходимо установить UFW DEFAULT_FORWARD_POLICY в "ACCEPT", чтобы контейнеры докеров могли связываться друг с другом.
Каковы последствия для безопасности, если это сделать на сервере с общедоступными сетевыми интерфейсами?
Что нужно сделать, чтобы обезопасить такой докер-хост?
Кажется, они решили эту часть проблемы, по крайней мере, в последней версии 1.4.1. Моя политика FORWARD - отбрасывать пакеты, и межконтейнерная связь работает без проблем.
Это стандартные правила в цепочке FORWARD, созданной докером:
$ iptables -vnL FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
6902 96M ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
6151 482K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
3 180 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Снизу вверх:
Здесь нет проблем. (Если вам не нужны исходящие фильтры)
Вы можете с радостью установить для политики FORWARD + INPUT значение DROP / REJECT.
Теперь вы можете захотеть предоставить услугу в Интернете. Например. простой веб-сервер:
$ docker run -d -p 80:80 dockerfile/nginx
Хорошо, теперь перейдите на yourserver.com. Вы увидите страницу nginx по умолчанию. Зачем? Docker добавил для вас несколько специальных правил в iptables.
$ iptables -vn -t nat -L # NAT table, truncated for clarity
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
189 11900 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.15:80
$ iptables -vnL FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.15 tcp dpt:80
6903 96M ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
6159 483K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
3 180 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Эти правила обходят все правила ufw, если есть прослушивающий контейнер. ufw ничего не делает в таблице nat, а Docker устанавливает свои правила на первое место в цепочке FORWARD. Таким образом, вы не можете заблокировать IP-адрес или установить какое-либо ограничение скорости.
Возможные решения:
--iptables=false
и делать все вручную. Кропотливое решение, потому что каждый раз, когда вы перезапускаете контейнер, он получает новый IP (на данный момент они планируют его изменить).-p 127.0.0.1:30080:80
и создайте для этого свои собственные правила iptables. service docker start
. Хотя это немного взломано, это работает ...