오늘은 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 |