Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Лопатин Виталий Борисович

Ядерные реакции

Писано для журнала "Хакер-Спец". Лексика оригинала сохранена.

Добро пожаловать в ядерный реактор! Наверное так следует поприветствовать начинающего монстра копьютерного мира, к которым наверное ты себя причисляешь. Причем тут ядрерный реактор???? Да ни при чем. А вот на ядре стоит остановиться.

Что к чему.

Ты уже в курсе, что для того чтобы ты смог защитить свою долбанную систему или сеть от нашествия всяких гнусных парней нужно поставить firewall. Они бывают разных типов, в том числе и такого весьма забавного как пакетные фильтры. У тебя есть возможно прочесть про них, но.... Там не рассказано о некоторых действиях, которые тебе придется сделать.

Перед применением пакетного фильтра тебе придется повозиться с самым сердцем твоей операционной системы -- с ядром.

Я тебе не буду рассказывать про такую шнягу как Windows. Это все пошло и неинтересно. Да, там можно быстро поставить программку фильтра трафика, только вот никто тебе не даст никакой гарантии, что она сама окажется без дырок. И никто тебе не даст гарантии, что эта фигня будет работать именно так как задумал ты сам.

В операционной системы Linux все совсем по другому. Подобно многим настоящим Unix'ам (а кто сказал, что Linix не Unix), в самом нутри Linux содержится система защиты. Тебе остается только активировать ее, настроить, задать правила фильтрации. После всех этих извращений ни одна сволочь к тебе не прорвется.

Прогулка по ядрам.

Как любая нормальная система Linux развилался от версии к версии. Если быть откровенным, то самые первые версии ОС были очень слабы и неразвиты и представляли собой лишь полигон на котором талантливые программеры проводили свои эксперименты. Лишь с версии 2.0 Linux полноценно пошел в массы.

Номер версии ядра состоит из трех чисел в виде х.y.z (главный номер версии, вторичный номер версии, номер релиза). Главный номер о сути является номером поколения ядра. Вторичный номер (номер ветки) означает смену технологии внутри поколения, ну а номер релиза говорит об очередном шаге в улучшении иразвитиии ядра данного поколения. Чем выше номер релиза, тем лучше ядро данной ветки.

В литературе и в Сети говорят о ветках 2.0.х, 2.2.х и 2.4.х. Ты наверное заметил, что вторичный номер у них четный. Дело в том, что ядра с нечетными вторичными номерами являются экспериментальными и очень часто не работоспособны, они предназначены только для разработчиков ядер или для экстремалов.

Про ядра 2.0.х я говорить не буду. Компьютеры под управлениям этих ядер практически не встречаются и интереса не представляют. В настоящее время на серверах крутятся ядра веток 2.2.х и 2.4.х. Пакетные фильтры, встроенные в них очень похожи (впрочем, ничего удивительного, iptables, встроенный в 2.4.х является потомком ipchains из 2.2.х).

Начинаем ковыряние в мозгах.

Прежде чем ты сможешь воспользоваться мощной защитой пакетного фильтра тебе ее надо предварительно включить в состав твоего ядра. Для этого тебе нужны: а) исходные тексты ядра Linux; б) компилятор gcc; в) текстовый редактор. Способ установки исходных текстов ядра зависит от того какой дистрибутив у тебя установлен. Если у тебя Slackware, Gentoo, LFS или еще что-то в этом роде, то мне нефига тут перед тобой распинаться. Ты сам знаешь что и как устанавливается. В случае rpm-based дистрибутивов (ALT Linux, ASP Linux, Red Hat, Mandrake, SuSE, Connectiva) тебе нужно будет установить пакеты с исходниками ядра и всеми причиндалами. Отдельная песня -- дистрибутивы на основе пакетов deb (Debian, Corel), там проще - система установки принятая в них существенно облегчает установку нужных пакетов. В общем случае, установка rpm-based дистрибутива в режиме разработчика автоматически подразумевает установку компилятора и исходных текстов ядра.

Ядро Linux ты также можешь скачать с ftp.kernel.org. На этом ftp-сервере лежат чистые ядра от разработчиков без каких-либо заплаток и доработок от изготовителей дистрибутивов (кстати, хорошо настроенное чистое ядро иногда работает гораздо лучше, чем ядро от изготовителядистрибутива).

Сам я пользуюсь дистрибутивами Mandrake Linux 7.0 (на самосборном ядре 2.2.20) и ALT Linux Master 2.0 (на штатном ядре 2.4.18). В любом случае, какой бы дистрибутив ты не выбрал, настройка и компиляция ядра ничем не будут отличаться.

Ок. Допустим, что у тебя все получилось и ты таки установил требуемые компоненты. Посмотрим во внутрь. Хочу предупредить, что все действия нужно делать аккуратно, потому что ты будешь работать под root.

В комплект ядра входят несколько утилит настройки. Простая текстовая, красивая текстовая, и красивая графическая.

Запуск каждой из них производится из командной строки. Графическая программа настройки ядра будет работать только если ты ее запустил из терминала, работая с Х сервером. Для запуска программ настроек тебе надо будет перейти в каталог /usr/src/linux.

Простая текстовая выглядит очень не фонтан. По сути дела это набор вопросов, на которые ту дожен будешь отвечать Y, N или M. Это означает, опция ядра включена или вкомпилена в ядро (Y), опция выключена (N), или будет сделана как модуль (M). Одна ошибка в ответе и тебе придется все начинать с начала. Простая текстовая настройка запускается привыполненим команды make config.

Красивая текстовая программа настройки требует наличия на твое компьютере библиотеки ncurces. Так что проследи, чтобы эта хреновина у тебя была установлена. Запускается она выполнением команды make menuconfig. Вот вид этой программы настроек. Первый и второй режимы настройки ядра прекрасно работают в текстовой консоли.

Ну и третий вид. Графическая программа настройки ядра требует наличия у тебя языка программирования tcl/tk и всех причиндалов к ней. Зато под Х это выглядит просто суперски как на рисунке.

Запускается она из терминала командой make xconfig. Преимущества второй и третьей программ настроек заключается в том, что ты в любой момент можешь включить или выключить любую опцию и только потом записать конфигурацию. Конфигурация ядра записвается в файл /usr/src/linux/.config Все настройки лежат там в виде параметр=значение. На рисунке как раз виден кусок файла конфигурации, отвечающий за настройки пакетного фильтра.

Названия нужных тебе параметров в ты можешь увидеть в программах настройки, обратившись к подсказке. На рисунке параметр выделен черным.

Список параметров, которые необходимы для настройки пакетного фильтра, а также подробное разъяснение для чего это все нужно, находится в документе Iptables-tutorial(http://gazette.linux.ru.net/rus/articles/iptables-tutorial.html). Я тебе настоятельно рекомендую его изучить. Если у тебя ядро 2.2.х, то тебе понадобится документ Ipchains-HOWTO. Его русский перевод есть на сайте linux.org.ru в разделе Документы. Мне совершенно в лом повторять тебе то, что написано там.

Что получаем.

После того как закончили настройку параметров ядра его надо собрать. Я тебя хочу предостеречь от того, чтобы на все нужные тебе опции отвечать Y. Дело в том, что куски кода, отвечающие за работу тех или иных опций, будут включены в ядро и оно станет очень большим, что может привести к невозможности компиляции. Проще выбрать используемое непостоянно и оформить выбор в виде модуля. Потом этот модуль ты сможешь сам включить или выключить в любое время. Ядра от производителей практически все содержат именно в виде модулей. Так удобнее.

Для сборки ядра тебе нужно выполнить команды
make dep
make bzImage
make modules
make modules_install
make install

Последняя команда установит ядро. Короче, всю эту науку прочитаешь в Kernel-HOWTO.

Гораздо удобнее воспользоваться ядром, идущим с дистрибутивом. Зачастую, там даже не нужны исходние тексты и не нужно пересобирать ядро самому, чтобы настроить ядро по своему вкусу, практически все опции ядра делаются в виде модулей и тебе остается только включить нужные.

Для ядер 2.4.х модули, отвечающие за пакетный фильтр лежат в каталоге /lib/modules/2.4.x/kernel/net/ipv4/netfilter Для ядер 2.2.х соответственно в каталоге /lib/modules/2.2.x/net/ipv4

Загляни туда и увидишь огромную кучу файлов. Каждый из этих модулей отвечает за какую-нибудь дополнительнию функцию пакетного фильтра. Если делать универсальную и гибкую систему, то тебе придется все оформить в виде модулей. Их получится немало. В моей системе их 71 штука. Если их перечислять все, то я просто застрелюсь. Посмотрев на список внимательно и сбросив первое офигевание от количества файлов, ты увидишь: модули можно поделить на несколько групп с общими признаками в названии.

Группа ip_conntrack*.o. Модули этой группы используются для трассировки соединений (даже не спрашивай меня, что это такое, все равно не скажу), а также для применяются для трансляции адресов. В этой группе присутсвуют модули для многих разных протоколов (ftp, irc, netlink, pptp, udp, tcp).

Группа ip_nat*.o используется для трансляции адресов (Network Address Tranlation, NAT). Несколько модулей для различных протоколов.

Группа ipt*.o служит для управления и эксплуатации пакетным фильтром iptables. Это добавление правила, установка маркировок, установка владельца пакета, различные действия и многое другое. Наличие этой группы зависит от установленных параметров ядра CONFIG_IP_NF_*. Подробное описание этих параметров есть в Iptables-tutorial.

Модуль ip_tables отвечает за пакетный фильтр, модули ipchains и ipfwadm отвечают за режим эмуляции пакетных фильтров ядер веток 2.2.х и 2.0.х. Модули iptable_filter, iptable_mangle, iptable_nat являются реализацией таблиц фильтрации пакетов (filter), редактирования пакетов (mangle) и трансляции адресов (nat).

Несмотря на такое множество модулей система не настолько тупа. чтобы заставлять тебя неразумного все это загружать вручную. Хочу тебя обрадовать - большинство из этих модулей загружаются автоматически при обработке заданных тобой правил.

Собранный модуль включается из командной строки insmod имя_модуля. Естесственно, что ты должен предварительно находиться в этом каталоге. Другой способ -- команда: modprobe имя_модуля. Она поумнее и загрузит этот модуль и модули зависящие от данного. Посмотреть наличие модуля в памяти можно командой: lsmod. А удалить модуль можно командой rmmod имя_модуля Вот пример как это выглядит:

[root@localhost root]# lsmod | grep ip_tables
[root@localhost root]# modprobe ip_tables
[root@localhost root]# lsmod | grep ip_tables
ip_tables              10880   0  (unused)
[root@localhost root]# rmmod ip_tables
[root@localhost root]# lsmod | grep ip_tables
[root@localhost root]#

Первая строка -- команда lsmod с фильтром grep ip_tables -- показывает, что такого модуля у нас нет. Второй запуск, после выполнения modprobe, нам показывает, что модуль сидит в памяти и никем не используется. После удаления модуля командой rmmod мы опять видим чистоту и порядок.

Работа над собой.

А вот тебе материал для самостоятельной работы.
  1. Kernel-HOWTO
  2. Linux 2.4 Packet-filtering-HOWTO
  3. Ipchains-HOWTO (http://www.linux.org.ru:8100/books/HOWTO/index.html)
  4. Iptables-HOWTO (http://www.linuxguruz.org/iptables/howto/iptables-HOWTO.html)
  5. Firewall-HOWTO (http://linuxdocs.org/HOWTOs/Firewall-HOWTO.html)
  6. Netfilter-hacking-HOWTO (http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO.html)
  7. Iptables-tutorial (http://gazette.linux.ru.net/rus/articles/iptables-tutorial.html)
Ну вот ты и в курсе, что сидит внутри ядра Linux и как с этим бороться. Успехов и хорошего хака.