前言
很多海外特价机不带网页防火墙,用 ufw 来当防火墙会遇到一个问题:Docker 会无视 ufw 规则,直接把端口暴露到公网。
安全原则是,端口放行最小化,能少开就少开、能不开就不开,所以必须想办法解决这个问题。
折腾了一圈,感觉最优雅的办法是用 ufw-docker 脚本。
我的使用场景是:Debian 系统、Docker Compose 部署应用、1Panel 绑域名,如果场景相同可以继续看。
核心思路:分工合作
- ufw: 只管主机本身。例如 SSH 端口、面板端口,以及各种主机上的服务端口。
- ufw-docker: 只管 Docker 容器。精确管理 Docker 映射出来的容器端口。
第一部分:一次性初始化设置
一、ufw 初始化
-
安装 ufw
sudo apt update sudo apt install ufw -y -
设置默认策略 拒绝所有入站请求,放行所有出站请求。这是最基础的安全设置。
sudo ufw default deny incoming sudo ufw default allow outgoing -
放行基础服务端口
重要提示在启用防火墙前,必须先为 SSH 等基础服务留门,否则会立即失联。 必须将示例命令中的端口改为自己实际的端口。
# 示例:假设 SSH 端口为 55555 sudo ufw allow 55555/tcp # 示例:假设 1Panel 访问端口为 66666 sudo ufw allow 66666/tcp -
启用 ufw
sudo ufw enable看到提示后,输入
y并回车。
二、ufw-docker 初始化
本项目来自 github 作者 chaifeng,请点一个免费的 star 支持一下:
-
下载脚本并授权
sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker sudo chmod +x /usr/local/bin/ufw-docker -
自动安装 该命令会自动修改 ufw 的配置文件,使其能够接管 Docker 的网络规则。
sudo ufw-docker install -
重载防火墙使其生效
sudo ufw reload
至此,所有初始化工作完成。
第二部分:日常使用示例
一、管理容器端口 (使用 ufw-docker)
场景: 部署了一个名为 sillytavern 的 Docker 应用,需要对外放行其 8000 端口。
-
放行端口 首先通过
docker ps确认容器名为sillytavern,然后执行:sudo ufw-docker allow sillytavern -
检查状态 使用
ufw status numbered查看所有规则,确认新规则已添加。Status: active To Action From -- ------ ---- [ 1] 55555/tcp ALLOW IN Anywhere [ 2] 66666/tcp ALLOW IN Anywhere [ 3] 172.19.0.2 8000/tcp ALLOW FWD Anywhere # allow sillytavern 8000/tcp sillytavern_default ... -
删除规则 应用绑定域名了、或者卸载了不再使用了,通过序号精确删除规则。
sudo ufw delete 3或者通过这个命令删除
sillytavern这个容器的全部相关规则。sudo ufw-docker delete allow sillytavern
场景二:管理主机端口 (使用 ufw)
场景: 通过 1Panel 的 OpenResty 部署了网站,需要放行 80 和 443 端口。
1Panel 的 OpenResty 容器的网络模式是 host ,直接使用主机网络,因此可视作主机上的服务,使用 ufw 而非 ufw-docker 命令。
-
放行端口 直接使用
ufw命令为主机放行端口:sudo ufw allow 80/tcp sudo ufw allow 443/tcp -
检查状态 再次查看规则列表,会发现多了两条
ufw的规则。Status: active To Action From -- ------ ---- [ 1] 55555/tcp ALLOW IN Anywhere [ 2] 66666/tcp ALLOW IN Anywhere [ 3] 80/tcp ALLOW IN Anywhere [ 4] 443/tcp ALLOW IN Anywhere ... -
删除规则 如果不再需要任何网站,同样按序号删除。
重要提示如果要一次性删除多条规则,从序号大的开始删,避免序号错乱!
# 先删序号大的 sudo ufw delete 4 # 再删序号小的 sudo ufw delete 3
第三部分:常用命令
1. 通用命令
| 功能 | 命令 | 说明 |
|---|---|---|
| 查看状态 | sudo ufw status | 显示当前所有规则 |
| 查看带序号的状态 | sudo ufw status numbered | 日常使用或配合删除查看序号 |
| 按序号删除规则 | sudo ufw delete <序号> | 推荐,删除任何来源的规则 |
| 启用防火墙 | sudo ufw enable | |
| 禁用防火墙 | sudo ufw disable | |
| 重新加载规则 | sudo ufw reload |
2. 主机规则 (ufw)
| 功能 | 命令 |
|---|---|
| 放行端口 | sudo ufw allow <端口>/<协议> |
| 拒绝端口 | sudo ufw deny <端口>/<协议> |
3. 容器规则 (ufw-docker)
| 功能 | 命令 |
|---|---|
| 放行容器所有已发布端口 | sudo ufw-docker allow <容器名> |
| 精确放行容器端口 | sudo ufw-docker allow <容器名> <端口>/<协议> |
| 删除某容器相关的规则 | sudo ufw-docker delete allow <容器名> |
| 查看已放行的容器规则 | sudo ufw-docker status |
| 检查安装状态 | sudo ufw-docker check |
喜欢的话,留下你的评论吧~