这是我第一次解决这个networking“问题”来解决docker工,我需要一些input。
这是我的情况:
运行NginX的Ubuntu 14.04,作为防火墙和Docker容器运行PHP后端应用程序。
对于INPUT和OUTPUT以及FORWARD,Ufw默认策略设置为DROP。
sysctl规则: net.ipv4.conf.all.forwarding = 0
我的需要:
我的问题:
Ufw被设置为仅接受来自IP 8.8.8.8的端口8888 / tcp上的传入连接。 因此,基本上:
sudo ufw allow in from 8.8.8.8 to any port 8888 proto tcp
然后,我运行容器:
docker run -p 8888:8888/tcp -p 127.0.0.1:4444:4444/tcp [other options ]
之后,从没有ip = 8.8.8.8的机器上运行nmap -p 8888 45.45.45.45 ,我希望得到port filtered 。 但….
Host is up (0.056s latency). PORT STATE SERVICE 8888/tcp open unknown
然后我试图再次运行容器没有-p 8888:8888/tcp ,然后我试图再次运行nmap,并…
Host is up (0.061s latency). PORT STATE SERVICE 8888/tcp filtered unknown
因此,看来,如果我错了,纠正我,docker规则覆盖ufw的。
然后,我search了一个方法,只允许来自特定地址的容器中的传入stream量,而我发现如下所示:
iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP
它的工作原理:
PORT STATE SERVICE 8888/tcp filtered unknown Nmap done: 1 IP address (1 host up) scanned in 15.05 seconds
我的问题是:
是我的情况正确的解决scheme吗? 我的意思是:像上面的行事,我重写ufw规则allow in from 8.8.8.8 to any port 8888 proto tcp与docker规则,说“暴露端口只有当stream量来自IP 8.8.8.8”…这是正确的进场?
将ufw放在不需要的数据包的“糟糕的工作”上,然后将stream量从过滤的端口转发到docker会更好吗? 有没有办法做到这一点?
我会避免这个解决scheme,因为作为一个DOCKER链的iptable规则,该规则涉及我现有的所有容器,或者我将拥有。
谢谢。
在Linux上,ufw和docker的规则都是在netfilter的基础上实现的。 那么iptables 。 所以不可能让ufw去做一些事情,并得到docker规则去做其他事情 – 所有这些事情都将由单个底层netfilter子系统来完成。
iptables-save这个命令很有用,可以将所有为netfilterconfiguration的东西(包括docker规则和ufw)转储出来,然后(通过一些努力),你可以通过链接来看看它在做什么。
请注意,当Docker守护进程启动时,它会将DOCKER链添加到*filter和*nat规则中。 如果你事后清除了所有的iptables规则,使用例如ufw,你可能会打破预期的行为。 当你启动一个容器时, FORWARD规则被添加到DOCKER链中。 Docker运行命令是这样的:
iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.2 --dport 8888 -j ACCEPT
但是,这不会打开任何端口,因为Docker并没有修改iptables INPUT规则。 所以,这意味着你的ufw规则有问题。
如果你不喜欢Docker修改你的iptables规则,你可以在Docker服务configuration中通过添加--iptables=false来禁用它。