>Вот если б ме кто-то кинул исходники как на C брать пакет
>из divert, и возвращать его в ipfw :)
вот кусочек с моей проги:
/*Создаем сокет*/
if ((s=socket(PF_INET, SOCK_RAW, IPPROTO_DIVERT))<0) {
perror("socket");
closelog();
exit(1);
}
/*Заполняем структуру перед вызовом bind*/
sa.sin_family=PF_INET;
sa.sin_addr.s_addr=INADDR_ANY;
sa.sin_port=htons(PORT_NUM);
/*Вызываем bind для инициализации сокета*/
if (bind(s,(struct sockaddr*) &sa,sizeof sa) == -1) {
perror("bind");
close(s);
closelog();
exit(1);
}
Вот так забираем пакетик из сокета(этож обычный raw):
recv_size=recvfrom(s,buf,sizeof buf,0,(struct sockaddr*) &addr,&addr_size);
if (recv_size==-1) {
if (errno==EINTR) {
continue;
}
perror("recv");
closelog();
close(s);
return 1;
}
А чтобы обратно записать - sendto. Только пакетик правильно оформить перед передачей(Указатель на buf сунуть в указатель на структуру типа struct ip* (она есть в netinet/ip.h)). Смотреть одним глазом в man 4 divert, вторым в /usr/src/sbin/natd/natd.c (очень понятно написанный, по нему и изучать divert).
|