在公网上运行服务器,如果不加以限制,每天都会遭受成千上万次的恶意端口扫描。很多一键脚本或 Docker 容器会默认将端口暴露给全世界,导致服务器沦为“肉鸡”或流量被盗刷。
本教程将手把手教你打造一套**“滴水不漏”**的服务器网络架构:利用 UFW 防火墙配合 Docker 的底层网络隔离,实现所有业务容器对外隐身,仅通过 Nginx 反代或 Cloudflare 隧道进行安全的内部通讯。
1. 核心架构原理
在这套安全架构中,我们将服务器划分为“前台(公网可见)”和“后台(内部局域网)”。
- 公网(危险区):只能看到 SSH 管理端口和 Nginx 面板的网页端口(80/443)。其他任何扫描都会被 UFW 无情拦截。
- 内部走廊 (
172.17.0.1):这是系统和 Docker 容器之间交流的“专属内部通道”。 - 后台业务容器:所有的业务应用(如哪吒面板、数据库等)都必须把门开在这条内部走廊上,绝不直接面向公网。

2. 第一阶段:构筑 UFW 外部防线
[!WARNING]
大多数通过docker run -p 8090:8090启动的容器,会强行绕过 UFW 防火墙!因此,配置好 UFW 后,必须配合后面的 Docker 改造才能彻底安全。
依次执行以下命令,清理旧规则并建立严密的防护体系。
2.1 安装与重置防火墙
# 更新源并安装 UFW
apt update && apt install ufw -y
# 强制重置防火墙,清理所有历史残留的垃圾规则
ufw --force reset
2.2 设定基本防御策略与放行核心端口
# 设定默认策略:拒绝一切外部主动连入的请求
ufw default deny incoming
# 放行基础必备端口(请根据实际情况替换 22 为你的自定义 SSH 端口!)
ufw allow 22/tcp
# 放行 Nginx 面板需要用到的 Web 端口(如果你只用 CF 隧道,连这两个都可以不放行)
ufw allow 80/tcp
ufw allow 443/tcp
2.3 🌟 核心:颁发 Docker 内部通行证
因为 Nginx 容器需要通过内网访问宿主机的 172.17.0.1 接口,这在 UFW 看来也属于“Incoming(入站流量)”。如果不放行,内部转发将被打断。
# 放行 Docker 默认的所有内网 IP 段
ufw allow from 172.16.0.0/12
2.4 启动防火墙
# 正式激活(如果提示断开连接风险,输入 y 确认)
ufw enable
# 查看最终成型的安全防线
ufw status verbose
[!TIP]
此时你的系统外部大门已经完全锁死,外网黑客只能对着你的 22、80、443 叹气。
3. 第二阶段:改造 Docker 应用,退居幕后
现在我们要把暴露在外面的业务应用,全部转移到 172.17.0.1 这条内部走廊里。
3.1 修改 docker-compose.yml
找到你的业务应用(例如端口为 8090 的服务)的配置文件,将原本危险的端口映射修改为安全的内部映射:
services:
my-app:
image: example/app:latest
ports:
- - "8090:8090" # ❌ 错误做法:直接暴露在公网,无视 UFW 防火墙
- - "127.0.0.1:8090:8090" # ⚠️ 勉强安全:但这会导致其他 Docker 容器(如 NPM)无法访问它
+ - "172.17.0.1:8090:8090" # ✅ 完美做法:只在 Docker 内部网关监听,对内互通,对外隐身
3.2 重启应用使其生效
在配置文件所在目录执行:
docker compose up -d
[!NOTE]
执行后,应用对外隐身,公网再也无法通过IP:8090直接访问你的服务。
4. 第三阶段:打通内部任督二脉(配置反向代理)
业务应用藏好之后,我们需要让前台接待员(NPM 面板 或 Cloudflare Tunnel)知道去哪里找它。
场景 A:使用 Nginx Proxy Manager (NPM)
- 登录 NPM 的管理后台。
- 添加一个新的 Proxy Host。
- Forward Hostname / IP:填写
172.17.0.1 - Forward Port:填写
8090(或你的实际业务端口) - 配置好 SSL 证书并保存。
场景 B:使用 Cloudflare Tunnel (CF 隧道)
- 登录 Cloudflare Zero Trust 网页控制台。
- 进入对应的 Tunnel,添加
Public Hostname。 - Service Type:选择
HTTP - URL:填写
172.17.0.1:8090 - 保存即可。
[!IMPORTANT]
无论你是使用本地 Nginx 反代,还是借助云端的 CF 隧道,只要目标指向了172.17.0.1,就能确保流量在机器内部高速流转,彻底切断了公网直连的任何风险。
结语
完成以上三步配置后,你的服务器已经具备了极高的安全水位。
- 业务完全不暴露外网,有效防止扫描器、爬虫和针对端口的 DDOS 攻击。
- Nginx 或 CF 隧道统一接管 HTTP 流量,不仅架构清晰,更省去了为每个后端应用单独申请证书的烦恼。
- 如果以后有新的业务需要上线,只需要闭着眼睛写上
-p 172.17.0.1:xxx:xxx,就能安全无忧!