Iptables 端口转发同时保留客户端 IP

Iptables 端口转发同时保留客户端 IP

TL;DR:如何让连接到远程托管 VPS 的客户端 IP 通过 iptables 转发/NAT 到我家中运行的游戏服务器?

我家里有一个 Rust 游戏服务器。我希望它是公开的,但我不一定想把我的 IP 地址告诉所有人。所以我租了一个小型 VPS,打算主要用作反向代理。我目前使用 nginx 通过客户端服务器 VPN 转发流量,效果很好。但是,在游戏服务器上,每个玩家的 IP 都是 VPS 的隧道地址,而不是实际的客户端 IP。我尝试proxy_pass $remote_addr:28015 transparancy; proxy_responses 0在我的 nginx 配置中使用,没有变化。所以我改用 iptables 来做这件事。

我可以让它按我想要的方式工作 99%,具体做法是这样做:

sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 28015 -j NAT --到目标 my_ip:28015
iptables -t nat -A PREROUTING -p udp --dport 28015 -j NAT --到目标 my_ip:28015
iptables -t nat -A PREROUTING -p tcp --dport 28016 -j NAT --到目标 my_ip:28016
iptables -t nat -A PREROUTING -p udp --dport 28016 -j NAT --到目标 my_ip:28016
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp -d my_ip --dport 28015 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p ucp -d my_ip --dport 28015 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
ufw disable
ufw enable
vps reboot \

它的作用与 nginx 基本相同,可以正常工作,但每个人都只拥有 VPS 的公共 IP(请注意,VPS 的 LAN 和公共 IP 地址是相同的)。如果我省略伪装,它就不起作用。

有关设置的一些信息:
VPS 有一个接口:eth0
VPS 正在我家运行Ubuntu 20.04
,调制解调器处于 pfsesne 的直通模式。在 pfsense 上,我有端口转发规则,用于将 28015/28016 tcp/udp 传递给gameserver

旁注:我不确定为什么 nginx 无法正常工作。几乎就像 nginx 没有对该proxy_pass $remote_addr指令执行任何操作一样。

答案1

您无法使用 IPTables 执行此操作。为了使双向数据包转发正常工作,从您的 VPS 发送的数据包的源 IP 地址必须包含 VPS 地址。否则,回复数据包将不会发送到 VPS,VPS 会将其转发给客户端。

您需要第 7 层协议支持才能将原始 IP 地址中继到您的应用程序。在 HTTP/HTTPS 中,此操作如下:

  1. nginx 反向代理在您的 VPS 上运行。
  2. 反向代理将标头添加X-Forwarded-For: <clientip>到发送给原始服务器的请求中。
  3. 原始服务器读取标头并将其用作客户端 IP 地址,而不是使用与 TCP 套接字关联的 IP 地址。

另一种可能性是在 VPS 和原始服务器之间使用 SOCKS 代理。SOCKS 代理封装来自客户端的流量,并添加额外的元数据,例如客户端 IP 地址。

相关内容