修改套接字结构以将数据包发送到另一个IP

时间:2015-04-23 10:21:55

标签: linux sockets tcp linux-kernel

假设有一个客户端程序在端口10000上维护与服务器的TCP套接字连接。

是否可以永久修改套接字结构,如目标IP,而无需使用任何类型的系统调用关闭或重新加载套接字和客户端程序,还可以不使用iptables

我想将数据包重定向到另一台机器进行分析,而不会破坏连接。

假设我有root权限,可以修改内核或添加内核模块。

主机是Ubuntu Linux。

编辑:我很清楚我不能在应用程序层中这样做,所以我正在寻找直接修改内核和TCP / IP堆栈的方法,这可能吗?这些信息必须保存在内存中。

1 个答案:

答案 0 :(得分:0)

应用程序绝对没有办法通过标准API修改TCP套接字连接。这样做会破坏与连接相关的大部分状态,并且第三台机器上的TCP肯定无法接受这些数据包。

也就是说,你可以在IP层重写目的地(通过iptables),让它进入第三台机器,它会捕获它(再次在IP层),读取和分析内容,恢复原始目的地,并转发它。

如果第三台计算机实际上位于源计算机和目标计算机之间的网络上,您甚至不必进行任何IP目标重写 - 您可以在数据包流过时捕获它们。这是" man in the middle"操作

最后,您可以让路由器将所有数据包转发到连接到机器#3的以太网端口,然后捕获(始终在IP层)正在向其广播的数据包的副本。或者使用“愚蠢的中枢”#34; (而不是"智能交换机")将所有数据包转发到所有端口,以便与机器#3连接源或目的地。

任何数据包嗅探器(例如WireShark)都会针对最后两个建议。