我正在使用具有静态 IP 的 Debian VPS 为包括 Minecraft 服务器在内的一些自托管服务提供端口转发。我当前的安排是可行的,因为它允许玩家使用 VPS 的静态 IP 进行连接,但是从 Minecraft 服务器控制台的角度来看,所有玩家都不是来自各自的 WAN IP,而是来自 VPS 的wg0
IP 172.31.0.1
。这可以防止三名以上玩家同时参与(因为游戏限制为最多接受来自同一 IP 的三个同时连接),此外还限制了我们阻止已知麻烦制造者的能力(因为我只能通过用户名而不是 IP 地址进行禁止。)
我认为这只需要改变我的设置处理 NAT 的方式,因为即使是最差劲的消费级路由器也可以进行 NAT,而无需用自己的 LAN IP 替换客户端 WAN IP。因此,我的问题是:我必须做什么才能通过隧道传递客户端 IP,而不会消灭它们?
VPSip route
输出:
default via {VPS Public Gateway} dev eth0 onlink {VPS Public Subnet}/24 dev eth0 proto kernel scope link src {VPS Public IP} 172.31.0.0/24 dev wg0 proto kernel scope link src 172.31.0.1
VPSiptables
配置(由 Wireguard 使用 PostUp.sh 添加,并由相应的 PostDown.sh 删除):
iptables -t nat -A PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 172.31.0.2:25565 iptables -t nat -A PREROUTING -p udp --dport 25565 -j DNAT --to-destination 172.31.0.2:25565 iptables -t filter -A FORWARD -p tcp -d 172.31.0.2 -j ACCEPT iptables -t filter -A FORWARD -p udp -d 172.31.0.2 -j ACCEPT
VPS wg0.conf
:
[Interface] PrivateKey = {Private key} ListenPort = 32016 Address = 172.31.0.1/24 PostUp = /etc/wireguard/PostUp.sh PostDown = /etc/wireguard/PostDown.sh [Peer] PublicKey = {Public key} AllowedIPs = 172.31.0.2/24
Minecraft 服务器ip route
输出:
default via 172.24.0.1 dev eno1 onlink 172.24.0.0/24 dev eno1 proto kernel scope link src 172.24.0.2 172.31.0.0/24 dev wg0 proto kernel scope link src 172.31.0.2
我的世界服务器wg0.conf
:
[Interface] PrivateKey = {Private key} Address = 172.31.0.2/24 Table = 1 PostUp = ip rule add pref 500 from 172.31.0.2 lookup 1 PostDown = ip rule del pref 500 [Peer] PublicKey = {Public key} AllowedIPs = 0.0.0.0/0 Endpoint = {VPS Public IP}:32016 PersistentKeepalive = 25
答案1
保留原始源 IP 地址始终是默认行为。如果它们被重写,这是因为您在某处(可能是在 VPS 上,也可能是在 Minecraft 服务器上)有明确SNAT
或防火墙规则 - 找到并删除它。MASQUERADE
您很可能添加了该规则,以便 Minecraft 服务器能够理解它需要通过 wg0 进行响应,而不是遵循通过 eth0 进行的默认规则(即,使用 SNAT 时,它认为它正在响应 VPS)。但是 WireGuard 端点运行的是 Linux,因此您可以使用策略路由(您已经在客户端的 PostUp 中拥有该路由)来实现相同的目的,而无需使用 SNAT。