type
status
date
slug
summary
category
tags
icon
Uncomplicated Firewall (UFW) 是常用的管理 netfilter 防火墙的程序,具有易上手的特点广受欢迎。但是直接安装的 UFW (
apt-install ufw
) 无法管理 docker 的服务端口,私有服务有在公网暴露的风险。因此,需要进一步设置规则让 ufw 接管 docker 的服务端口访问。使用 ufw-docker 避免直接配置防火墙,更加简便。安装ufw-docker
下载
ufw-docker
脚本使用下列命令来修改 ufw 的
after.rules
文件这个命令做了以下事情:
- 备份文件
/etc/ufw/after.rules
- 把 UFW 和 Docker 的相关规则添加到文件
after.rules
的末尾
使用方法
显示帮助
检查 UFW 配置文件中防火墙规则的安装
更新 UFW 的配置文件,添加必要的防火墙规则
显示当前防火墙允许的转发规则
列出所有和容器
httpd
相关的防火墙规则暴露容器
httpd
的 80
端口暴露容器
httpd
的 443
端口,且协议为 tcp
如果容器
httpd
绑定到多个网络上,暴露其 443
端口,协议为 tcp
,网络为 foobar-external-network
把容器
httpd
的所有映射端口都暴露出来删除所有和容器
httpd
相关的防火墙规则删除容器
httpd
的 tcp
端口 443
的规则暴露服务
web
的 80
端口删除与服务
web
相关的规则使用案例
如果希望允许外部网络访问 Docker 容器提供的服务,比如有一个容器的服务端口是
80
。那就可以用以下命令来允许外部网络访问这个服务:这个命令会允许外部网络访问所有用 Docker 发布出来的并且内部服务端口为
80
的所有服务。请注意,这个端口
80
是容器的端口,而非使用 -p 0.0.0.0:8080:80
选项发布在服务器上的 8080
端口。如果有多个容器的服务端口为 80,但只希望外部网络访问某个特定的容器。比如该容器的私有地址为
172.17.0.2
,就用类似下面的命令:如果一个容器的服务是 UDP 协议,假如是 DNS 服务,可以用下面的命令来允许外部网络访问所有发布出来的 DNS 服务:
同样的,如果只针对一个特定的容器,比如 IP 地址为
172.17.0.2
:报错及解决
安装可能会遇到报错:
/usr/local/bin/ufw-docker: line 7: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
解决办法
直接使用命令设置:
sudo locale-gen en_US.UTF-8
重新配置系统的 locale 设置:
来选择要编译的本地语言。或者,直接编辑该文件:
并取消注释所需的本地语言,然后运行:
推荐阅读
有关 ufw-docker 安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~