晚上好.发布到这个网站对我来说是新的,但我一直是一个感恩的读者,他已经从这个论坛学到了很多东西,现在已经有一段时间了.这是我第一次遇到问题我既不能自己解决,也不能借助Stackoverflow上已存在的条目或互联网提供的任何其他资源.
我希望你能再次帮助我(从现在开始,我也能帮助别人,因为我觉得自己已经成长为能够成为写作会员的地方).
问题:
我正在研究内核模块.它的目的是使用PRE_ROUTING netfilter挂钩从内核窃取带有特定源IP的传入数据包.只有TCP数据包才对它很有用.
现在,钩子通过dev_queue_xmit()将数据包重新注入正常的内核数据包处理例程,并将数据包的NF_STOLEN返回给内核.来自其他源地址的数据包不会被重新注入,但会通过返回NF_ACCEPT而不是NF_STOLEN来忽略.
内核模块还存储每个被盗数据包的TCP seq号,以便确定来自所提到的IP的传入数据包是新的,还是已经通过dev_queue_xmit()进行了修改和重新注入,因为这些数据包再次遍历钩子.
什么工作:
>模块加载
> Hook已注册
>为每个数据包调用Hook.
> Hook可以确定数据包SRC IP是否是我正在寻找的IP.
> Hook为具有其他源地址的数据包返回NF_ACCEPT
>重新注入具有源地址的数据包,同时为它们返回NF_STOLEN
>重新传输的数据包再次遍历钩子并被忽略
问题
当我在加载模块后使用浏览器访问IP时,我的IP堆栈似乎崩溃了.我不能再ping任何地址了.模块记录它遇到来自相关IP的数据包,并且它将它们重新排队并且之后它发现了一个已知的数据包(所以一切看起来都很好),但仍然:没有正确连接到站点/任何其他地址.
这是钩子代码:
static unsigned int hook(unsigned int hooknum,struct sk_buff *skb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *))
{
struct iphdr *iph;
struct tcphdr *tcph;
unsigned int i;
if(!skb)
return NF_ACCEPT;
iph = (struct iphdr *)skb_network_header(skb);
if(!iph || !(iph->saddr) || iph->saddr != *(unsigned int*)suspicious_ip)
return NF_ACCEPT;
tcph = (struct tcphdr *)skb_transport_header(skb);
for(i=0; i < number_of_known_packets; i++)
{
if(tcph->seq == *(already_known_packets+i))
{
debug("Already known packet");
return NF_ACCEPT;
}
}
debug("Ne