首先需要在 VPS 的内核层启用 IP 转发:编辑 /etc/sysctl.conf,确保 net.ipv4.ip_forward=1,然后执行 sysctl -p 生效。接着使用 iptables(或 nftables)做地址伪装(SNAT/MASQUERADE),例如对于常见场景:
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE,其中 192.168.100.0/24 是你的内网网段,eth0 是对外网口。启用后,内网设备发出的包会被替换为 VPS 公网地址,从而实现出网。
确保 VPS 提供商没有在网络层做额外的 NAT 或端口限制;如果有,需在控制台申请放通。保存规则可用 iptables-save/iptables-restore 或安装 iptables-persistent。
若使用 nftables,语法不同,但原理一致;管理脚本和持久化方式要按发行版推荐方法操作。
以上操作需 root 权限或 sudo。
端口映射(DNAT)常用于把 VPS 的某个公网端口转发到内网设备。例如要把 VPS 的 8080 转到内网 192.168.100.10:80:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.100.10:80
同时要允许转发通过 FORWARD 链并放通相应的源与目的端口:
iptables -A FORWARD -p tcp -d 192.168.100.10 --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
如果内网设备需要通过 VPS 的公网地址访问自己(NAT 回环 / hairpin),还需要添加相应的 SNAT 规则或开启 MASQUERADE,从而保证返回路径正确。
当大量内网设备或高并发连接时,NAT 会依赖 conntrack 表。建议检查当前限制并调大:
编辑 /etc/sysctl.conf,加大 net.netfilter.nf_conntrack_max 的值,例如 262144,并调整相关超时:net.netfilter.nf_conntrack_tcp_timeout_established 可适当缩短以回收无效连接。
另外,监控 CPU、网络带宽与 conntrack 使用:使用 ss -s、conntrack -L、top、iftop 等工具定位瓶颈。若 VPS CPU 成为限制,考虑更高规格的实例或使用多个出口服务器做负载分担。
通过隧道或多次封装时注意 MTU,出现大量分片会降低性能。可在内网设备或 VPS 接口调整 MTU,比如 1400 或 1420,或启用 TCP MSS clamping:
iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
不要一刀切放行所有转发,建议按策略放行。示例做法:
1) 只允许特定内网网段出网:iptables FORWARD 限定 -s 192.168.100.0/24。 2) 只放通必要端口与协议,使用 state/conntrack 模块限制新连接。3) 对外暴露的端口做限制速率、日志与 IDS/IPS。
此外,搭配 VPN(如 WireGuard)可以把内网设备与 VPS 建立加密隧道,再在 VPS 端做统一 NAT,这样安全性更高且便于管理。
常见问题包括内网设备无法出网、端口映射后无法回连、连接超时或速度慢。排查步骤:
1) 确认 VPS 已启用 IP 转发:sysctl net.ipv4.ip_forward。2) 用 tcpdump 或 tshark 抓包确认流量是否到达 VPS 网络接口并被 NAT。3) 检查 iptables/nftables 规则顺序,PREROUTING/POSTROUTING 是否正确配置。4) 检查 VPS 提供商是否有上行端口限制或防火墙策略。
如果是 NAT 回环问题,检查是否为内网设备访问 VPS 公网 IP 导致 reply 路径错误;可以通过在 VPS 上添加 SNAT 针对源地址进行转换来解决。