防火墙规则不限制对 Docker Web Apps 的访问

防火墙规则不限制对 Docker Web Apps 的访问

我遇到一个问题,尽管 iptables 配置旨在限制访问,但 Docker 容器中系统上运行的应用程序暴露的端口仍然对全世界开放。

在我看来,问题可能与 docker 守护进程在启动时向 iptables 添加规则有关。我也知道标志--icc=true|false--ip-forward=true|false--iptables=true|false我不确定我应该应用这些标志的哪种组合。我试过了,--icc=false--ip-forward=false都没有达到预期的效果。我不愿意使用,--iptables=false因为 docker 守护进程显然添加了许多规则,如果仍然需要它们,我必须手动配置它们。

这是 docker 守护进程启动之前的规则状态:

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 REJECT     all  --  !lo    any     anywhere             loopback/8           reject-with icmp-port-unreachable
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
    0     0 DROP       all  -f  any    any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
   82  8831 ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp echo-request
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             multiport dports ssh
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 1>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 2>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
    0     0 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
    0     0 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   24  2489 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   77 10080 ACCEPT     all  --  any    any     anywhere             anywhere  

docker 守护进程运行时的情况如下:

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 REJECT     all  --  !lo    any     anywhere             loopback/8           reject-with icmp-port-unreachable
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
    0     0 DROP       all  -f  any    any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
 1335  230K ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    1    32 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp echo-request
    7   380 ACCEPT     tcp  --  any    any     anywhere             anywhere             multiport dports ssh
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 1>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 2>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
   35  2016 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
   62  3672 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
54492   21M DOCKER     all  --  any    docker0  anywhere             anywhere            
51882   20M ACCEPT     all  --  any    docker0  anywhere             anywhere             ctstate RELATED,ESTABLISHED
58371 9122K ACCEPT     all  --  docker0 !docker0  anywhere             anywhere            
    0     0 DROP       all  --  docker0 docker0  anywhere             anywhere            
 1186  121K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2090  263K ACCEPT     all  --  any    any     anywhere             anywhere            

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   86  7048 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.2           tcp dpt:7990
 1639  395K ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.2           tcp dpt:7999
  791  151K ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.3           tcp dpt:http-alt
   20  1898 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.4           tcp dpt:8090
   49  4561 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.5           tcp dpt:18080
   25  3642 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.6           tcp dpt:8095

还有许多 POSTROUTING 和 MASQUERADE 规则,它们不会使用 来显示iptables -L,只有当您使用 时才会显示iptables-save。我也不确定这些规则的意义。

我怀疑 FORWARD 链中的 DOCKER 目标规则是问题的根源,但我看不出如何解决这个问题,因为它似乎是由 docker 守护进程在链的开始处插入的。

那么,有人可以建议我做什么来确保在运行 docker 时端口 7990、8090 等不会暴露给外界吗?

谢谢

理查德

答案1

DOCKER链是FORWARD链上定义的自定义链,当数据包到达any接口,绑定到docker0网桥接口时,会发送到自定义的DOCKER链上。

pkts 字节数 目标 协议 选择加入 退出 源 目标         
54492 21M DOCKER 全部 -- 任何 docker0 任何地点 任何地点            

现在,DOCKER 链将接收所有传入数据包(来自 docker0 的数据包除外),并将它们发送到容器 IP(172.xxx)和端口,在本例中为 7990。

pkts 字节数 目标 协议 选择加入 退出 源 目标         
   86 7048 接受 tcp -- !docker0 docker0 任何地方 172.17.0.2 tcp dpt:7990

如果您要发布输出iptables -t nat -L -n,您将看到DNAT执行主机到容器端口转发的规则,比如说,到达 49154 上的主机接口的数据包将被端口转发到容器 IP 172.17.0.2 和端口 7990。

DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 至:172.17.0.2:7990

例如,您可以通过限制任何 0.0.0.0 的源 IP 来阻止数据包到达容器,以仅允许来自内部网络的数据包。要仅允许从内部网络(例如 192.168.1.0/24)连接到容器端口 7990,您可以运行以下命令 -

/sbin/iptables -I 转发'!'-s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j DROP

这将阻止将任何数据包转发到指定 IP:Port 的容器,除非它们来自内部网络。您可以根据您的设置修改源/目标 IP 和端口。

答案2

因此,这将是一条评论,但没有压力。。serverfault 代表它。

您是否尝试过此处发布的解决方案:http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker

--iptables=false像这样使用这个标志吗DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"

相关内容