修复系统防火墙无法管理 Docker 端口问题

部署 Docker 服务的时候,通过-p映射的端口,会自动在 iptables 中建立规则,绕过 UFW 系统防火墙,这样端口都是对外网敞开大门的,会有安全隐患。

解决这个问题也很简单,映射端口的时候加上127.0.0.1,例如:

1
-p 127.0.0.1:1234:1234

这样这个端口就只能本地访问了,可以通过 Nginx 之类的反代,从而达到隐藏端口而外网也可以使用的效果。

但如果你有端口对外开放的需求,但是又想通过 UFW 来管理,就不能用这个办法了,而是要通过修改 UFW 的配置文件来解决这个问题。

修改配置:

1
vim /etc/ufw/after.rules

添加规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 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 DROP

COMMIT
# END UFW AND DOCKER

重启UFW:

1
systemctl restart ufw

现在外部就无法访问 Docker 映射的端口了,但是容器内部以及私有网络地址上可以正常互相访问,而且容器也可以正常访问外部的网络。

如果你需要打开某个 Docker 端口的外部访问权限的话,例如1234端口,需要执行以下命令:

1
2
ufw route allow 1234
ufw allow 1234

这样这个端口就被 UFW 正确的接管且开放了。