Библиотека сайта 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 мы опять видим чистоту и порядок.
Работа над собой.
- Kernel-HOWTO
- Linux 2.4 Packet-filtering-HOWTO
- Ipchains-HOWTO (http://www.linux.org.ru:8100/books/HOWTO/index.html)
- Iptables-HOWTO (http://www.linuxguruz.org/iptables/howto/iptables-HOWTO.html)
- Firewall-HOWTO (http://linuxdocs.org/HOWTOs/Firewall-HOWTO.html)
- Netfilter-hacking-HOWTO (http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO.html)
- Iptables-tutorial (http://gazette.linux.ru.net/rus/articles/iptables-tutorial.html)