![需要在Linux路由器上捕获UDP数据包,修改它们并将它们发送到原始目的地](https://linux22.com/image/748292/%E9%9C%80%E8%A6%81%E5%9C%A8Linux%E8%B7%AF%E7%94%B1%E5%99%A8%E4%B8%8A%E6%8D%95%E8%8E%B7UDP%E6%95%B0%E6%8D%AE%E5%8C%85%EF%BC%8C%E4%BF%AE%E6%94%B9%E5%AE%83%E4%BB%AC%E5%B9%B6%E5%B0%86%E5%AE%83%E4%BB%AC%E5%8F%91%E9%80%81%E5%88%B0%E5%8E%9F%E5%A7%8B%E7%9B%AE%E7%9A%84%E5%9C%B0.png)
我正在处理一个无法触及的旧应用程序。它将 UDP 数据包发送到根据客户端 ID 计算出的地址(是的,确实如此:它基本上类似于 192.168.0.x,其中 x 是客户端 ID,只是稍微复杂一些)。
我有一台正在运行的 Linux 机器,它将数据包从旧应用程序转发到最终目的地。我需要在应用程序中捕获这些数据包,执行某些操作(即加密它们),然后将新加密的数据包发送到其原始目的地。我想到的是某种 iptables 魔法,它可以更改传入数据包的目标地址,以便它们在本地传送,但不会影响传出的数据包。我不需要原始目标地址,我可以根据数据包的内容重新创建它。有什么建议可以做到这一点吗?
答案1
如果您需要的只是将收到的数据包重定向到本地机器,您可以在 NAT 表中添加如下规则:
iptables -t nat -A PREROUTING -s 1.2.3.4 -d 5.6.7.8 -p udp --dport 3333 -j REDIRECT
这些数字(IP 和端口)只是示例。您需要指定自己的值,或者在不需要时可以省略它们。
此规则将重定向所有接收到的、源自 IP1.2.3.4
并发5.6.7.8
往端口的UDP 数据包3333
。
您需要有一个应用程序监听这个端口号来执行处理,然后将它们发送到目的地(您说您有办法找出目的地)。
答案2
所以你想要一个中间人设置?我会实施以下规则集:
iptables -I INPUT -p udp --dport [yourportlegacy] -j ACCEPT
iptables -I INPUT -p udp --dport [yourportapp] -j ACCEPT
iptables -t nat -I PREROUTING -p udp --dport [yourportlegacy] -j REDIRECT --to-ports [yourportapp]
[yourportlegacy]=旧版应用程序发送的数据包的目标端口
[yourportapp]= 您的操作应用程序在 Linux 机器上监听的端口
使用此规则集,您应该能够使用您的应用在定义的端口上获取数据包。稍后您可以将它们发送到实际目的地。