NAT VPS 常见问题与解决方案
"整理 NAT 型 VPS 使用过程中最常见的问题,包括 SSH 连接、端口转发配置、服务暴露、内核模块限制等,附带详细解决步骤。"
NAT 型 VPS 与独立 IP 的 KVM 有本质区别:多台机器共享同一个公网 IP,通过端口转发对外提供服务。这带来了极低的价格,但也引入了一些独特的使用门槛。本文整理了使用 NAT VPS 时最常遇到的问题及对应解决方法。
1. SSH 无法连接 / 不知道如何连接
症状: 拿到 VPS 后,直接 ssh root@<IP> 连不上,或者提示 Connection refused。
原因: NAT VPS 没有独立的公网 IP,对外暴露的地址是宿主机的入口地址(Entry Host),SSH 端口也不是默认的 22,而是通过端口转发映射出来的。
解决方法:
在控制面板的实例详情页,找到 SSH 连接信息栏,系统会自动生成完整的连接命令,格式如下:
ssh root@<entry_host> -p <host_port>
例如,如果宿主机入口为 node1.example.com,SSH 对应的外部端口为 23456:
ssh root@node1.example.com -p 23456
如果没有看到 SSH 命令,说明还没有为内部 22 端口添加端口转发规则,前往 端口转发 卡片,添加一条 TCP 规则:
| 内部端口 (VM) | 外部端口 (对外) |
|---|---|
| 22 | 任意一个可用端口 |
添加后刷新页面,SSH 命令会自动出现。
2. 端口转发配置后,外部访问不通
症状: 在面板里添加了端口转发,但从外部 curl 或浏览器访问始终超时。
最常见原因:服务只监听了 127.0.0.1,而不是 0.0.0.0。
NAT 端口转发的流量从宿主机到达 VM 内部时,是通过 VM 的内网接口进来的,不是从 lo 回环接口。如果你的服务绑定在 127.0.0.1,宿主机转发过来的流量就无法到达它。
检查服务监听地址:
ss -tlnp
# 或
netstat -tlnp
确认目标端口的 Local Address 是 0.0.0.0:<port> 或 :::port(IPv6),而不是 127.0.0.1:<port>。
常见服务的修改方法:
Nginx:
# 修改前(错误)
listen 127.0.0.1:8080;
# 修改后(正确)
listen 0.0.0.0:8080;
# 或直接写
listen 8080;
Node.js / Python 等:
// Node.js 修改前
app.listen(3000, '127.0.0.1')
// 修改后
app.listen(3000, '0.0.0.0')
# Python Flask 修改前
app.run(port=5000)
# 修改后
app.run(host='0.0.0.0', port=5000)
3. 外部端口必须大于 1024
症状: 尝试将 VM 内部的 80 或 443 端口直接映射到外部的 80/443,面板报错或无法保存。
原因: 宿主机上 1024 以下的端口通常被系统或其他服务占用,平台统一限制外部端口(Host Port)必须 ≥ 1024。
解决方法:
内部端口没有限制,可以是任意值(包括 22、80、443)。外部端口选一个 1024 以上的即可:
| 内部端口 | 外部端口(示例) |
|---|---|
| 80 | 18080 |
| 443 | 14443 |
| 3306 | 13306 |
如果你希望用标准端口对外提供 HTTP/HTTPS 服务,推荐使用 Cloudflare 回源端口(见第 6 节)方案。
4. 无法运行 WireGuard / OpenVPN(缺少内核模块)
症状: 安装 WireGuard 后执行 wg-quick up wg0 报错:Cannot find device "wg0" 或 RTNETLINK answers: Operation not permitted。
原因: NAT VPS 通常是容器环境,不提供 /dev/net/tun 设备或 WireGuard 内核模块权限。
解决方法:使用用户空间(Userspace)模式。
Tailscale(推荐): 使用 --tun=userspace-networking 参数,无需任何内核支持。详见本站 Tailscale 用户模式安装指南。
WARP(Cloudflare 出口 IP): 通过 WireProxy 在用户空间运行,详见本站 用户模式下的 WARP 安装与配置。
手动检查是否支持 tun:
ls /dev/net/tun 2>/dev/null && echo "tun 可用" || echo "tun 不可用"
5. UDP 端口转发不生效
症状: 添加了端口转发后,TCP 服务可以访问,但基于 UDP 的服务(如游戏、DNS、某些 VPN)无响应。
原因: 端口转发规则中 TCP 和 UDP 是独立的,添加 TCP 规则不会自动覆盖 UDP。
解决方法: 在面板的端口转发卡片里,为同一个内外端口组合再单独添加一条 UDP 协议的规则。
例如,Minecraft(默认 25565 UDP):
| 协议 | 内部端口 | 外部端口 |
|---|---|---|
| TCP | 25565 | 25565+ |
| UDP | 25565 | 25565+(同一个外部端口) |
6. 想用域名建站(Cloudflare 修改回源端口)
NAT VPS 的外部端口只能是 1024 以上的非标准端口,但 Cloudflare 作为反代层后,用户访问的仍然是 80/443,Cloudflare 回源时连接你实际开放的那个端口。整个流程不需要安装任何额外软件。
原理: 用户 → Cloudflare(443) → 你的 entry host:非标准端口 → VM 内部服务
操作步骤:
第一步:在面板添加端口转发
把 VM 内部 Web 服务的端口,映射到一个外部端口。HTTP 服务推荐选 Cloudflare 原生支持的端口,可以省去 Origin Rules 配置:
| 用途 | 推荐外部端口 | VM 内部端口 |
|---|---|---|
| HTTP | 8080 / 2052 / 2082 / 2086 / 2095 | 80(或你服务实际监听的端口) |
| HTTPS | 8443 / 2053 / 2083 / 2087 / 2096 | 443 |
Cloudflare 代理模式下,这些端口无需额外配置即可回源,完整列表见 Cloudflare 文档。
第二步:在 Cloudflare DNS 添加 A 记录
| 类型 | 名称 | 内容 | 代理状态 |
|---|---|---|---|
| A | @ 或子域名 | NAT VPS 的 entry host IP | 已代理(橙色云朵) |
第三步(可选):用 Origin Rules 指定任意回源端口
如果你的外部端口不在上表支持列表内(例如 18080),需要在 Cloudflare 控制台手动配置回源端口:
- 进入域名 → Rules → Origin Rules
- 新建规则,匹配条件选
All incoming requests(或指定 hostname) - 在 Destination Port 填入你的外部端口号(如
18080) - 保存并部署
配置完成后,Cloudflare 会将所有流量回源到 entry_host:18080,对用户仍然表现为标准的 80/443 访问。
验证是否生效:
# 检查 Cloudflare 是否正确代理(响应头会有 cf-ray 字段)
curl -I https://yourdomain.com
7. IPv6 直连:绕过 NAT 限制
症状: 某些服务想要独立 IP,或需要不通过端口转发的直接连接。
部分 NAT VPS 提供完整的 IPv6 地址,可以直接对外通信,不受 NAT 限制。购买前可以查看机器说明确认是否支持。
查看 VM 的 IPv6 地址:
在控制面板实例详情页,Entry Host 旁边如果有 IPv6 地址显示,则可以直接使用。也可以在 VM 内部查看:
ip -6 addr show
直接通过 IPv6 SSH 连接(无需端口转发):
ssh root@<ipv6地址>
# IPv6 地址用方括号包裹
ssh root@[2001:db8::1]
让服务同时监听 IPv4 和 IPv6:
大多数服务监听 0.0.0.0 只覆盖 IPv4,要同时支持 IPv6 需要监听 [::]:
# Nginx
listen [::]:80;
listen 80;
注意:IPv6 直连不经过端口转发,外部可以直接访问 VM 内的任意端口,需要自行用防火墙(
iptables/ufw)控制访问权限。
8. 忘记 SSH 密码
在控制面板实例详情页,找到 凭据 区域,密码默认隐藏,点击眼睛图标可以查看。
如果密码已经修改过(在 VM 内部改过),面板显示的是初始密码,此时需要使用 重置密码 功能:
- 进入实例详情页
- 点击 设置 → 重置密码
- 可以输入自定义密码,或留空让系统随机生成
- 等待 VM 重启后用新密码登录
重置密码会重启 VM,正在运行的服务会中断,操作前注意保存工作。
9. 流量什么时候重置
每月 1 号零点(UTC+8) 流量自动重置为套餐额度,无需手动操作。
控制面板实例详情页的流量进度条显示的是当月已用量,可以随时查看剩余情况。若流量在月底前耗尽,VM 网络会被暂停,等到下月 1 号自动恢复。
10. VM 无响应 / 无法 SSH 进去
如果 SSH 连不上、服务全部不响应,可以通过控制台(Console)直接操作 VM:
- 进入实例详情页
- 点击 控制台 按钮,打开浏览器内嵌终端
- 不依赖网络和端口转发,直接与 VM 交互
常见处理步骤:
# 查看系统日志,找到问题根因
journalctl -xe --no-pager | tail -50
# 检查磁盘是否写满
df -h
# 检查内存
free -h
# 重启有问题的服务
systemctl restart <service-name>
如果控制台也进不去,可以在面板使用 强制重启 功能,相当于硬重启,一般可以恢复响应。
NAT VPS 价格优势明显,但使用门槛比独立 IP VPS 高一些。掌握上面这些技巧后,绝大多数场景都可以正常使用。如果遇到本文未覆盖的问题,欢迎通过工单或社区反馈。