我可以使用tun / tap和原始套接字来创build“TCP数据包修改器”吗?

我有一个Linux应用程序,讲TCP,并帮助分析和统计,我想修改它发出的一些TCP数据包中的数据。 我宁愿这样做,而不是黑客的Linux TCP堆栈。

到目前为止,我的想法是做一个“TCP数据包修改器”的桥梁。 我的想法是通过桥的一侧的tun / tap设备连接到应用程序,并通过桥的另一侧的原始sockets连接到网卡。

我担心的是,当你打开一个原始套接字时,它仍然会将数据包发送到Linux的TCP协议栈,所以即使我想,也不能修改它们并发送它们。 它是否正确?

该桥的伪C代码草图如下所示:

tap_fd = open_tap_device("/dev/net/tun"); raw_fd = open_raw_socket(); for (;;) { select(fds = [tap_fd, raw_fd]); if (FD_ISSET(tap_fd, &fds)) { read_packet(tap_fd); modify_packet_if_needed(); write_packet(raw_fd); } if (FD_ISSET(raw_fd, &fds)) { read_packet(raw_fd); modify_packet_if_needed(); write_packet(tap_fd); } } 

这看起来是可能的,还是有其他更好的方法来实现相同的事情? (TCP数据包桥接和修改)

有几年前我用一些应用程序来做一些测试防火墙的TCP / IP数据包操作: fragoute和fragtest 。 看起来他们多年来一直没有被触及,但他们可能会给你一些关于在你的代码中做什么的想法。

您可能需要考虑使用LD_PRELOAD库来挂接它用来发送数据的函数(send(),write()等)。

这根本不会涉及任何内核的混乱。

另一个选择是将出站连接NAT到可以读取数据的本地代理,进行任何修改,然后将其全部发送到真正的目的地(通过一些选项来防止它再次被NAT并绕圈)

您可以使用点击模块化路由器 。 这是一个完全用C ++实现的软件路由器。 Click允许您捕获数据包通过路由器中的elements ,您可以根据需要修改或收集统计信息。 作为一个内核模块,你完全覆盖了linux路由机制,并且作为一个userland二进制文件,你只需从接口中获得每个数据包的重复(如你在文章中提到的那样)。 数据包可以通过点击图表通过pcap过滤器和各种其他机制来定向

如果您正沿着桥梁路线前进,我认为这为您正在寻找的东西提供了最直接的支持,因为您可以根据需要使用tun / tap,从主机到/从设备捕获方法。