1

netfilter にフックを登録するカーネル モジュールを作成しています。モジュールがロードされているマシンに ssh/telnet で接続すると、ハンドラーが呼び出されません。

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 (外部ゲートウェイ プロトコル) に対して呼び出されています。2 番目の printk は印刷されません。何か不足していますか?

4

3 に答える 3

3

ここで使用されているプロトコルは、IANAによって割り当てられたIPプロトコル番号とは異なります。8はEGP用であり、EGPは古くなっています。

sk_buffのプロトコルフィールドはで定義され、8はETH_P_IP用です。データは常にIPトラフィックであるため、最初の条件付きチェックは常にtrueです。したがって、コードの2番目の部分は実行されません。

于 2011-10-06T12:20:44.767 に答える
0

sk_buffETH_P_* 値を取る関数「eth_type_trans」によって初期化されたプロトコル フィールドがどのように機能するかを調べる必要があります。すべての 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で定義された適切なプロトコル定義値を使用してください

于 2013-03-06T18:04:28.963 に答える