TL;DR 我正在尝试使用我的一台 linode 服务器作为本地托管游戏服务器的防火墙/代理服务器(使用28015 UDP和28082 TCP) 以便本地托管服务器的 ip 不会暴露因为我正在运行其他服务,我已使用 openvpn 将所有传出连接从本地服务器转发到公共服务器并使用 nginx 将传入连接路由回来并发现稳定性问题。 因此我切换为使用 iptables(下面的配置)而不是 nginx 并看到在没有玩家连接时查询稳定,当有人加入 steam 公共列表时无法查询服务器也无法查询 battlemetrics但如果玩家知道服务器的 ip,他们仍然可以连接。 我以为这是 openvpn 的问题所以我切换到使用 ipsec 并看到了相同的结果。 任何帮助都将不胜感激。
我正在尝试使用我的一台 linode 服务器作为我的本地托管游戏服务器之一的外部路由器/防火墙(运行使用 28015 udp 和 28082 tcp 的 Rust 服务器)。为此,它需要能够转发所有传出连接(或仅选择某些端口上的连接)并将连接路由回本地托管的服务器。最初,我将 linode 设置为 openvpn 服务器,并将本地服务器连接到它,然后使用 nginx 将所有连接路由回服务器。这似乎有效,但似乎 nginx 在发送 udp 流量回来时遇到了问题,并且工作连接耗尽了,因此我将它们调整为原始设置的 12 倍 1024 > 12288,这使我能够连接到服务器,但这导致 Rust 的 steam 公共服务器列表中的服务器列表出现问题,并且正如 Nginx Amplify 所报告的那样,它通过 nginx 为每个连接的客户端创建了大约 3300 个开放套接字连接。因此我转而使用 iptables 并继续使用 openvpn 作为本地和 linode 之间的连接,并且连接似乎很稳定,我将它用于 28015 udp 端口和 28082 tcp 端口,但开始看到 battlemetrics 和 steam 公共列表无法查询服务器信息的问题......但无论出于什么原因,如果玩家知道相同的服务器 ip,他们加入时都没有问题。查询端口与用于玩家连接的端口相同。因此,我想也许是本地服务器和 linode 之间的 vpn 连接存在问题,我将其更改为使用 ipsec 连接。还是同样的事情。iptables 的配置如下所示,任何帮助都将不胜感激,我可以添加任何需要的额外信息。
以下是当前的 iptables 配置(这是由生成的文件iptables-save
)
Generated by iptables-save v1.8.7 on Sat Oct 1 01:51:49 2022
*filter
:INPUT ACCEPT [92:7225]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2217257:2764732609]
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol none -j DROP
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m multiport --dports 500,4500 -j ACCEPT # IPSec
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -j DROP
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -i eth0 -o ppp+ -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ppp+ -o eth0 -j ACCEPT
-A FORWARD -i ppp+ -o ppp+ -j ACCEPT
-A FORWARD -d linode_public_ip/32 -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s linode_public_ip/32 -o eth0 -j ACCEPT
-A FORWARD -s linode_public_ip/32 -o ppp+ -j ACCEPT
-A FORWARD -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.8.0.0/24 -j ACCEPT
-A FORWARD -j DROP
COMMIT
# Completed on Sat Oct 1 01:51:49 2022
# Generated by iptables-save v1.8.7 on Sat Oct 1 01:51:49 2022
*nat
:PREROUTING ACCEPT [1149:196646]
:INPUT ACCEPT [47:4512]
:OUTPUT ACCEPT [53:4096]
:POSTROUTING ACCEPT [70:11576]
-A PREROUTING -p udp -m udp --dport 28015 -j DNAT --to-destination local_server_public_ip:28015 # Rust Game Server
-A PREROUTING -p tcp -m tcp --dport 28082 -j DNAT --to-destination local_server_public_ip:28082 # Rust App
-A PREROUTING -p tcp -m tcp --dport 5678 -j DNAT --to-destination local_server_public_ip:5678 # Rust RCON
-A POSTROUTING -s 192.168.42.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.43.0/24 -o eth0 -m policy --dir out --pol none -j MASQUERADE
-A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source linode_public_ip
-A POSTROUTING -o eth0 -p udp -m udp --dport 28015 -j MASQUERADE
-A POSTROUTING -o eth0 -p udp -m udp --dport 28015 -j LOG --log-prefix '**SUSPECT**'
-A POSTROUTING -o eth0 -p tcp -m tcp --dport 28082 -j MASQUERADE
-A POSTROUTING -o eth0 -p tcp -m tcp --dport 5678 -j MASQUERADE
COMMIT
# Completed on Sat Oct 1 01:51:49 2022
答案1
更新:我已经解决了这个问题,花了我一段时间,我花了超过一个月的时间每天花太多时间解决这个问题,然后才发布了这个问题。不确定具体的问题是什么,但服务器不喜欢我将连接转发到本地服务器的公共 IP。所以我做了一些调整,将转发从本地服务器的公共 IP 更改为连接的 VPN 客户端的隧道 IP(这是一条通往本地服务器的直接隧道)。现在预路由条目看起来像这样-A PREROUTING -p udp -m udp --dport 28015 -j DNAT --to-destination 192.168.42.10:28015
(需要它的条目的协议 tcp)