如何在Linux(Ubuntu)中拦截tcp数据包并在没有代理的情况下快速修改?例如,将数据包捕获为wireshark但修改数据包。
需要捕获,搜索和替换数据包,但例如:
搜索正则表达式"/(<form\s+.*?>)/i"
,替换为"$1\n<input name=\"newinput\">"
仅针对使用ftp,smtp,http等的本地数据包。如何做到这一点?
答案 0 :(得分:2)
根据您的示例,您不希望仅更改数据包中的单个字节,而是更改可能跨越多个数据包的字符串。此外,您的替换可能与原始字符串的长度不同。如果您在数据包级别执行此操作(因为您不想使用代理),则需要:
除了实现这一点的复杂性之外,延迟数据包的第一点也可能推断出TCP流量控制,这可能会使您的连接速度减慢甚至停止。
因此,实现这种深度数据包修改的常用方法是使用代理,其中客户端和代理之间存在一个TCP连接,而代理和服务器之间存在另一个TCP连接。这样,您就有了两个独立的TCP连接,它们都有自己独立的TCP流控制。此外,内核自动处理正确的序列号等,因此无需手动调整。
我不知道你没有代理人的要求是多么不可改变。可能您只是想要拥有需要在客户端配置的显式代理。但是,代理也可以以透明的方式使用,而不需要在客户端中进行显式配置。
因此,您可以使用透明代理更好地实现您的实际需求。有关如何为HTTP执行此操作,请参阅this documentation for mitmproxy。人们也可以以类似的方式为HTTP而不是协议实现这一点。