문제

NetFilter와 함께 후크를 등록하는 커널 모듈을 작성하고 있습니다. I 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 (외부 게이트웨이 프로토콜)을 요구하고 있습니다. 두 번째 인쇄물은 결코 인쇄되지 않습니다. 내가 놓친거야?

도움이 되었습니까?

해결책

여기에 사용 된 프로토콜은 IANA가 할당 한 IP 프로토콜 번호와 다르며, 8 개는 EGP이며 EGP는 구식입니다.

Sk_buff의 프로토콜 필드는 8 개가 eth_p_ip에 대한 정의됩니다. 데이터가 Allways IP 트래픽이므로 첫 번째 조건부 점검은 항상 사실입니다. 따라서 코드의 두 번째 부분은 결코 실행되지 않습니다.

다른 팁

몇 가지 생각 :

  • 후크 핸들러는 (struct skbuff **)가 아닌 (구조 skbuff *)를 취합니다.
  • 위에서 다음과 같이 skb->protocol 존재하지 않습니다. 당신도 원합니다 (*skb)->protocol 아니면 다음 관용구를 원합니다.
struct sk_buff *sock_buf =  *skb;
if(sock_buff->protocol)
  • 패킷이 EGP 패킷 인 경우 두 번째 프린트에서 출력을 기대하지 않아야합니다.

방법을 공부해야합니다 sk_buff Works, 프로토콜 필드는 eth_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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top