Hugo博客公告弹窗

ufw-docker 防火墙工具

项目: https://github.com/chaifeng/ufw-docker

下载 ufw-docker 脚本

sudo wget -O /usr/local/bin/ufw-docker \
  https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
chmod +x /usr/local/bin/ufw-docker

使用下列命令来修改 ufw 的 after.rules 文件

ufw-docker install

重载ufw

sudo ufw reload

这个命令做了以下事情:

  • 备份文件 /etc/ufw/after.rules
  • 把 UFW 和 Docker 的相关规则添加到文件 after.rules 的末尾

仅允许特定ip访问

可以在修改前先备份一下当前规则:

sudo iptables-save > ~/iptables-backup-$(date +%F-%H%M%S).bak

这样如果不小心搞坏了,可以快速还原:

  1. 查看
ls ~/iptables-backup-*.bak
  1. 还原
sudo iptables-restore < ~/iptables-backup-xxx.bak

例如: 仅允许192.168.1.11访问5021端口

sudo iptables -I DOCKER-USER 1 -s 192.168.1.11 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 2 -p tcp --dport 5021 -j DROP

注意:5021为容器内部端口

允许Cloudflare的IP范围访问5021端口

如果你要开启域名访问,且开启了cf cdn,把5021改成你想要的端口即可

sudo iptables -I DOCKER-USER 1 -s 103.21.244.0/22 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 2 -s 103.22.200.0/22 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 3 -s 103.31.4.0/22 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 4 -s 104.16.0.0/13 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 5 -s 104.24.0.0/14 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 6 -s 108.162.192.0/18 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 7 -s 131.0.72.0/22 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 8 -s 141.101.64.0/18 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 9 -s 162.158.0.0/15 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 10 -s 172.64.0.0/13 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 11 -s 173.245.48.0/20 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 12 -s 188.114.96.0/20 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 13 -s 190.93.240.0/20 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 14 -s 197.234.240.0/22 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 15 -s 198.41.128.0/17 -p tcp --dport 5021 -j ACCEPT
sudo iptables -I DOCKER-USER 16 -p tcp --dport 5021 -j DROP

允许Cloudflare的IPv6范围访问5021端口

sudo ip6tables -I DOCKER-USER 1 -s 2400:cb00::/32 -p tcp --dport 5021 -j ACCEPT
sudo ip6tables -I DOCKER-USER 2 -s 2606:4700::/32 -p tcp --dport 5021 -j ACCEPT
sudo ip6tables -I DOCKER-USER 3 -s 2803:f800::/32 -p tcp --dport 5021 -j ACCEPT
sudo ip6tables -I DOCKER-USER 4 -s 2405:b500::/32 -p tcp --dport 5021 -j ACCEPT
sudo ip6tables -I DOCKER-USER 5 -s 2405:8100::/32 -p tcp --dport 5021 -j ACCEPT
sudo ip6tables -I DOCKER-USER 6 -s 2a06:98c0::/29 -p tcp --dport 5021 -j ACCEPT
sudo ip6tables -I DOCKER-USER 7 -s 2c0f:f248::/32 -p tcp --dport 5021 -j ACCEPT

最后禁止其他所有IPv6来源访问5021端口

sudo ip6tables -I DOCKER-USER 8 -p tcp --dport 5021 -j DROP

查看规则

sudo ip6tables -L DOCKER-USER -n -v --line-numbers

验证规则顺序

sudo iptables -vnL DOCKER-USER --line-numbers

保存规则(防止重启丢失)

sudo iptables-save > /etc/iptables/rules.v4

删除规则

例如删除第一条规则

iptables -D DOCKER-USER 1

如果需要更换 ip,则先清理旧规则,再重复前面一遍

sudo iptables -D DOCKER-USER -s 192.168.1.11 -p tcp --dport 5021 -j ACCEPT
sudo iptables -D DOCKER-USER -p tcp --dport 5021 -j DROP

临时清除 DOCKER-USER 链规则(恢复访问)

sudo iptables -F DOCKER-USER

允许外部网络访问

如果希望允许外部网络访问 Docker 容器提供的服务,比如有一个容器的服务端口是 80。那就可以用以下命令来允许外部网络访问这个服务:

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,就用类似下面的命令:

ufw route allow proto tcp from any to 172.17.0.2 port 80

如果一个容器的服务是 UDP 协议,假如是 DNS 服务,可以用下面的命令来允许外部网络访问所有发布出来的 DNS 服务:

ufw route allow proto udp from any to any port 53

同样的,如果只针对一个特定的容器,比如 IP 地址为 172.17.0.2:

ufw route allow proto udp from any to 172.17.0.2 port 53

使用方法

显示帮助

ufw-docker help

检查 UFW 配置文件中防火墙规则的安装

ufw-docker check

更新 UFW 的配置文件,添加必要的防火墙规则

ufw-docker install

显示当前防火墙允许的转发规则

ufw-docker status

列出所有和容器 httpd 相关的防火墙规则

ufw-docker list httpd

暴露容器 httpd80 端口

ufw-docker allow httpd 80

暴露容器 httpd443 端口,且协议为 tcp

ufw-docker allow httpd 443/tcp

如果容器 httpd 绑定到多个网络上,暴露其 443 端口,协议为 tcp,网络为 foobar-external-network

ufw-docker allow httpd 443/tcp foobar-external-network

把容器 httpd 的所有映射端口都暴露出来

ufw-docker allow httpd

删除所有和容器 httpd 相关的防火墙规则

ufw-docker delete allow httpd

删除容器 httpdtcp 端口 443 的规则

ufw-docker delete allow httpd 443/tcp

暴露服务 web80 端口

docker service create --name web --publish 8080:80 httpd:alpine

ufw-docker service allow web 80
# 或者
ufw-docker service allow web 80/tcp

删除与服务 web 相关的规则

ufw-docker service delete allow web
CC BY-NC-SA 4.0 转载请注明
最后更新于 2025-05-02 16:22
clarity统计