Dra*_*kes 5 firewall iptables docker alpine-linux
过滤表是丢弃数据包的最佳位置,同意。
但是,开箱即用,Docker 通过 PREROUTING 绕过 INPUT 过滤器规则到它自己的 FORWARD 规则,使 Docker 容器世界可访问。插入DOCKER 命名的过滤器 INPUT/FORWARD 规则失败,因为当 Docker 重新启动时,它们被删除然后插入(未附加)。
我最好的尝试是在 Docker 之前插入另一个 PREROUTING 链,并将不需要的数据包从 eth0 (WAN) 发送到黑洞 - 0.0.0.1 - 因为您不能再在 nat 表中删除/拒绝。
# Route anything but TCP 80,443 and ICMP to an IPv4 black hole
iptables -t nat -N BLACKHOLE
iptables -t nat -A BLACKHOLE ! -i eth0 -j RETURN
iptables -t nat -A BLACKHOLE -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
iptables -t nat -A BLACKHOLE -p tcp --dport 80 -j RETURN
iptables -t nat -A BLACKHOLE -p tcp --dport 443 -j RETURN
iptables -t nat -A BLACKHOLE -p icmp -j RETURN
iptables -t nat -A BLACKHOLE -p all -j DNAT --to 0.0.0.1
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j BLACKHOLE
Run Code Online (Sandbox Code Playgroud)
下面是 NAT 链在 Docker 和一个容器运行时的样子:
不过,这似乎工作得很好,有没有办法在达到其他路由前规则之前明确拒绝数据包?
(Alpine Linux 3.6.2, Docker v17.05.0-ce)
我遇到了类似的问题,即使有人部署将应用程序绑定到任何地址的容器,也需要“强化”网络流量:0.0.0.0:port
。
Docker 提供了一个DOCKER-USER
过滤器链,但看起来所有的魔法都发生DOCKER
在PREROUTING
.
因此,在过滤之前没有办法解决这个nat
问题,而且我不想过多地接触 docker 规则。
我不喜欢必须再次更改数据包的想法,因此我想出了一个方案,默认情况下返回所有内容,并在调用PREROUTING
之前跳转到另一个链。 DOCKER
DOCKER
然后,当我认为交通状况良好时,我会选择性地跳回。
这是代码:
iptables -t nat -N DOCKER-BLOCK
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j RETURN
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j DOCKER-BLOCK
Run Code Online (Sandbox Code Playgroud)
就是这样!
数据包会跳转到该DOCKER-BLOCK
链,如果该链是空的,它会跳出该链并继续PREROUTING
跳转RETURN
,并且会被阻塞。
当您启用端口时:
iptables -t nat -I DOCKER-BLOCK -p tcp -m tcp --dport 1234 -j DOCKER
Run Code Online (Sandbox Code Playgroud)
它将使数据包跳回DOCKER
由 管理的链docker
。Docker 应该处理数据包,并且永远不应该到达RETURN
来源。PREROUTING
最好的办法是,你再也不用碰桌子了PREROUTING
,如果你想冲水,直接冲水即可DOCKER-BLOCK
。
归档时间: |
|
查看次数: |
11495 次 |
最近记录: |