【发布时间】: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