Docker 端口映射防火墙规则配置
背景
当 docker 使用端口映射时, docker daemon 会创建 DOCKER 链绕过 firewalld 建立 iptables 规则,可能使 firewall 规则失效。
可以通过修改 DOCKER-USER 链来管理 docker 的防火墙规则或禁用 firewalld 直接配置 iptables(不推荐)
1. 停止 docker
不要在 Docker 运行时 Reload firewalld,否则会导致 Docker 链被删除
systemctl stop docker
2. 清除并重建自定义规则链
firewall-cmd --permanent --direct --remove-chain ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --remove-rules ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER
3. 允许 Docker 容器出站流量返回
使用 conntrack
模块匹配 RELATED
, ESTABLISHED
两种状态的连接
# 允许出站流量返回,因为建立连接 ESTABLISHED 的数据包已经通过了防火墙的出站规则。
# 此规则优先级为 1
# 没有完全理解这个逻辑,但是加了这条容器内就可以联网了
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT \
-m comment --comment 'Allow containers to connect to the outside world'
4. 配置白名单
# 允许来自 IP 段的所有流量
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
-s 10.60.22.0/24 -j ACCEPT \
-m comment --comment 'Allow IP 10.60.22.0/24 to access'
5. 配置默认阻止
# 阻止其他的流量
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 10 \
-j REJECT -m comment --comment 'reject all other traffic to DOCKER-USER'
6. Reload 防火墙
firewall-cmd --reload
firewall-cmd --get-active-zones
7. 重启 docker
systemctl start docker