我可以使用tun / tap和raw套接字制作“TCP数据包修改器”吗?

时间:2010-04-19 02:46:45

标签: c linux sockets tcp raw-sockets

我有一个谈论TCP的Linux应用程序,为了帮助分析和统计,我想修改它发出的一些TCP数据包中的数据。我宁愿这样做而不破解Linux TCP堆栈。

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

我担心的是,当你打开一个原始套接字时,它仍然会将数据包发送到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数据包桥接和修改。)

3 个答案:

答案 0 :(得分:1)

我曾在几年前使用过一些应用程序来测试防火墙:fragoute and fragtest。看起来他们多年没有被触及,但他们可能会给你一些关于你的代码中做什么的想法。

答案 1 :(得分:1)

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

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

另一种选择是NAT到本地代理的出站连接,该本地代理可以读取数据,进行任何修改,并将其全部发送到真实目的地(有一些选项可以防止它再次进行NAT转换圆圈)

答案 2 :(得分:0)

您可以使用click modular router。它是一个完全用C ++实现的软件路由器。 Click允许您在路由器中通过elements时捕获数据包,您可以根据需要修改或收集统计信息。作为内核模块,您完全覆盖了linux路由机制,并且作为用户空间二进制文件,您只需从接口获得每个数据包的副本(如您在帖子中提到的那样)。通过pcap过滤器和各种其他机制,可以通过Click图形定向数据包。

如果您沿着 bridge 路线前进,我认为这为您要做的事情提供了最直接的支持,因为您可以使用tun / tap,来自/来自主机或来自/来自您需要的设备捕获方法。