# GPU 服务器防火墙配置

> GPU 服务器防火墙配置指南：用 ufw 先放行 SSH 再启用防火墙，同时过滤 IPv6，避开 Docker 发布端口绕过 ufw 的陷阱，并用 TLS 和 API 密钥保护 vLLM 推理端点。

来源：https://fullgpu.com/zh/docs/networking-firewall  
更新日期：2026-10-22  
发布方：FullGPU (https://fullgpu.com/)

配置 GPU 服务器防火墙只有一个目标：只有您有意开放的端口才能被访问。每台 FullGPU 服务器都有一个公网 IPv4 地址和一个 IPv6 /64 网段，因此除非您加以过滤，任何监听所有接口的服务都会暴露在外。本页先配置 ufw，再说明 Docker 如何绕过它，最后介绍如何用反向代理、TLS 和 API 密钥保护 vLLM 推理端点。

## 配置 ufw，先放行 SSH

启用防火墙之前先放行 SSH，否则您会把自己锁在服务器外面：

```
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
sudo ufw status verbose
```

当 ufw 警告该命令可能中断 SSH 连接时，输入 `y`。您应该会看到 `Status: active`、默认策略，以及一条对 IPv4 和 IPv6 放行 `22/tcp (OpenSSH)` 的规则。保持当前会话不要断开，并在另一个终端中测试新的 SSH 连接。

如果您有固定的办公室或 VPN 地址，可以只允许从该地址访问 SSH。请先添加新规则，再删除旧规则：

```
sudo ufw allow from 198.51.100.7 to any port 22 proto tcp
sudo ufw delete allow OpenSSH
```

较温和的做法是 `sudo ufw limit OpenSSH`，它会对来自同一地址的重复连接进行限速。不过，比这两种做法都更重要的是只允许密钥登录，详见 [SSH 访问](https://fullgpu.com/zh/docs/ssh-access)。

## 同样要过滤 IPv6

```
grep IPV6 /etc/default/ufw
sudo ss -tulpn
```

当 `/etc/default/ufw` 中包含 `IPV6=yes`（Ubuntu 的默认设置）时，ufw 会过滤 IPv6。如果设置为 `IPV6=no`，ufw 不会过滤 IPv6，监听 `[::]` 的服务仍然可以通过您的 /64 网段访问。请将其设为 `yes`，运行 `sudo ufw disable && sudo ufw enable`，然后重新添加您的规则，让每条规则都生成对应的 IPv6 副本。`ss -tulpn` 会列出所有处于监听状态的套接字及其进程：凡是监听在 `0.0.0.0`、`*` 或 `[::]` 上的，都在监听所有接口。请确认它确实需要在这些地址上监听，并且受到防火墙保护；否则，请把它绑定到 `127.0.0.1`。

## Docker 发布的端口会绕过 ufw

Docker 会自行管理 iptables 规则。当您用 `-p 8000:8000` 发布端口时，Docker 会通过自己的规则把这部分流量转发到容器，这些流量根本不会经过保护主机的 ufw 规则。即使设置了 `default deny incoming`，该端口也会对互联网开放，许多 vLLM、Jupyter 和监控部署都掉进过这个陷阱。

1. 只在回环接口上发布端口：`-p 127.0.0.1:8000:8000`，在 Compose 中则写作 `"127.0.0.1:8000:8000"`。
2. 用 `sudo ss -tlnp | grep 8000` 检查绑定情况，应显示 `127.0.0.1:8000`。
3. 在您的笔记本电脑上运行 `curl http://203.0.113.10:8000/v1/models`（换成您服务器的 IP），应当无法连接。
4. 通过主机上的反向代理对外提供该服务，发往反向代理的流量会经过 ufw 过滤。

要让所有发布的端口默认绑定到回环接口，请在 `/etc/docker/daemon.json` 中添加 `"ip": "127.0.0.1"`，同时保留已有条目（例如 NVIDIA 运行时），然后重启 Docker。如需更精细的控制，可以利用 `DOCKER-USER` iptables 链：Docker 会先评估这条链，再处理自己的规则。

## 在前面部署带 TLS 的反向代理

将一个域名（此处为 `llm.example.com`）解析到您服务器的地址，并开放 Web 端口，然后选择 Caddy 或 nginx。下面两种配置都只对外开放 `/v1/` API 路径。

```
sudo ufw allow 80,443/tcp
```

### Caddy

Caddy 会自动申请并续期证书。Ubuntu 24.04 已收录 Caddy 软件包（`sudo apt install -y caddy`）；在 22.04 上，请从 Caddy 官方软件源安装。将 `/etc/caddy/Caddyfile` 的内容替换为：

```
llm.example.com {
    handle /v1/* {
        reverse_proxy 127.0.0.1:8000
    }
    handle {
        respond 404
    }
}
```

运行 `sudo systemctl reload caddy` 使配置生效。证书签发后，`https://llm.example.com/v1/models` 即可通过 HTTPS 响应。

### nginx

```
sudo apt install -y nginx certbot python3-certbot-nginx
```

创建 `/etc/nginx/sites-available/llm`：

```
server {
    listen 80;
    server_name llm.example.com;

    location /v1/ {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_buffering off;
        proxy_read_timeout 600s;
    }

    location / {
        return 404;
    }
}
```

启用该站点，然后申请证书。certbot 会添加 HTTPS 配置，并设置证书自动续期：

```
sudo ln -s /etc/nginx/sites-available/llm /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d llm.example.com
```

`proxy_buffering off` 让流式输出的 token 一生成就送达客户端，较长的超时时间则可以容纳耗时较长的生成任务。

## 为兼容 OpenAI 的服务器启用 API 密钥验证

TLS 保护传输中的流量；API 密钥则决定谁可以使用模型。用 `--api-key` 启动 vLLM 或设置 `VLLM_API_KEY` 后，vLLM 会要求客户端提供 Bearer 令牌：

```
openssl rand -hex 32    # generate a key
vllm serve Qwen/Qwen2.5-7B-Instruct --host 127.0.0.1 --port 8000 \
  --api-key YOUR_KEY
```

在您的笔记本电脑上测试：

```
curl https://llm.example.com/v1/models -H "Authorization: Bearer YOUR_KEY"
curl -i https://llm.example.com/v1/models
```

第一条命令应列出模型，第二条应返回状态码 401。vLLM 对 `/v1` 路由启用密钥校验，而 `/metrics` 等其他路由可能仍然开放，这正是反向代理不对外开放其他任何路径的原因。建议使用环境变量，就像[用 vLLM 提供大语言模型（LLM）推理服务](https://fullgpu.com/zh/docs/pytorch-vllm)中的 systemd 配置那样：在命令行中输入的密钥，本机的其他用户可以在进程列表中看到。其他兼容 OpenAI 的服务器也有类似的选项。

## 服务器之间的私有网络

我们可应要求通过私有网络连接您的各台服务器。请用它承载服务器之间的流量：数据同步、NCCL 和 torchrun rendezvous、内部 API 和监控指标。在 ufw 中按子网或按网络接口放行这部分流量（用 `ip -br addr` 查找接口）：

```
sudo ufw allow from 10.0.0.0/24
# or
sudo ufw allow in on PRIVATE_INTERFACE
```

请将子网或接口替换为您私有网络的实际值。如需开通，请参阅[私有网络](https://fullgpu.com/zh/products/private-networking)。

## 已包含 DDoS 防护

您服务器上的每个公网 IP 地址都有 DDoS 防护，费用已包含在价格中。它可以抵御网络层攻击，但不能取代您自己服务上的防火墙、TLS、身份验证或限流措施。如果您发现异常流量，或认为服务器正在遭受攻击，请在控制台[提交工单](https://fullgpu.com/zh/help/getting-support)。更多信息请参阅 [DDoS 防护](https://fullgpu.com/zh/products/ddos-protection)。

## 故障排查

- **启用 ufw 后无法登录。**不要反复重试。请在控制台提交工单（提交工单不需要 SSH），写明是哪台服务器以及您添加了哪些规则；参见[工单如何运作](https://fullgpu.com/zh/help/getting-support)。
- **Caddy 或 certbot 无法获取证书。**请检查：域名是否指向该服务器，ufw 是否放行了 80 和 443 端口，以及是否有其他程序在监听这两个端口（`sudo ss -tlnp`）。
- **尽管启用了 ufw，容器端口仍可被访问。**该端口发布在了所有接口上。请用 `-p 127.0.0.1:PORT:PORT` 重新创建容器。

## 相关页面

- [GPU 服务器 DDoS 防护：每个公网 IP 均已配备](https://fullgpu.com/zh/products/ddos-protection): GPU 服务器 DDoS 防护覆盖每台服务器的每个公网 IP，始终开启，不额外收费。本页说明它能防护哪些攻击、不能防护哪些，以及如何对推理 API 进行安全加固。
- [GPU 服务器之间的私有网络](https://fullgpu.com/zh/products/private-networking): GPU 服务器之间的私有网络，可应要求开通：将您租用的各台 FullGPU 服务器连接到同一个隔离网络中，用于数据流水线和多节点任务。了解私有网络的运作方式。
- [使用 vLLM 部署 LLM 推理服务](https://fullgpu.com/zh/docs/pytorch-vllm): 在您的 GPU 服务器上用 vLLM 部署 LLM 推理服务：用 uv 配置 Python 环境，安装 PyTorch 和 vLLM，测试兼容 OpenAI 的 API，再将其作为系统服务长期运行。
- [通过 SSH 连接 GPU 服务器](https://fullgpu.com/zh/docs/ssh-access): 如何通过 SSH 连接 GPU 服务器：在 macOS、Linux 或 Windows 上创建 ed25519 密钥，连接服务器，添加团队成员，并禁用密码登录。步骤可直接复制。
