【问题标题】:Can I make a "TCP packet modifier" using tun/tap and raw sockets?我可以使用 tun/tap 和原始套接字制作“TCP 数据包修改器”吗?
【发布时间】:2023-03-20 22:03:01
【问题描述】:

我有一个与 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数据包桥接和修改。)

【问题讨论】:

  • 我会说你过度设计了这个。 tcpdump 应该足够用于数据包分析和统计。

标签: c linux sockets tcp raw-sockets


【解决方案1】:

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

如果您走的是 bridge 路线,我认为这为您想要做的事情提供了最直接的支持,因为您可以使用 tun/tap、to/from host 或 to/from您需要的设备捕获方法。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      几年前我使用了一些应用程序来执行一些 TCP/IP 数据包操作以测试防火墙:fragoute and fragtest。看起来它们已经有好几年没有被触及了,但它们可能会给你一些关于在你的代码中做什么的想法。

      【讨论】:

        猜你喜欢
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 2017-05-11
        • 2015-04-02
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        相关资源
        最近更新 更多