iptables 将特定外部 ip 的流量路由到不同的本地 ip,并返回以外部 ip 作为源的响应

iptables 将特定外部 ip 的流量路由到不同的本地 ip,并返回以外部 ip 作为源的响应

我的树莓派是我的标准网关,位于路由器和家庭网络的其余部分之间。当我的台式电脑将数据包发送到特定的外部 IP 时,我希望我的树莓派将它们发送到另一台本地计算机。 (尝试模拟游戏服务器,但游戏对服务器 IP 进行了硬编码)这​​需要适用于 TCP 和 UDP。

我在我的树莓派上尝试了以下规则:(1337=游戏端口,1.2.3.4=游戏服务器,192.168.0.169=其他本地机器模拟服务器)

iptables -t nat -A PREROUTING -d 1.2.3.4/32 -p udp -m udp --dport 1337 -j DNAT --to-destination 192.168.0.169:1337
iptables -t nat -A PREROUTING -d 1.2.3.4/32 -p tcp -m tcp --dport 1337 -j DNAT --to-destination 192.168.0.169:1337

UDP 工作正常。发送的数据包被路由到192.168.0.169并返回响应。然而它们不是来自1.2.3.4(不存在的游戏服务器)而是来自我的模拟服务器192.168.0.169。对于 UDP,这并不重要,但是对于 TCP,这会导致握手失败:

线鲨

(我的台式电脑是192.168.0.199。来自模拟游戏服务器的 Wireshark 视图192.168.0.169。据我所知,SYN ACK 不起作用,因此重新传输。我猜这是因为 SYN ACK 来自意外的 IP)

192.168.0.199我尝试用以下规则重写数据包的源 IP :

iptables -t nat -A POSTROUTING -s 192.168.0.169/32 -d 192.168.0.199/32 -p tcp -j SNAT --to-source 1.2.3.4

然而它根本行不通。我还不擅长 iptables,所以我可能做错了什么,但我不确定将所有数据包的源从游戏服务器重写到我的台式电脑是否是一个好主意(其他应用程序可能会搞砸) 。

额外问题:DNAT 是否应该在有响应时重写源 IP?

答案1

额外问题:DNAT 是否应该在有响应时重写源 IP?

是的,iptables NAT 规则仅对连接的第一个数据包起作用,后面的数据包将根据第一个规则建立的映射进行处理。

发送的数据包被路由到 192.168.0.169 并返回响应。但是它们不是来自 1.2.3.4(不存在的游戏服务器),而是来自我的模拟服务器

问题在于 NAT 无法转换从未发送给它的数据包。这是您的场景中发生的情况。

  • 客户端将初始数据包制作为1.2.3.4
  • 客户端查看其路由表,没有找到任何更好的路由,因此将数据包发送到其默认网关(即 NAT 盒)。
  • NAT 盒在其连接跟踪表中查找数据包,确定它是新连接,执行 NAT 操作并建立连接跟踪条目。
  • NAT 在其路由表中查找新目的地并将数据包发送到服务器。
  • 服务器照常制作回复交换源和目标
  • 服务器查找其路由表,找到客户端 IP 的匹配项并直接将数据包发送给客户端
  • 回复到达客户端,但由于它没有通过 NAT 框返回,因此它具有错误的源 IP。
  • 回复已被删除。

那么我们能做些什么呢?一种解决方案是伪装从客户端到服务器的流量,以便服务器将流量视为来自 NAT 盒。我相信以下应该做到这一点

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.169 -j MASQURADE

相关内容