在 iptables 中使用 PREROUTING 丢弃数据包

在 iptables 中使用 PREROUTING 丢弃数据包

一致认为,过滤表是丢弃数据包的最佳位置。

但是,Docker 开箱即用,通过 PREROUTING 绕过 INPUT 过滤规则到其自己的 FORWARD 规则,从而使 Docker 容器可以在全世界范围内访问。插入DOCKER-named 过滤器 INPUT/FORWARD 规则失败,因为当 Docker 重新启动时,它们会被删除然后插入(而不是附加)。

我最好的尝试是在 Docker 之前插入另一个 PREROUTING 链,并将不需要的数据包从 eth0 (WAN) 发送到黑洞 -0.0.0.1- 因为你不能再在 nat 表中 DROP/REJECT 了。

# 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

以下是 Docker 和一个正在运行的容器时 NAT 链的样子:

Nat表规则

这似乎工作得很好,但是,有没有办法在到达其他预路由规则之前显式拒绝数据包?

(Alpine Linux 3.6.2,Docker v17.05.0-ce)

答案1

我遇到了类似的问题,即使有人部署将应用程序绑定到任何地址的容器,也需要“强化”网络流量:0.0.0.0:port

Docker 提供了一个DOCKER-USER过滤器链,但看起来所有的魔法都发生DOCKERPREROUTING.

所以没有办法解决这个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

就是这样!

数据包会跳转到该DOCKER-BLOCK链,如果该链是空的,它会跳出该链并继续PREROUTING跳转,RETURN并且会被阻塞。

启用端口时:

iptables -t nat -I DOCKER-BLOCK -p tcp -m tcp --dport 1234 -j DOCKER

它将使数据包跳回DOCKER由 管理的链docker。 Docker 应该处理数据包,并且永远不应该到达RETURN来源。PREROUTING

最好的办法是,你PREROUTING再也不用碰桌子了,如果你想冲水,直接冲水即可DOCKER-BLOCK

答案2

DOCKER-BLOCK 方法的问题是,如果您想阻止主机和容器的流量,例如阻止 tcp 端口 50,您需要将其添加到 DOCKER-BLOCK 链(以绕过 docker 规则)和 INPUT 链中(执行实际的下降)。

相关内容