c - 在路由器上拦截 udp 数据包

标签 c linux sockets network-programming

我有一个 PC 客户端。我在电脑上有一个服务器。客户端和服务器通过带有基于Linux操作系统的固件的路由器连接。
客户端向服务器发送数据包并接收响应。路由器必须拦截数据包并对其进行修改。类似嗅探的东西,但它不是嗅探,因为我需要修改数据包。
我必须为此编写一个程序。
我尝试在路由器上打开原始套接字,但原始套接字上的 reсvfrom 不会拦截数据包,只是复制它。数据包正在进行中。
您能建议我任何方法来解决这个问题吗?
附:对不起,我的英语不好。 :)

最佳答案

我会混合使用 iptableslibnetfilter_queue(假设您的内核相对较新)

  1. iptables 添加一条规则,将所有 udp 数据包转发到 NFQUEUE 0,以便将数据包从内核发送到用户空间。

    iptables -A INPUT -p udp -m udp --dport xxxxx -j NFQUEUE --queue-num 0

  2. 构建一个监听NFQUEUE number 0的进程,修改有效负载并使用libnetfilter_queue功能将完整数据包返回到内核空间。关注 this link知道如何去做。

简而言之,您必须打开队列 0 (nfq_create_queue),设置模式以获取数据包的内容 (nfq_set_mode),然后循环无限的recv来获取由iptables过滤的udp数据包

fd = nfq_fd(h);

while ((rv = recv(fd, buf, sizeof(buf), 0)) >= 0) {
    printf("pkt received\n");
    nfq_handle_packet(h, buf, rv);
}

每次调用nfq_handle_packet时,都会调用在nfq_create_queue阶段定义的回调。在该回调中,您必须修改有效负载,更新大小并重新计算校验和,然后使用 nfq_set_verdict

设置为“有效”

关于c - 在路由器上拦截 udp 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955151/

相关文章:

c - 子进程会在 abort() 上发送 SIGCHLD 吗?

c++ - 与/usr/bin/openssl 输出相同的 C/C++ 程序

c++ - C 和 C++ 代码之间的不兼容

java - 类路径编译正确,但不会运行。我错过了什么

c - Epoll tcp 服务器在接受连接时停止运行

sql-server - 具有 SQL Server (Microsoft) 数据库连接的 Node

java - 如何在p2p应用程序中随机选择谁开始游戏/聊天?

C - 如何检查是否输入了数字

linux - 从具有多个二进制文件的源文件创建 debian 包

node.js - NodeJS - 如何让进程在出现问题时自动重启?