Доброе утро всем. Я использую сервер Ubuntu 14.04 и Docker 1.8.1, а UFW - мой интерфейс для управления iptables.
Мне нужно запустить приложение в контейнер. Мне нужно следующее поведение:
DOCKER_OPTS="--iptables=false"
в /etc/default/docker
. После этого докер должен перейти к установке ЛЮБОЙ правило iptables.Затем я сделал следующее в UFW, чтобы подключить докеры к внешнему миру:
DEFAULT_FORWARD_POLICY="ACCEPT"
в /etc/default/ufw
net.ipv4.ip_forward=1
и net.ipv4.conf.all.forwarding=1
в /etc/sysctl.conf
Я также добавил следующие строки в /etc/ufw/before.rules
для включения функций NAT:
# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic from private network through eth0, the Internet iface on master.
-A POSTROUTING -s 172.17.42.1/16 -o eth0 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT
где 172.17.42.1/16
это диапазон ip docker iface.
После перезагрузки я запустил sudo iptables -t nat -L -n
, что дает мне:
[....]
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
Тогда, поскольку мой DEFAULT_OUTPUT_POLICY
установлен на DROP
, и я хотел проверить, iptables=false
вариант действительно работает, я запускал:
docker run -it ubuntu:14.04 bash
root@56997560933c:/# apt-get update
но .. контейнер может загружать обновления, даже если порты 80 / tcp и 53 не открыты извне на хост-машине ..
Я знаю, интересно ... что я сделал не так? что еще мне нужно сделать, чтобы избежать подключения контейнера докеров к внешнему миру через порт, который я не позволили в моих iptables (используя UFW)?
СПАСИБО.
Примечание для полноты: В моих iptables нет следов DOCKER ни в одной цепочке. Также при загрузке обновлений, если я запускаю netstat
, вне ssh УСТАНОВЛЕННЫХ соединений нет ... это еще более странно ...
сообщил из этот вопрос другого пользователя, размещенного в stackoverflow. Думаю, это правильное место.