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

时间:2017-08-26 00:44:24

标签: linux networking tcp packet-capture sniffing

如何在Linux(Ubuntu)中拦截tcp数据包并在没有代理的情况下快速修改?例如,将数据包捕获为wireshark但修改数据包。

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

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

仅针对使用ftp,smtp,http等的本地数据包。如何做到这一点?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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