Debian12 安装 UFW 后安装 docker,在 /etc/docker/daemon.json
文件内设置"iptables":false
,以便关闭 docker 创建自己的规则,防止跳过 UFW 的限制。但同时这样操作以后,容器之间就无法互相访问,导致容器 ngixn 无法访问 wordpress 内的 php fpm,网站无法正常运行。同时,容器无法访问外网,wordpress无法访问插件、主题等网站内容,无法更新。可通过以下操作解决此类问题
sudo iptables -A FORWARD -s 172.21.1.0/24 -j ACCEPT
命令分解
sudo
:以超级用户(root)权限运行命令。这是因为修改iptables
需要管理员权限。iptables
:用于配置 Linux 内核防火墙的命令行工具。-A FORWARD
:指定将一条新规则添加到FORWARD
链。-s 172.21.1.0/24
:指定源地址是172.21.1.0/24
,即所有来自172.21.1.0
到172.21.1.255
的流量。这里/24
表示子网掩码为 255.255.255.0。-j ACCEPT
:指定匹配到该规则的流量应被接受。
详细解释
- sudo:
sudo
命令允许普通用户以超级用户权限执行命令。因为修改iptables
需要系统管理员权限,所以必须以sudo
来运行。
- iptables:
iptables
是一个用户空间命令行工具,用于设置、维护和检查 Linux 内核的netfilter
防火墙规则。
- -A FORWARD:
-A
表示添加(Append)一条新规则到指定链。链是iptables
的基础,每条链包含一组规则。FORWARD
链用于处理那些转发的网络数据包,这些数据包既不是本地生成的也不是本地接收的,而是从一个网络接口到另一个网络接口。
- -s 172.21.1.0/24:
-s
参数指定数据包的源地址(Source Address)。172.21.1.0/24
是一个子网,表示源地址可以是172.21.1.0
到172.21.1.255
。这里/24
是子网掩码,等同于 255.255.255.0,表示前 24 位是网络部分,后 8 位是主机部分。
- -j ACCEPT:
-j
参数指定匹配到该规则的数据包将跳转(Jump)到指定的目标动作(Target Action)。ACCEPT
表示允许数据包通过(Accept the packet)。也就是说,所有匹配该规则的数据包将被允许继续转发到目的地。
整体意义
这条 iptables
规则的整体作用是:
– 允许所有源地址是 172.21.1.0/24
的数据包通过 FORWARD 链。也就是说,凡是从 172.21.1.0
到 172.21.1.255
这个子网来的数据包都将被允许继续转发,而不会被防火墙阻止。
这条命令的意义是允许 Docker 容器子网 172.21.1.0/24
内的所有容器之间的流量转发。这对于运行多个容器并且它们需要相互通信的环境非常重要。通过这条规则,容器之间的网络通信不会被防火墙阻止,从而保证应用程序的正常运行。
要将 iptables
规则添加到 ufw
中,可以通过修改 ufw
的配置文件 after.rules
来实现。以下是具体步骤:
修改 ufw
的 after.rules
- 打开
before.rules
文件:
使用你喜欢的文本编辑器来编辑before.rules
文件。这个文件通常位于/etc/ufw/
目录下。sudo nano /etc/ufw/before.rules
- 在文件中添加
iptables
规则:
在文件中适当的位置添加以下内容。通常建议将其放在文件末尾的COMMIT
之前。# BEGIN CUSTOM RULES FOR DOCKER *filter # 无需添加自定义链条 # :DOCKER-USER - [0:0] # -A DOCKER-USER -s 172.21.1.0/24 -j ACCEPT # 直接添加 -A FORWARD -s 172.21.1.0/24 -j ACCEPT COMMIT # END CUSTOM RULES FOR DOCKER
这段代码的意义:
*filter
:定义了一个filter
表。:DOCKER-USER - [0:0]
:定义了一个新的DOCKER-USER
链。-A DOCKER-USER -s 172.21.1.0/24 -j ACCEPT
:添加了一条规则,允许来自172.21.1.0/24
子网的流量。COMMIT
:提交这些规则。
- 保存并关闭文件:
在nano
编辑器中,按Ctrl+O
保存文件,按Ctrl+X
退出编辑器。
重新加载 ufw
为了使新添加的规则生效,需要重新加载 ufw
。
sudo ufw reload
验证规则
可以通过以下命令检查 iptables
规则,确认新规则是否生效:
sudo iptables -L FORWARD -v -n
注意事项
- 防火墙安全性:确保其他的
ufw
规则依然生效,防止不必要的端口暴露给外网。 - 规则顺序:在
ufw
中规则的顺序很重要,确保你的自定义规则不会被其他规则覆盖或冲突。 - 备份配置文件:在修改任何配置文件之前,建议备份原始文件,以便在出现问题时能够恢复。
通过上述步骤,你可以将 iptables
规则集成到 ufw
中,使其在系统重启后依然有效,确保 Docker 容器之间的流量转发正常工作。