Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Считываем из модуля данные, в случае ошибки завершаем выполнение:
count=read(fddev,(char *)&data,sizeof(struct data_log));
if(count<0) stop_daemon();
Если установлен флаг готовности данных для считывания и поступил пакет с запрещенного адреса, фиксируем это событие в log-файле:
if(data.ready==1) {
if(data.action==0) {
if(fill_log(f,data.action,data.addr) < 0)
stop_daemon();
}
}
}
}
Заполнением log-файла ведает функция fill_log, к ней мы еще вернемся.
Теперь подошла очередь функции инициализации. Напомню, что ее задача – передать модулю ядра правила фильтрации (т.е. IP-адрес).
void init_daemon()
{
int err;
struct iphdr ip_pack;
В структуре ip_pack, в поле saddr (адрес источника), будет находится запрещенный IP-адрес.
Обнулим эту структуру:
memset(&ip_pack,0,sizeof(struct iphdr));
и заполним поле адреса источника:
ip_pack.saddr=inet_addr("192.168.1.10");
Подготовим к работе log-файл. Если log-файл отсутствует, создаем его:
f=open(LOG,O_CREAT|O_APPEND|O_RDWR,0644);
if(f<0) {
perror(«open log»);
exit(0);
}
Теперь передадим модулю правила фильтрации. Открываем устройство в режиме чтения/записи:
fddev=open("/dev/firewall",O_RDWR);
if(fddev<0) {
perror("firewall");
exit(0);
}
Записываем в него структуру ip_pack:
err=write(fddev,&ip_pack,sizeof(struct iphdr));
if(err<0) {
perror("firewall");
stop_daemon();
}
Итак, IP-пакеты, поступившие с хоста с адресом 192.168.1.10, будут заблокированы на входе нашей системы.
Выходим из функции:
return;
}
Если вам не понравилось, что IP-адрес введен непосредственно в исходный текст, то можете усовершенствовать код, считывая адрес из файла или из командной строки.
Теперь рассмотрим функцию, которая осуществляет запуск демона на выполнение.
void start_daemon()
{
Демон должен реагировать только на один сигнал – SIGINT. При получении этого сигнала демон завершает выполнение. Все остальные сигналы необходимо заблокировать.
Определим переменные: