我可以使用 tun/tap 和原始套接字制作 "TCP packet modifier"吗?

标签 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数据包桥接和修改。)

最佳答案

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

关于我可以使用 tun/tap 和原始套接字制作 "TCP packet modifier"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2664955/

相关文章:

android - 客户端/服务器 Android 应用程序 : Two AsyncTask. 问题

CS50破解问题。需要有关如何解密 2-4 个字符的单词的帮助

c# - 异步套接字服务器和AS3 Flash应用程序-未处理用户断开连接

c++ - 无符号整数如何工作

python - 有没有办法以编程方式获取 ps 输出?

linux - 从 .txt 文件中删除扩展 ASCII 字符 Linux 终端

linux - 这个 Bash(和/或其他 shell?)构造叫什么?

c++ - 用 recv() 接收部分数据,这可能吗?

c - C 的最小哈希函数?

c# - 我可以将 C DLL 的输出重定向到我的 c# log4net 输出吗