본문 바로가기

linux 커널

netfilter hook을 이용한 fw 만들기 - 2

오늘은 FW만들기 위해 IP와 Port를 출력해볼 것입니다.

IP와 Port를 출력할 수 있다면 원하는 IP또는 Port를 차단할 수 있을것입니다.

 

다음 포스팅은 sqlite를 통해 IP정보와 Port정보를 읽어와 IP와 Port를 확인하고 차단 해볼예정입니다.

 

먼저 netfilter hook으로 받아온 skb에서 tcp인지 udp인지 protocol에 따라 나누어줍니다. 

 

static unsigned int my_hook_function(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
	struct iphdr *ip_header;
    
    // IPv4 프로토콜인지 확인
    if (skb->protocol == htons(ETH_P_IP)) {
        ip_header = (struct iphdr *)skb_network_header(skb);
        
        //TCP 프로토콜인지 UDP 프로토콜인지 확인
        if (ip_header->protocol == IPPROTO_TCP) {
        	printk(KERN_INFO "TCP Packet");
        }
        else if (ip_header->protocol == IPPROTO_UDP) {
        	printk(KERN_INFO "UDP Packet");
        }
    }
         return NF_ACCEPT;
}

 

 

그리고 여기서 출발지 IP,  목적지 IP, 출발지 Port, 목적지 Port를 출력 해볼 차례입니다.

 

static unsigned int my_hook_function(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
    struct iphdr *ip_header;
    struct tcphdr *tcp_header;
    struct udphdr *udp_header;

    if (!skb)
        return NF_ACCEPT;

    // IPv4 프로토콜인지 확인
    if (skb->protocol == htons(ETH_P_IP)) {
        ip_header = (struct iphdr *)skb_network_header(skb);

        //TCP 프로토콜인지 UDP 프로토콜인지 확인
        if (ip_header->protocol == IPPROTO_TCP) {
            tcp_header = (struct tcphdr *)((__u32 *)ip_header + ip_header->ihl);
            printk(KERN_INFO "TCP Packet - Source IP: %pI4, Source Port: %d, Dest IP: %pI4, Dest Port: %d\n",
                   &ip_header->saddr, ntohs(tcp_header->source), &ip_header->daddr, ntohs(tcp_header->dest));
        } else if (ip_header->protocol == IPPROTO_UDP) {
            udp_header = (struct udphdr *)((__u32 *)ip_header + ip_header->ihl);
            printk(KERN_INFO "UDP Packet - Source IP: %pI4, Source Port: %d, Dest IP: %pI4, Dest Port: %d\n",
                   &ip_header->saddr, ntohs(udp_header->source), &ip_header->daddr, ntohs(udp_header->dest));
    }

    return NF_ACCEPT;
}

 

skb_network_header 함수를 통해 네트워크 계층 시작위치를 반환해주는 함수 입니다.

ip_header->ihl은 ip헤더의 길이를 말하며 ip 헤더의 길이만큼 더해주면 tcp 헤더나 udp 헤더의 시작점으로 갈 수 있습니다.

 

오늘 내용은 여기까지입니다.

 

감사합니다.

 

'linux 커널' 카테고리의 다른 글

netfilter hook을 이용한 fw 만들기  (2) 2023.12.18
리눅스 커널 모듈  (2) 2023.12.18
ubuntu 22.04 커널 빌드  (3) 2023.12.03