我为 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 路由)。
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