2015-11-20 60 views
1

我正在写一个内核模块,通过使用网络过滤器来阻止访问特定的网站,它的工作效果很好。我已经为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的

回答

1

我不认为这是可能通过使用网络过滤器重定向TCP请求。如果我没有记错,只有包含有效载荷的数据包才会通过netfilter框架,但三向握手中的数据包(如同步)将由接口卡处理和响应。这样做的原因可能是性能。

因此,您的程序可能发生的情况是,带有http请求的数据包实际上被重定向到test,但不是用于syns,这意味着您的客户端和test之间甚至没有建立tcp连接。我建议使用wireshark检查是否所有数据包都重定向到test

也许你可以尝试代理服务器,而不是在内核模块中做所有事情。

如果我错了,请务必纠正我。

+0

对不起,延迟回复。我没有用wireshark进行测试,但很可能你说的是真实的。我使用printk测试了解发生了什么,发现客户端不断向同一个IP地址发送请求,并且不承认我做出的任何更改。我正在考虑使用连接系统调用的不同方法。 – user30646

+1

我刚刚意识到你忘了重新计算ip头的校验和。网卡将丢弃具有无效校验和的数据包。 – ruofan

+0

你知道如何重新计算校验和吗? – user30646

1

我实际上正在处理类似于这个,但在用户空间。

您可能需要做的就是嗅探数据包,直到获得GET请求和Host标头。如果它与要重定向到其他位置的主机相匹配,则假设来自Web服务器的响应为302 Redirect响应。您可能仍需要跟踪连接本身以处理FIN等。

祝您好运!

1

你的方法是健全的,你几乎在那里。

首先,按照@ruofan的建议,您需要确保更新重定向数据包的IP头校验和。根据你在做什么,你可能还必须更新他们的TCP头部校验和。

此外,如果您希望将针对一个网站的流量重定向到另一个网站,则应该编辑ip标头的daddr字段,而不是它们的saddr字段。请注意,您稍后可能需要更改应用程序的响应数据包的ip头字段以正确处理它们。

最后但并非最不重要的一点,请记住,您应该修改与注册为NF_INET_PRE_ROUTING的挂钩相关的目标相关字段,以及注册为NF_INET_POST_ROUTING的挂钩的源相关字段。

祝你好运!

相关问题