众所周知
在我们打开1panel面板的防火墙的时候总是会有一小行文字提示:
Linux 防火墙 ufw 无法禁用 Docker 端口映射,应用可以在 [已安装] 页面编辑参数来控制端口是否放开
这就让人非常烦恼,因为只写了通过应用商店安装的docker如何管理端口映射,并未说明从非应用商店安装的第三方docker如何管理端口映射,经过在网上的一番资料搜索,我找到了以下适用于1panel的方法~
教程开始
这种方法通过直接修改UFW的配置文件,使其规则能够正确处理Docker容器的流量。
1.编辑UFW的after.rules文件:
vi /etc/ufw/after.rules
在文件末尾, COMMIT 行之后,添加以下规则:
# BEGIN UFW AND DOCKER*filter:ufw-user-forward - [0:0]:ufw-docker-logging-deny - [0:0]:DOCKER-USER - [0:0]-A DOCKER-USER -j ufw-user-forward-A DOCKER-USER -j RETURN -s 10.0.0.0/8-A DOCKER-USER -j RETURN -s 172.16.0.0/12-A DOCKER-USER -j RETURN -s 192.168.0.0/16-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12-A DOCKER-USER -j RETURN-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "-A ufw-docker-logging-deny -j DROPCOMMIT# END UFW AND DOCKER
这些规则的主要作用是:允许私有网络(如10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)的流量通过,同时拦截并记录未授权的外部访问尝试。
重启UFW以应用更改:
systemctl restart ufw
允许特定容器端口的外部访问:
配置完成后,默认所有Docker映射的端口外部都无法访问。如需开放某个容器的特定服务端口(例如容器内部的80端口),请使用 ufw route allow 命令,因为经过我的测试在1p面板内的防火墙添加的规则不知道为什么似乎不会生效~还是要靠这个命令添加后才正常:
ufw route allow proto tcp from any to any port 80
此命令开放的是容器的服务端口(80),而非宿主机映射的端口(如8080)。如果只想允许访问特定IP的容器,可将 to any 替换为 to <容器IP> ,例如 to 172.17.0.2 。
删除规则
执行以下命令,UFW 会列出所有当前生效的规则,并显示编号:
ufw status numbered
记下你想要删除的那条规则最前面的编号后,使用 delete 命令跟上编号进行删除。务必确认编号正确,以免误删其他规则。
ufw delete 编号
发表回复