Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum
Беспроводные выключатели nooLite

Lines Club

Ищем достойных соперников.


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

Библиотека сайта или "Мой Linux Documentation Project"

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

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

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

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

Что к чему.

Ты уже в курсе, что для того чтобы ты смог защитить свою долбанную систему или сеть от нашествия всяких гнусных парней нужно поставить 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 и как с этим бороться. Успехов и хорошего хака.

Эта статья еще не оценивалась
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии отсутствуют