../
// 专治各种游戏联机疑难杂症
#import "/template.typ": doc-template
#doc-template(
title: "专治各种游戏联机疑难杂症",
date: "2026年1月12日",
body: [
a.k.a. 怎么基于VPS把游戏电脑的网络的NAT类型变成NAT1
= 背景
联机游戏,本应是件乐事,但当连接不稳、延迟很高之时,却又变为痛苦。究其原因,Steam上的大部分联机游戏,为节省成本,并不会像传统的网络游戏那样,设有中心服务器,而是采用点对点连接。而家用宽带,往往具有复杂的防火墙和NAT,互通有诸多阻碍。二则玩家之间相互发送的数据包,都是家用宽带之间的点对点数据包。这些数据包在网络运营商看来,并不优先,网络稍有拥堵即丢弃。
#image("1.jpg", width: 75%)
这时,如果自己在VPS上自己运行服务端就会好很多,比如Factorio、比如Minecraft,都是这样。
但此举并不能推广至所有游戏,很多游戏并不支持自己运行Linux服务端。这时,*静态NAT*就可派上用场了。和家用宽带路由器上常见的*动态NAT*不同,静态NAT是一对一的,没有任何IP、端口的限制。在VPS服务器和作为联机主机的游戏电脑之间配置好静态NAT之后,作为网关的VPS服务器就变成了游戏电脑在网络上的“化身”。VPS所接收的数据,无论端口,都会被原封不动地转发至作为主机的游戏电脑上。而游戏电脑发出地数据包反之亦然。如此一来,虽然作为联机游戏的主机运行在自己面前的家用电脑上,在网络上的效果却和直接在VPS上托管联机服务器近似。
#image("2.jpg", width: 75%)
= 密钥生成
首先,在VPS上安装`wireguard-tools`。
```
apt install wireguard-tools
```
然后用`wg genkey`和`wg pubkey`命令创建一对Wireguard密钥对:
```
sk1=$(wg genkey)
pk1=$(echo $sk1 | wg pubkey)
echo $sk1
echo $pk1
```
其中,sk1是私钥,pk1是公钥,需要记录下来,作为服务器的密钥。
然后再重复一次,再生成一组sk2、pk2,作为游戏电脑的密钥。
= VPS配置
首先说一下如何选择VPS,这里一般优先选离游戏电脑较近的机房。根据游戏服务器的特点,最好选择流量计费、不限制带宽的网络计费模式。然后要把VPS服务商提供的防火墙关闭,我们自己来配置防火墙策略。
我们先配置Wireguard:用管理员权限,创建一个Wireguard配置文件:
```
sudo vim /etc/wireguard/wg0.conf
```
文件内容如下:
```
[Interface]
PrivateKey = 填入sk1
Address = 10.1.1.1/32
MTU=1420
ListenPort = 51820
[Peer]
PublicKey = 填入pk2
AllowedIPs = 10.1.1.2/32
```
然后用`ip addr`看一下VPS上以太网接口,一般都是`eth0`,假设其IP地址是`111.111.111.111`。
将这些命令加入到开机自动运行中,`111.111.111.111`需要替换成对应的以太网口上的网址。VPS可能也有静态NAT,所以VPS的公网地址和VPS的以太网口地址不见得一样,这里使用的是VPS的*以太网口地址*。
```
sysctl -w net.ipv4.ip_forward=1
wg-quick up wg0
iptables -A FORWARD -i wg0 -j ACCEPT
iptables -A FORWARD -o wg0 -j ACCEPT
iptables -t nat -A POSTROUTING \
-o eth0 -s 10.1.1.2 \
-j SNAT --to-source 111.111.111.111
iptables -t nat -A PREROUTING \
-i eth0 -p udp --dport 1025:65535 \
-j DNAT --to-destination 10.1.1.2
iptables -t nat -A PREROUTING \
-i eth0 -p tcp --dport 1025:65535 \
-j DNAT --to-destination 10.1.1.2
iptables -t nat -I PREROUTING \
-i eth0 -p udp --dport 51820 -j RETURN
```
利用systemd创建开机自动运行脚本的方法请自行查询AI。
然后重启VPS。
= 游戏电脑配置
这里以Windows为例,Linux上的配置基本没有什么区别。
这里假设VPS的公网地址是`123.123.123.123`。下面的实例中的`123.123.123.123`都要替换成VPS服务器的真实的IP地址。VPS可能也有静态NAT,所以VPS的公网地址和VPS的以太网口地址不见得一样,这里使用的是VPS的*公网地址*。
首先下载安装Windows上的Wireguard客户端:#link("https://download.wireguard.com/windows-client/", "下载链接")。
然后计算一下Wiregurad的AllowedIP,可以使用#link("/pages/wgipcalc.html", "这个网站")来计算。在Allowed IPs中填入`0.0.0.0/0`。在Disallowed IPs中填入:`192.168.0.0/16, 123.123.123.123/32`,然后点击“Calculate”,把`AllowedIPs = ...`一大串复制下来。
创建一个conf扩展名的文件,比如`wg0.conf`,用记事本打开,填入:
```
[Interface]
PrivateKey = 填入sk2
Address = 10.1.1.2/32
DNS = 8.8.8.8
[Peer]
PublicKey = 填入pk1
AllowedIPs = 填入刚才计算的一大串
Endpoint = 123.123.123.123:51820
PersistentKeepalive = 25
```
用Wireguard客户端载入这个配置文件,然后点击“连接”。这个时候理论上就配置完成了。
如果有什么clash之类的透明代理工具什么的,这里最好都退出一下,可能会有干扰。
这个时候可以在搜索引擎上搜索“NAT检测”,找个基于WebRTC的NAT检测网站看一下此时的NAT类型,如果顺利的话应该会显示为“NAT1”或者“Full Cone NAT”,这样就算成功了。这个时候再启动联机游戏,大部分情况下各种疑难杂症应该都会消失。
])
Mistivia - https://mistivia.com