我有一个 PC 客户端。我在电脑上有一个服务器。客户端和服务器通过带有基于Linux操作系统的固件的路由器连接。
客户端向服务器发送数据包并接收响应。路由器必须拦截数据包并对其进行修改。类似嗅探的东西,但它不是嗅探,因为我需要修改数据包。
我必须为此编写一个程序。
我尝试在路由器上打开原始套接字,但原始套接字上的 reсvfrom 不会拦截数据包,只是复制它。数据包正在进行中。
您能建议我任何方法来解决这个问题吗?
附:对不起,我的英语不好。 :)
最佳答案
我会混合使用 iptables
和 libnetfilter_queue
(假设您的内核相对较新)
向
iptables
添加一条规则,将所有 udp 数据包转发到NFQUEUE 0
,以便将数据包从内核发送到用户空间。iptables -A INPUT -p udp -m udp --dport xxxxx -j NFQUEUE --queue-num 0
构建一个监听
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/