如何拦截tcp数据包并在飞行中修改?

Howto intercept tcp packet and modify in the fly?

如何在Linux (Ubuntu) 中拦截tcp 数据包并在没有代理的情况下动态修改?举个例子,用wireshark抓包,修改包。

需要捕获、搜索和替换数据包,但示例:

搜索正则表达式 "/(<form\s+.*?>)/i",替换为 "\n<input name=\"newinput\">"

仅适用于使用 ftp、smtp、http 等的本地数据包。如何制作这个?

鉴于您的示例,您不想仅更改数据包中的单个字节,而是可能跨越多个数据包的字符串。此外,您的替换字符串的长度可能与原始字符串不同。如果您在数据包级别执行此操作(因为您不想使用代理),您需要:

  • 可能会延迟数据包的转发,以防它们可能需要根据后续数据包的内容进行更改
  • 不仅要重写更改有效负载的几个数据包,还要重写所有后续数据包,因为由于数据大小的变化,所有序列号都需要调整
  • 重写您从对等方收到的所有未来数据包,因为需要调整 ACK 中的序列号,以便原始发件人可以将 ACK 与原始数据包相关联

除了实现这一点的复杂性之外,延迟数据包的第一点还可以推断出 TCP 流量控制,这可能会使您的连接变慢甚至停止。

因此,实现这种深度数据包修改的常用方法是使用代理,其中客户端和代理之间有一个 TCP 连接,代理和服务器之间有另一个 TCP 连接。这样你就有了两个独立的 TCP 连接,它们都有自己独立的 TCP 流量控制。此外,内核会自动处理正确的序列号等,因此无需手动调整。

我不知道你对没有代理的要求是多么不可改变。可能是您只是不想拥有需要在客户端配置的显式代理。但是,代理也可以以透明的方式使用,不需要在客户端进行显式配置。

因此,您最好使用透明代理来实现您的实际需求。有关如何为 HTTP 执行此操作的示例,请参阅 this documentation for mitmproxy。人们也可以以类似的方式针对与 HTTP 不同的协议实现这一点。