Что ж, "вернемся к нашим баранам".
Нужно сохранить получившуюся новую версию ядра, заархивировав его:
$ su
$ cd /usr/src/
$ ls -l
$ tar cvjf linux-2.4.22.tar.bz2 linux-2.4.22
Некторое время будет создаваться архив, при этом выводится на экран что
в этот архив добавляется.
$ ls -l
Скопируем в каталог исходников еще несколько новых исходников:
$ cp /home/koal/files/patch-o-matic-20030107.tar.bz2 ./
$ cp /home/koal/files/iptables-1.2.8.tar.bz2 ./
Разархивириуем их
$ tar xvjf iptables-1.2.8.tar.bz2
$ tar xvjf patch-o-matic-20030107.tar.bz2
Для удобства работы с каталогом ядра создадим символьную ссылку на
основной каталог linux-2.4.22:
$ ln -s ./linux-2.4.22 linux
Зачем мне все это надо? Пакет "patch-o-matic" содержит в себе множество
патчей, которые позволяют гибче настраивать работу с сетями при
использовании iptables, которая в свою очередь обеспечивает возможность
создания правил для сетевой маршрутизации, фильтрации, что необходимо
для создания шлюзов, мостов, файерволов. Вообщем, мне это надо. А еще c
ASPLinux9 предоставляется уже устаревшая версия iptables - 1.2.7a, а
текущая 1.2.8. Итак, сначала рабираюсь с patch-o-matic:
$ cd patch-o-matic-20030107
Сначала приложим стандартные заплатки.
$ KERNEL_DIR=/usr/src/linux/ ./runme pending
Затем, - заплатки из дополнительного набора, некоторые из них еще в
стадии разработки, а некоторые конфликтуют друг с другом и другими
возможностями, заложенными в ядре - т.е. я устанавливаю их на свой
страх и риск.
$ KERNEL_DIR=/usr/src/linux/ ./runme extra
В результате, я выбрал следующее (функциональные возможности я сейчас
описывать не буду, это, наверное, случится когда я буду их пробовать на
практике, пока я их просто перечислю):
base/iplimit
base/mport
base/time
extra/condition
Теперь скомпилируем новые iptables:
$ cd ../
$ cd iptables-1.2.8
$ make KERNEL_DIR=/usr/src/linux/
/usr/include/linux/autoconf.h:1:2: #error Invalid kernel header included in userspace
make: *** [extensions/libipt_ah_sh.o] Ошибка 1
Ага, фигушки. Ошибка. Если сейчас вывести содержимое файла
/usr/include/linux/autoconf.h командой:
$ cat /usr/include/linux/autoconf.h
то можно увидеть следующее
#error Invalid kernel header included in userspace
ИМХО, это не соответсвует синтаксису языка С. Я долго бился над этой
проблемой, пока не прочитал на одном форуме, что нужно создать пустой
файл autoconf.h в исходниках ядра. Итак
$ touch ../linux/include/linux/autoconf.h
$ make KERNEL_DIR=/usr/src/linux/
Ах черт, опять ошибка.
extensions/libipt_condition.c: In function `parse':
extensions/libipt_condition.c:49: `CONDITION_NAME_LEN' undeclared (first use
in this function)
extensions/libipt_condition.c:49: (Each undeclared identifier is reported only
once
extensions/libipt_condition.c:49: for each function it appears in.)
make: *** [extensions/libipt_condition_sh.o] Ошибка 1
смотрим файл extensions/libipt_condition.c в 49 строку:
$ cat extensions/libipt_condition.c | head -n 49 | tail -n 1
if (strlen(argv[optind - 1]) < CONDITION_NAME_LEN)
тогда обратим внимание на секцию заголовков:
$ cat extensions/libipt_condition.c | head -n 15
нас интересует строка
#include<linux/netfilter_ipv4/ipt_condition.h>
потому что именно она отвечает за подключение файла заголовоков. Сейчас
смотрим этот файл:
$ cat ../linux/include/linux/netfilter_ipv4/ipt_condition.h
ага, ну конечно. Вместо определения CONDITION_NAME_LEN определяется
"#define VARIABLE_NAME_LEN 32", это объясняется тем, что дата выхода
patch-o-matic более ранняя, чем iptables. Значит, с помощью mcedit
поправим файл extensions/libipt_condition.c
$ mcedit extensions/libipt_condition.c
вместо CONDITION ставим VARIABLE и сохраняемся.
Снова компилируем:
$ make KERNEL_DIR=/usr/src/linux/
Все. Скомпилировалось. Если сейчас сделать "ls -l", то можно увидеть,
что скомпилировалась еще и версия iptables для протокола IPv6
("ip6tables"). Я не хочу пока работать с этим протоколом, поэтому хочу
чтобы этого бинарника не было. Для этого, с помощью mcedit, я поправлю
файл Makefile, но предварительно удалим, то что мы скомпилировали:
$ make clean
$ mcedit Makefile
Раскоментируем строку 5: (показано как теперь стало)
DO_IPV6 =0
и закоментируем строчки с 30 по 32
#ifeq ($(shell [ -f /usr/include/netinet/ip6.h ] && echo YES), YES)
#DO_IPV6:=1
#endif
Снова компилируем:
$ make KERNEL_DIR=/usr/src/linux/
теперь файлика "ip6tables" не наблюдается.
ОК. Теперь остановим текущий сервис iptables.
$ /sbin/service iptables stop
Сохраним файл управления сервисом iptables.
$ cp /etc/init.d/iptables ../
Деинсталируем действующий rpm пакет iptables
$ rpm -e iptables
И завершим инсталяцию нового пакета
$ make install KERNEL_DIR=/usr/src/linux/
Все. Исполняемы файлы пакета теперь лежат /usr/local/sbin. Копируем
файл управления сервисом обратно в /etc/init.d
$ cp ../iptables /etc/init.d/
Для дальнейшего удобства создаем символьные ссылки на бинарные
файлы в /sbin/
$ ln -s /usr/local/sbin/iptables /sbin/iptables
$ ln -s /usr/local/sbin/iptables-save /sbin/iptables-save
$ ln -s /usr/local/sbin/iptables-restore /sbin/iptables-restore
Проверяем
$ ls -l /sbin/ipt*
Должна вывестись информация о символьных ссылках, вида
lrwxrwxrwx 1 root root 24 Сен 22 15:25 /sbin/iptables -> /usr/local/sbin/iptables
lrwxrwxrwx 1 root root 32 Сен 22 15:26 /sbin/iptables-restore
-> /usr/local/sbin/iptables-restore
lrwxrwxrwx 1 root root 29 Сен 22 15:25 /sbin/iptables-save ->
/usr/local/sbin/iptables-save
В заключение, необходимо настроить запуск сервиса на соответствующих
уровнях операционной системы:
$ /sbin/chkconfig --level 2345 iptables on
$ /sbin/chkconfig --level 016 iptables off
$ /sbin/chkconfig --list iptables
Попробуем запустить сервис:
$ /sbin/service iptables start
У меня данная операция прошла без ошибок.
C уважением, Kolotov Alexandr (aka mr. Эбола)
отвечать: myscri***@e*****.ru
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru