Всем привет, хочу написать модуль, который перехватывает IP-пакеты. Изучаю готовые решения на гитхабе, нашел один проект
https://github.com/GhazaleZe/mini_firewall . Но при его запуске и тестировании он не блокирует пакеты от IP, которые находятся в черном списке, да еще и при выгрузке этого модуля, когда приходят пакеты от других IP, зависает компьютер.
Этот код проверяет есть ли IP, от которого пришел пакет, в черном списке, и в случае истины не допускает IP-пакет до конечного пользователя ю
unsigned int b_hook(unsigned int hooknum, struct sk_buff *skb,
const struct net_device *in, const struct net_device *out,
int(*okfn)(struct sk_buff *))
{
struct udphdr *udp_header;
struct tcphdr *tcp_header;
unsigned int dest_port, source_port;
struct sk_buff *sock_buff;
struct iphdr *ip_header;
sock_buff = skb;
ip_header = (struct iphdr *)skb_network_header(sock_buff);
static char myipb[256];
ip_header = (struct iphdr *)skb_network_header(sock_buff);
if(!sock_buff) {
return NF_DROP;
}
snprintf(myipb, 16, "%pI4", &ip_header->saddr);
if (ip_header->protocol == 17) { //if protocol is UDP
udp_header = (struct udphdr *)(skb_transport_header(skb));
source_port = (unsigned int)ntohs(udp_header->source);
dest_port = (unsigned int)ntohs(udp_header->dest);
}
else if(ip_header->protocol == 6) { //if protocol is TCP
tcp_header = (struct tcphdr *)(skb_transport_header(skb));
source_port = (unsigned int)ntohs(tcp_header->source);
dest_port = (unsigned int)ntohs(tcp_header->dest);
}
else{
source_port=0;
dest_port=0;
}
for (k = 1; k < i ; ++k)
{
if(strncmp(myipb,ips[k],strlen(myipb))==0){
printk(KERN_INFO "Got packet and dropped it. \n");
printk(KERN_INFO "src_ip: %pI4 ** source port: %d\n", &ip_header->saddr,source_port);
printk(KERN_INFO "dst_ip: %pI4 ** dest_port :%d\n", &ip_header->daddr,dest_port);
return NF_DROP;
}
else if(strncmp(myipb,ips[k],strlen(myipb))!=0) {
printk(KERN_INFO "Not in blacklist ,Not dropped. \n");
printk(KERN_INFO "src_ip: %pI4 ** source port: %d\n", &ip_header->saddr,source_port);
printk(KERN_INFO "dst_ip: %pI4 ** dest_port :%d\n", &ip_header->daddr,dest_port);
return NF_ACCEPT;
}
}
}
Аналогичный модуль написан и для IP, которые могут отправлять пакеты.
Спасибо за ответы!