当前位置: 首页 > 知识库问答 >
问题:

linux - 为什么我的这个netfilter的钩子函数抓不到端口号?

太叔豪
2023-12-26

为什么我的这个netfilter的钩子函数抓不到端口号?

unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)    //这个函数是钩子函数.    //抓到包时会执行该函数.    //sk_buff是抓到的数据包.    //接受了3个参数,只有中间那个用到了.{    struct iphdr*p=ip_hdr(skb);    if(p->protocol==6)    {        printk(KERN_INFO"TCP packet!");        printk(KERN_INFO"---len=%d",skb->len);        struct tcphdr*t=(struct tcphdr*)(skb->data+p->ihl*4);        u16 srcport=t->source,dstport=t->dest;        printk(KERN_INFO"---srcport=%hu,dstport=%hu",srcport,dstport);    }    return NF_ACCEPT;  // accept the packet                       //这里,钩子函数判定,接受该包.}

钩子函数是这个,然后我用insmod把它加入内核,但端口号显示的并不是正确的.我开了几个网页,但它并没有出现类似80,443的端口号.我又开了2个终端,用netcat在本地的12345端口进行了几次通信,它还是没有显示12345?

共有2个答案

马弘益
2023-12-26

没有把端口号的格式修改.
应该是
u16 srcport=ntohs(t->source),dstport=ntohs(t->dest);

丁韬
2023-12-26

你的代码看起来大致正确,但是有几个可能的问题导致你无法正确捕获端口号。

  1. IP头和TCP头之间的偏移问题:你在解析TCP包时,将IP头和TCP头之间的偏移设置为p->ihl*4。这是IPv4的标准头部长度,但是如果IP头中有选项字段,那么实际的长度可能会更长。你需要使用ip_hdrlen(skb)来获取实际的IP头长度。
  2. TCP头的解析:你需要确保你正确地解析了TCP头。你的代码中,你假设TCP头从skb->data+p->ihl*4开始,这是正确的,但是你需要确保你已经正确地解析了TCP头。
  3. 查看正确的源和目标端口:你需要确保你查看的是正确的源和目标端口。在你的代码中,你直接从TCP头中获取源和目标端口,这是正确的。但是,你需要确保你查看的是正确的数据包方向。

以下是一个修改后的代码示例:

unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state){ struct iphdr* p = ip_hdr(skb); if (p->protocol == 6) { struct tcphdr* t = (struct tcphdr*)(skb->data + ip_hdrlen(skb)); u16 srcport = t->source; u16 dstport = t->dest; printk(KERN_INFO "TCP packet!\n"); printk(KERN_INFO "---len=%d\n", skb->len); printk(KERN_INFO "---srcport=%hu, dstport=%hu\n", srcport, dstport); } return NF_ACCEPT;}

请注意,这只是一个示例,你可能需要根据你的具体需求进行修改。此外,还需要注意的是,Netfilter的钩子函数在不同的内核版本和配置下可能会有所不同,所以如果上述代码不能正常工作,你可能需要查阅你正在使用的内核版本的文档或者寻求更具体的帮助。

 类似资料:
  • 预计此函数将无法typeCheck。然而,没有解释发生这种情况的原因。在GHCI中试用时,我得到了以下输出: 为什么会出现这种情况?

  • 一个进程不是只能被一个进程使用吗?

  • 父控件内的关键代码 子控件内的关键代码 这个MyLabel就是简单地继承了QLabel并重写了这个mousePressEvent. 运行的结果是,我点击MyLabel时,会打印这个"label mouse press event",说明事件确实发生,并交到了MyLabel对象手上. 但这个过程中,被安装到其上的过滤器eventFilter完全没反应,这是怎么回事?

  • 问题内容: 码: 上面的代码不起作用。当我单击#clicker时,它不会发出警报,也不会隐藏。我检查了控制台,没有任何错误。我还检查了JQuery是否正在加载,实际上是否正在加载。所以不确定是什么问题。我还执行了带有警报的文档就绪功能,并且该功能正常工作,因此不确定我在做什么错。请帮忙。谢谢! 问题答案: 您应该在一个块中添加javascript代码。 即 正如jQuery文档指出的那样:“在文档

  • 其默认“BDD”式接口,mocha提供钩before(),after(),beforeEach(),和afterEach()。这些应该用于设置前置条件并在测试后进行清理。 describe('hooks', function() { before(function() { // runs before all tests in this block }); after(function() {

  • 问题内容: 我有一个箭头函数,看起来像这样(简化): 但是当我调用它时,我得到: 为什么? 例: ( 注意: 对于上述带有箭头功能的 特定 问题,这是一个干净,规范的重复目标。) 问题答案: 当您使用箭头函数的函数主体版本(带有)时,没有暗示。您必须指定它。当您使用 简洁 主体(no )时,主体表达式的结果将由函数隐式返回。 因此,您可以使用显式的方式编写该代码: 或简洁的主体: 例子: 略 切线