大家早上好。我正在运行 Ubuntu 14.04 服务器和 Docker 1.8.1,UFW 是我管理 iptables 的前端。
我需要将应用程序运行到容器中。我确实需要以下行为:
- 我的应用程序需要连接到另一台机器的端口,比如 8888/tcp。
- 我不希望 docker 管理我的 iptables,因此我已设置
DOCKER_OPTS="--iptables=false"
。/etc/default/docker
完成后,docker 现在应该跳到设置任何iptables 规则。
然后,我在 UFW 中完成了以下操作以使 Docker 容器连接到外界:
- 开始
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
docker iface 的 IP 范围在哪里。
重新启动后,我运行了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 端口没有向外部开放,容器也能够下载更新。
我现在很疑惑...我做错了什么?我还需要做些什么才能避免docker容器使用我不允许在我的 iptables 中 (使用 UFW)?
谢谢。
完整性注意事项:
我的 iptables 中的任何链中都没有 DOCKER 的踪迹。此外,在下载更新时,如果我运行netstat
,则 ssh 之外没有已建立的连接……这更奇怪……
報告这个问题另一位用户在 stackoverflow 上发帖。我认为这里就是正确的地方。