iptables 埠轉發,同時保留客戶端 IP
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 中,這樣做如下:
- nginx 反向代理適用於您的 VPS。
- 反向代理添加標頭
X-Forwarded-For: <clientip>
以請求它發送到源伺服器。- 源伺服器讀取標頭並將其用作客戶端 IP 地址,而不是使用與 TCP 套接字關聯的 IP 地址。
另一種可能性是在 VPS 和源伺服器之間使用 SOCKS 代理。SOCKS 代理封裝來自客戶端的流量,並添加額外的元數據,例如客戶端 IP 地址。