从此
文章
📄文章 #️⃣专题 🌐上网 📺 🛒 📱

docker、podman转发端口与ufw防火墙、firewalld、iptables和平共存

🕗2023-04-08

并存docker和ufw(或其他基于iptables的防火墙)会出现一些问题。

传统搞法是禁止docker操作iptables,但这样docker的网络基本就废了。

可以用下面的工具解决:

1 安装

wget -O /usr/local/bin/ufw-docker \
https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker


chmod +x /usr/local/bin/ufw-docker


sudo ufw-docker install


systemctl restart ufw

 

2 启用某个docker得外网访问

上面工具安装完毕后,UFW就生效了,但是所有默认内网得docker容器都无法暴露给外网了

如果想让外网生效,如下操作:

# 允许nginx这个docker的80的tcp端口暴露给外网。
sudo ufw-docker allow nginx 80/tcp
 
 
# 允许xx容器得所有端口
sudo ufw-docker allow xx

一定注意这个80是nginx容器publish得端口,并不是容器内部端口哦!

3 其他管理

# 查看状态
sudo ufw-docker status

需要注意得是:

原文 - 让Docker和UFW和平相处


podman的网络使用的是 iptables 的转发。不支持ufw开放/禁用 端口。
开了ufw防火墙后,podman 转发的端口基本上就只能本地访问了。这是个大坑

方法1

ifconfig

执行后,可以找到一些 cni-popdman0 这种的interface。
使用iptables对所有的相关cni都转发一下 例如:

iptables -I FORWARD -p tcp ! -i cni-podman0 -o cni-podman0 -j ACCEPT

这样,即使开启着 ufw。你的podman的端口也能通过外部访问了。
不过不安全。这是全部转发的端口都允许了。所以只是临时方案。否则只能关闭ufw(不能接受)

方法2


firewalld和docker服务冲突原因:

如果同时启用了firewalld和docker服务,他们都会对iptables里面的转发链写入规则,firewalld每次启动或者重启都会强制覆盖docker的转发链,同时,docker也会通过更高优先级的策略使firewalld里面配置的条目失效。 

具体冲突的原因见Docker官方文档:https://docs.docker.com/network/iptables/

解决方案:

方案1:

当启动firewalld出现冲突的时候,首先重启firewalld,然后重启docker,注意顺序不可以反过来。

方案2:

仅限于Docker版本大于等于 20.10.0

Docker在最新的版本里自动创建了一个名为docker的 firewalld zone,并把它的所有网络接口(包括docker0)加入到了这个区域里面,执行下面的命令将你的docker0接口移到docker区域。

 
  1. firewall-cmd --zone=trusted --remove-interface=docker0 --permanent
  2. firewall-cmd --reload