Loading... # UFW防火墙无法拦截Docker端口 CentOS换Debian,系统防火墙是UFW,即便在防火墙拦截了Docker映射到宿主机的端口,该端口也还是可以正常访问。 Github有个大佬提供了解决方案,原文地址:https://github.com/chaifeng/ufw-docker 修改 UFW 的配置文件 `/etc/ufw/after.rules`,在最后添加上如下规则: ```shell # 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 -m conntrack --ctstate RELATED,ESTABLISHED -j RETURN -A DOCKER-USER -m conntrack --ctstate INVALID -j DROP -A DOCKER-USER -i docker0 -o docker0 -j ACCEPT -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 -j ufw-docker-logging-deny -m conntrack --ctstate NEW -d 10.0.0.0/8 -A DOCKER-USER -j ufw-docker-logging-deny -m conntrack --ctstate NEW -d 172.16.0.0/12 -A DOCKER-USER -j ufw-docker-logging-deny -m conntrack --ctstate NEW -d 192.168.0.0/16 -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 DROP COMMIT # END UFW AND DOCKER ``` 然后重启 UFW,`sudo systemctl restart ufw`。现在外部就已经无法访问 Docker 发布出来的任何端口了,但是容器内部以及私有网络地址上可以正常互相访问,而且容器也可以正常访问外部的网络。**可能由于某些未知原因,重启 UFW 之后规则也无法生效,请重启服务器。** 如果希望允许外部网络访问 Docker 容器提供的服务,比如有一个容器的服务端口是 `80`。那就可以用以下命令来允许外部网络访问这个服务: ```notranslate ufw route allow proto tcp from any to any port 80 ``` 这个命令会允许外部网络访问所有用 Docker 发布出来的并且内部服务端口为 `80` 的所有服务。 请注意,这个端口 `80` 是容器的端口,而非使用 `-p 0.0.0.0:8080:80` 选项发布在服务器上的 `8080` 端口。 如果有多个容器的服务端口为 80,但只希望外部网络访问某个特定的容器。比如该容器的私有地址为 `172.17.0.2`,就用类似下面的命令: ```notranslate ufw route allow proto tcp from any to 172.17.0.2 port 80 ``` 如果一个容器的服务是 UDP 协议,假如是 DNS 服务,可以用下面的命令来允许外部网络访问所有发布出来的 DNS 服务: ```notranslate ufw route allow proto udp from any to any port 53 ``` 同样的,如果只针对一个特定的容器,比如 IP 地址为 `172.17.0.2`: ```notranslate ufw route allow proto udp from any to 172.17.0.2 port 53 ``` 最后修改:2026 年 05 月 17 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏