我正在写一个内核模块,通过使用网络过滤器来阻止访问特定的网站,它的工作效果很好。我已经为NF_INET_PRE_ROUTING注册了钩子,并且可以检查请求是否是http请求,并且是否进行了IP地址请求。从这里,我想扩展我的模块的功能,使对特定网站的请求重定向到另一个网站。我正在考虑重写iphdr结构体的saddr属性。这是可行的方法吗?我试图重写saddr属性,但请求没有被重定向。 Wget只是停止响应。是否有可能重写iphdr的saddr属性?
这是我的代码片段 -
// This code is inside hook function
__be32 test = ntohl(0xCC4FC5C8);
ip_header = (struct iphdr *)skb_network_header(skb);
ip_header->saddr = test;
return NF_ACCEPT;
内核版本 - 3.19 Ubuntu的
对不起,延迟回复。我没有用wireshark进行测试,但很可能你说的是真实的。我使用printk测试了解发生了什么,发现客户端不断向同一个IP地址发送请求,并且不承认我做出的任何更改。我正在考虑使用连接系统调用的不同方法。 – user30646
我刚刚意识到你忘了重新计算ip头的校验和。网卡将丢弃具有无效校验和的数据包。 – ruofan
你知道如何重新计算校验和吗? – user30646