Nginx

iptables 埠轉發,同時保留客戶端 IP

  • November 18, 2021

TL;DR:如何讓連接到遠端託管 VPS 的客戶端 IP 成為通過 iptables 轉發/nat 到我家執行的遊戲伺服器的 IP?

我在家里托管了一個 Rust 遊戲伺服器。我希望將其公開,但我不一定想向所有人提供我的 IP 地址。所以我租了一個小型 VPS,它打算基本上用作反向代理。我目前正在使用 nginx 通過 clinet-server 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 –to-destination my_ip:28015

iptables -t nat -A PREROUTING -p udp –dport 28015 -j NAT –to-destination my_ip:28015

iptables -t nat -A PREROUTING -p tcp –dport 28016 -j NAT –to-destination my_ip:28016

iptables -t nat -A PREROUTING -p udp –dport 28016 -j NAT –to-destination 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指令什麼都不做一樣。

你不能用 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 地址。

引用自:https://serverfault.com/questions/1083937