docker、podman转发端口与ufw防火墙、firewalld、iptables和平共存
并存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容器都无法暴露给外网了
如果想让外网生效,如下操作:
一定注意这个80是nginx容器publish得端口,并不是容器内部端口哦!
3 其他管理
需要注意得是:
- 如果docker得IP发生变化,可能需要重新更新ufw-docer得防火墙规则。
- 如果上面这个让你不爽,可以docker建一个网络,然后使用固定IP
- 如果你得docker容器里自己设定了一些奇怪得iptables,可能需要在ufw中也设置allow一下。
原文 - 让Docker和UFW和平相处
podman的网络使用的是 iptables 的转发。不支持ufw开放/禁用 端口。
开了ufw防火墙后,podman 转发的端口基本上就只能本地访问了。这是个大坑
方法1
执行后,可以找到一些 cni-popdman0 这种的interface。
使用iptables对所有的相关cni都转发一下 例如:
这样,即使开启着 ufw。你的podman的端口也能通过外部访问了。
不过不安全。这是全部转发的端口都允许了。所以只是临时方案。否则只能关闭ufw(不能接受)
方法2
- 编辑
/etc/default/ufw
修改DEFAULT_FORWARD_POLICY
的值为ACCEPT
sudo ufw reload
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
区域。
-
firewall-cmd --zone=trusted --remove-interface=docker0 --permanent
-
firewall-cmd --reload