@egorggegor

Почему код не работает?

Всем привет, хочу написать модуль, который перехватывает 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, которые могут отправлять пакеты.

Спасибо за ответы!
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
leahch
@leahch Куратор тега Linux
3Д специалист. Долго, Дорого, Дерьмово.
Окей, гугл. У вас и так все работает, но код кривоват. (по результатам диспута)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы