Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Часть 2
Владимир Мешков
В первой части статьи мы начали изучение одного из вариантов построения брандмауэра, рассмотрели структуру его основной составляющей – модуля ядра, а также получили навыки внесения изменений в ядро операционной системы Linux. В этой части мы рассмотрим две оставшиеся составные брандмауэра – процесс-демон и программу инициализации и запуска процесса-демона.
Задача программы инициализации и запуска процесса демона – принять исходные данные (правила фильтрации) и запустить на выполнение процесс-демон, передав ему эти правила. В нашем примере правилами фильтрации является IP-адрес хоста, чьи пакеты мы будем блокировать.
Процесс-демон после активизации передает модулю ядра правила фильтрации и в дальнейшем занимается ведением log-файла, в котором фиксируется время запуска/останова демона и попытки доступа с запрещенного адреса.
Теперь давайте детально рассмотрим каждую составляющую.
Программа инициализации и запуска процесса-демона
Нижеприведенный программный код разместим в файле sfc.c. Здесь будет находиться главная функция main().
Рассмотрение программы начнем с определения заголовочных файлов и переменных.
Нам понадобятся следующие header-файлы:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "sfc.h"
В файле sfc.h определено имя файла, в котором хранится идентификатор процесса-демона (PID-файл). Файл имеет следующее содержание:
#define PID "daemon.pid"
Идентификатор процесса-демона определим как глобальную переменную:
static pid_t pid;
А теперь распишем главную функцию main().
int main (int argc, char *argv[])
{
void usage():
Это прототип функции для обработки неправильного ввода параметров. Данная функция имеет следующий вид:
void usage()
{
fprintf(stderr," Usage: daemon [ start / stop ] ");
return;
}
Программа при запуске принимает один параметр, определяющий режим ее работы:
n start – запустить процесс-демон на выполнение;
n stop – завершить выполнение процесса-демона.
Для работы нам понадобятся переменные:
n int pid_file – дескриптор файла для хранения идентификатора демона;
n struct stat s – структура для хранения атрибутов файла.
Проверяем правильность ввода входных параметров:
if(argc!=2) {
usage();
return (-1);
}
Если входной параметр указан, определяем, какой режим работы задан. Их, как мы уже сказали, два.
Режим запуска процесса-демона на выполнение
if(!(strcmp(argv[1],"start"))) {
Во избежание повторного запуска проверяем наличие в текущем каталоге PID-файла. Если файл присутствует, то демон уже запущен, о чем пользователь получает уведомление:
if(stat(PID,&s)==0) {
fprintf(stderr," Daemon is allready running ! ");
return (-1);