ufw 阻止 docker 容器之间的通信

ufw 阻止 docker 容器之间的通信

我为 Magento 实例和 Redis 实例设置了两个 docker 容器。目前,我只想允许某些 IP 地址访问该网站,因此我启用了 ufw 并添加了一些条目。问题是Magento实例无法连接到启用ufw的redis实例。如果我禁用它,一切都会正常。这是我的 ufw 条目:

--                         ------      ----
7722/tcp                   ALLOW       Anywhere
443/tcp                    ALLOW       <censored>
Anywhere                   ALLOW       172.17.0.0/16
Anywhere                   ALLOW       <censored>
Anywhere                   ALLOW       172.20.0.0/16
Anywhere                   ALLOW       127.0.0.1
6379                       ALLOW       172.20.0.0/16
3306                       ALLOW       172.20.0.0/16
6379                       ALLOW       127.0.0.1
6379                       ALLOW       172.17.0.0/16
6379                       ALLOW       <censored>
6379                       ALLOW       172.20.0.5
6379                       ALLOW       172.20.0.7
Anywhere                   ALLOW       172.20.0.5
Anywhere                   ALLOW       172.20.0.7
Anywhere                   ALLOW       <censored>
Anywhere                   ALLOW       127.0.0.0/8
Anywhere                   ALLOW       172.16.0.0/16
6379/tcp                   ALLOW       Anywhere
7722/tcp (v6)              ALLOW       Anywhere (v6)
6379/tcp (v6)              ALLOW       Anywhere (v6)

Anywhere                   ALLOW OUT   172.17.0.0/16 on docker0

Aug 1 20:35:52 <censored> kernel: [14792.173011] [UFW BLOCK] IN=br-d212b7b554b0 OUT=br-d212b7b554b0 PHYSIN=veth9ca196b PHYSOUT=vethbce3637 MAC=<censored>:14:00:05:08:00 SRC=172.20.0.5 DST=172.20.0.7 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=35267 DF PROTO=TCP SPT=45680 DPT=6379 WINDOW=64240 RES=0x00 SYN URGP=0

有任何想法吗?

答案1

码头工人,在其代码中,加载br_netfilter并从而启用 sysctl net.bridge.bridge-nf-call-iptables = 1

这使得第 2 层的桥接流量受到 iptables 的防火墙保护。尽管iptables仅处理 IPv4 数据包,br_netfilter将 IPv4 类型的以太网帧来回转换为数据包,以便过滤它们。

在下图中,蓝色字段(以太网桥接)中的绿色框(IPv4 过滤),而不是通常的绿色字段(IPv4 路由)。

Netfilter 和通用网络中的数据包流

Docker 最好不要与同一系统上的其他网络工具一起使用,因为会发生冲突。

那里描述了许多副作用:http://ebtables.netfilter.org/br_fw_ia/br_fw_ia.html

他们之中:7. 帧/数据包通过 iptables PREROUTING、FORWARD 和 POSTROUTING 链的两种可能方式

为了与 Docker 兼容,您应该遵循以下建议:始终启用从 LAN 到自身的流量。所以要解决OP的日志:

ufw route allow from 172.20.0.0/16 to 172.20.0.0/16

这通常没有意义,因为不涉及路由(转发),除了......第7节,所以应该加上。并且应该为 Docker 管理的每个 LAN 添加相同的内容,否则 UFW 将干扰 Docker 所实施的操作。当然,这是有问题的,因为这些网络是动态的,UFW 很快就会受到限制。

iptables对此有一个特殊的匹配:physdev(这确实取决于br_netfilter) 可以与 (-A可以替换为-I并且根据 Docker 和 UFW 的配置尚未选择正确的链):

iptables -A choosetherightchain -m physdev --physdev-is-bridged -j ACCEPT

但与 UFW 的集成将开始使 UFW 不仅仅是 UFW,而是低级直接的混合体iptables规则和 UFW 规则。

另请参阅具有相同问题的 Q/A,其中我回答了如何将其与nftables同时试图保持通用:nftables 白名单 docker

相关内容