为无面板防火墙的云服务器安全配置 ufw 与 Docker

公開日: 2025-10-21 00:00 1188文字 6 min read

清绝 avatar

清绝

泛性恋/INFP/东北人/女性人类/爱佐助/爱唱歌/剑网3/明日方舟/黎明杀机/仙剑奇侠传

清绝在干嘛?

实体状态监测仪

电脑状态

电脑正在呼呼大睡

手机状态

暂时远离小屏幕

この投稿は「日本語」では表示できません。元の投稿を表示しています。
本文介绍了利用 `ufw-docker` 脚本解决 Docker 绕过 `ufw` 防火墙导致端口意外暴露在公网的问题。其核心方案是将端口管理分工,由 `ufw` 负责主机服务端口,而使用 `ufw-docker` 精确管理容器映射端口,以实现最小化端口放行的安全原则。

前言

很多海外特价机不带网页防火墙,用 ufw 来当防火墙会遇到一个问题:Docker 会无视 ufw 规则,直接把端口暴露到公网。

安全原则是,端口放行最小化,能少开就少开、能不开就不开,所以必须想办法解决这个问题。

折腾了一圈,感觉最优雅的办法是用 ufw-docker 脚本。

我的使用场景是:Debian 系统、Docker Compose 部署应用、1Panel 绑域名,如果场景相同可以继续看。

核心思路:分工合作

  • ufw: 只管主机本身。例如 SSH 端口、面板端口,以及各种主机上的服务端口。
  • ufw-docker: 只管 Docker 容器。精确管理 Docker 映射出来的容器端口。

第一部分:一次性初始化设置

一、ufw 初始化

  1. 安装 ufw

    sudo apt update
    sudo apt install ufw -y
  2. 设置默认策略 拒绝所有入站请求,放行所有出站请求。这是最基础的安全设置。

    sudo ufw default deny incoming
    sudo ufw default allow outgoing
  3. 放行基础服务端口

    重要提示

    在启用防火墙前,必须先为 SSH 等基础服务留门,否则会立即失联。 必须将示例命令中的端口改为自己实际的端口。

    # 示例:假设 SSH 端口为 55555
    sudo ufw allow 55555/tcp
    
    # 示例:假设 1Panel 访问端口为 66666
    sudo ufw allow 66666/tcp
  4. 启用 ufw

    sudo ufw enable

    看到提示后,输入 y 并回车。

二、ufw-docker 初始化

本项目来自 github 作者 chaifeng,请点一个免费的 star 支持一下:

  1. 下载脚本并授权

    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
  2. 自动安装 该命令会自动修改 ufw 的配置文件,使其能够接管 Docker 的网络规则。

    sudo ufw-docker install
  3. 重载防火墙使其生效

    sudo ufw reload

至此,所有初始化工作完成。

第二部分:日常使用示例

一、管理容器端口 (使用 ufw-docker)

场景: 部署了一个名为 sillytavern 的 Docker 应用,需要对外放行其 8000 端口。

  1. 放行端口 首先通过 docker ps 确认容器名为 sillytavern,然后执行:

    sudo ufw-docker allow sillytavern
  2. 检查状态 使用 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
    ...
  3. 删除规则 应用绑定域名了、或者卸载了不再使用了,通过序号精确删除规则。

    sudo ufw delete 3

    或者通过这个命令删除 sillytavern 这个容器的全部相关规则。

    sudo ufw-docker delete allow sillytavern

场景二:管理主机端口 (使用 ufw)

场景: 通过 1Panel 的 OpenResty 部署了网站,需要放行 80443 端口。

1Panel 的 OpenResty 容器的网络模式是 host ,直接使用主机网络,因此可视作主机上的服务,使用 ufw 而非 ufw-docker 命令。

  1. 放行端口 直接使用 ufw 命令为主机放行端口:

    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
  2. 检查状态 再次查看规则列表,会发现多了两条 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
    ...
  3. 删除规则 如果不再需要任何网站,同样按序号删除。

    重要提示

    如果要一次性删除多条规则,从序号大的开始删,避免序号错乱!

    # 先删序号大的
    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

投喂清绝

微信 / 支付宝

感谢阅读,如果内容对你有帮助,不如赞助我一份美味夜宵吧~

気に入ったならばコメントを残してくださいね~

© 2025 - 2026 清绝 @qingjue
Powered by theme astro-koharu · Inspired by Shoka