下载 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访问
例如: 仅允许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为容器内部端口,如果要反代域名访问,请使用以下方式(允许外部网络访问)
验证规则顺序
sudo iptables -L DOCKER-USER -n --line-numbers
持久化规则(避免重启丢失)
sudo apt install iptables-persistent
sudo netfilter-persistent save
如果需要更换 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 容器提供的服务,比如有一个容器的服务端口是 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
暴露容器 httpd
的 80
端口
ufw-docker allow httpd 80
暴露容器 httpd
的 443
端口,且协议为 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
删除容器 httpd
的 tcp
端口 443
的规则
ufw-docker delete allow httpd 443/tcp
暴露服务 web
的 80
端口
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