如何强制 Linux 将 TCP 数据包视为位于目标 IP?

如何强制 Linux 将 TCP 数据包视为位于目标 IP?

情况:

  • 一个 tcp 数据包到达 eth0,目的地为 8.8.8.8。
  • 这个数据包满足一些标准,使我想要拦截它(假设我对来自源 10.0.0.5 的所有数据包或端口 80 上的所有数据包感兴趣)。
  • 该数据包通过 iptables 规则单独列出,以便我可以对其执行一些特殊的操作。

除了忽略数据包或将其路由到正确的目的地之外,我还可以做些什么来将其发送到本地 IP 堆栈,以便任何在正确端口上侦听的程序都可以接收它?


需要澄清的是:我不想修改数据包的目标 IP,也不想将目标 IP 欺骗到整个网络 - 我只想窃取可以用 iptables 规则匹配的数据包。

我尝试过 iptables -j REDIRECT 但似乎无法做到这一点
我也想过创建一个临时接口来接受来自所有 ip 的数据包并使用 iptables 将感兴趣的数据包发送给它,但根据我所读的内容 这将导致 linux 密封它看到的每个数据包 因为它认为它对所有数据包都有一个有效的目标 ip,即使路由已关闭。

只要解决方案能与 TCP 配合使用,就不必专门针对 TCP。

有什么办法可以做到这一点?

答案1

应该可以使用 IPTables 上的 REDIRECT 来执行此操作。这里有几件关于您的尝试没有提到的事情,可能被忽略了 - 即它需要使用预路由链(或输出链,但可能不在这里)。我认为它还需要使用 NAT 表:

  1. 你可能想要使用类似 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8000 的命令

  2. 您需要一个在本地机器的 8000 端口上运行的程序来实际处理请求。

  3. 您可能需要调整您的堆栈,例如启用 ip 转发,根据您的使用情况启用 send_redirects。

给你一个想法——你正在尝试做的事情已经在Linux下通过“透明代理”得到了解决,所以使用指南像这个可以让你离目标更进一步。

您可能还想清理“端口 80 上的所有数据包”的定义 - 如果答案是对您实际提出的问题给出的,那么这可能不起作用 - 我怀疑您的意思是所有发往端口 80 的数据包 - 这与从端口 80 接收的所有数据包也非常不同。

相关内容