代码之家  ›  专栏  ›  技术社区  ›  Rohit

Netfiler挂钩未被调用

  •  1
  • Rohit  · 技术社区  · 17 年前

    struct nf_hook_ops my_hook_ops;
    my_hook_ops.hook = hook_handler;
    my_hook_ops.pf = PF_INET;
    my_hook_ops.hooknum = NF_INET_PRE_ROUTING;
    my_hook_ops.priority =  NF_IP_PRI_FIRST;
    nf_register_hook(&my_hook_ops);
    

    处理函数:

    unsigned int hook_handler(unsigned int hooknum,
                       struct sk_buff *skb,
                       const struct net_device *in,
                       const struct net_device *out,
                       int (*okfn)(struct sk_buff *))
    {
    
    
        if(!skb)
            return NF_ACCEPT;
    
        struct iphdr* ip_header;
        struct tcphdr* tcp_header;
        union  ip_address ipaddr;
    
        printk(KERN_INFO "Entered handler\n");
    
        if(skb->protocol == 8)
            return NF_ACCEPT;
    
        // Log the received packet
        ip_header  = ip_hdr(skb);
        tcp_header = tcp_hdr(skb);
        ipaddr.saddr = ip_header->saddr;
        printk(KERN_INFO "Received packet:\nIP Address: %u.%u.%u.%u\nProtocol: %d\nSource port: %d\nDestination port: %d\n",
                ipaddr.a[0],ipaddr.a[1],ipaddr.a[2],ipaddr.a[3],
                skb->protocol,
                tcp_header->source,
                tcp_header->dest);
    
        return NF_ACCEPT;
    }
    

    正在为协议8(外部网关协议)调用钩子。第二次印刷永远不会印刷。我错过什么了吗?

    3 回复  |  直到 17 年前
        1
  •  3
  •   Wei    14 年前

    这里使用的协议与IANA分配的IP协议号不同,IANA为EGP分配了8,EGP已经过时。

    sk_buff的协议字段在中定义,其中8表示ETH_P_IP。由于您的数据始终是IP流量,因此第一个条件检查始终为真。因此,代码的第二部分永远不会被执行。

        2
  •  1
  •   Stobor    17 年前

    有几个想法:

    • 钩子处理程序接受一个(struct skbuff**),而不是一个(structskbuff*)
    • 根据上述内容, skb->protocol 不存在。你也想要 (*skb)->protocol 或者你想要以下成语:
    struct sk_buff *sock_buf =  *skb;
    if(sock_buff->protocol)
    
    • 如果数据包是EGP数据包,则不应期望从第二次打印中输出,因为您会在它之前返回。
        3
  •  0
  •   Ibrar Ahmed    13 年前

    你需要研究如何 sk_buff works,由函数“eth_type_trans”初始化的协议字段,该函数接受eth_P_*值。所有ETH_P_*值在 if_ether 。以下是其中一些值。

    #define ETH_P_LOOP      0x0060          /* Ethernet Loopback packet     */
    #define ETH_P_PUP       0x0200          /* Xerox PUP packet             */
    #define ETH_P_PUPAT     0x0201          /* Xerox PUP Addr Trans packet  */
    #define ETH_P_IP        0x0800          /* Internet Protocol packet     */
    

    您可以清楚地看到0x08是为 Internet Protocol packet .在8的情况下,你的代码显然会返回(即 IP 数据包)

     if(skb->protocol == 8)
        return NF_ACCEPT;
    

    你的 ssh/telnet 显然是IP数据包,并被上述代码拒绝。请使用中定义的正确协议定义值 if_ethr

    推荐文章