NetFiler Hook가 호출되지 않습니다
-
09-09-2019 - |
문제
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
제휴하지 않습니다 StackOverflow