是否有可能在 Linux 中永久路由传入流量?

是否有可能在 Linux 中永久路由传入流量?

我尝试使用以下 iptables 命令将我的传入连接路由到另一台机器上的 teamspeak 服务器

iptables -t nat -A PREROUTING -p udp -s 0/0 -d LOCALIP --dport 9987 -j DNAT --to DESTINATIONIP
iptables -t nat -A POSTROUTING -o eth0 -d DESTINATIONIP -j SNAT --to-source LOCALIP

它有点工作,但是现在加入的每个用户都有我的路由服务器的 IP。

如果客户端到达路由服务器上的端口,是否有办法以某种方式将其直接推送到新 IP?

答案1

它有点工作,但是现在加入的每个用户都有我的路由服务器的 IP。

当服务器相距很远时,这种情况很难避免。发生这种情况是因为您在第 2 行中设置了 SNAT 规则 - 如果最终服务器位于完全不同的网络上,您需要该 SNAT 规则是为了强制所有“回复”流量也通过您的路由服务器返回。

如果删除 SNAT 规则,客户端的 IP 地址将会保留 - 但这会带来更大的问题,因为 TeamSpeak 服务器会直接向客户端发送响应,完全绕过您的“路由”服务器。这会让客户端感到困惑,因为他们将请求发送到地址 X,却没有想到会收到来自地址 Y 的响应。

更好的方法是隧道原始数据包位于另一个 IP 数据包内(使用 GRE 或 WireGuard 或 OpenVPN)。然后,您的路由服务器将通过隧道转发所有内容,并且可以轻松配置 TeamSpeak 服务器以通过隧道进行响应,而无需进行任何 SNAT。

如果客户端到达路由服务器上的端口,是否有办法以某种方式将其直接推送到新 IP?

如果您的客户端直接配置了 IP 地址,则不行。没有通用的 IP 功能。如果客户端想要与 1.2.3.4 通信,则将要与 1.2.3.4 对话 – 您不能强制它将数据包发送到 5.6.7.8。

这种重定向可以仅有的可以作为应用程序级协议功能实现。例如,HTTP 具有重定向。因此,如果 TeamSpeak 本身在其协议中内置了重定向功能,则可以使用它。如果没有,则不能。(我猜这就是“TSDNS”?)

但如果您的客户端通过域名连接,那么您可以创建一个'SRV 记录'该域名并以此方式将 TS3 客户端指向其他地方。

SRV 仍然依赖于应用程序级别的支持(大多数程序不理解它),但至少官方记录表明 TS3 确实支持使用 SRV 记录。


概括:

  1. 您说您有一个域名。对于您来说,最好的解决方案是使用 TS3 可以识别的 DNS SRV 记录——这基本上就是它们的全部目的。这样,客户端将直接地转到指定的 TS3 服务器,而无需联系您的“路由”服务器。

  2. 如果您无法创建 SRV 记录,则请在两台服务器之间建立一个基本隧道;删除 SNAT 规则;将 DNAT 规则更改为使用 TS 服务器的“隧道”IP 而不是其公共 IP;并在 TS 服务器上设置“策略路由”,以便它知道通过相同的隧道进行响应。

相关内容