Продолжаем тему безопасной работы с сетью в Linux. Сегодня я расскажу про фильтрацию пакетов. Что это такое, для чего нужно, как это работает — все это вы узнаете в данной заметке.
Что же такое фильтр пакетов? Фильтр пакетов — это программа, которая просматривает заголовки пакетов по мере их прихода и решает дальнейшую судьбу всего пакета. Фильтр может сбросить (DROP) пакет, т.е. как будто пакет и не приходил вовсе, принять (ACCEPT) пакет, т.е. пакет может пройти дальше, или сделать с ним что-то еще более сложное. В Linux фильтр пакетов встроен в ядро (как модуль, или как неотъемлемая часть ядра), и мы можем делать с пакетами множество хитроумных вещей, но основной принцип в просмотре заголовков пакетов и решении их дальнейшей судьбы сохраняется. Почему вы должны использовать фильтр пакетов? Ответ можно дать в виде трех аксиом: — когда вы используете linux для соединения вашей внутренней сети с другой сетью (скажем, с Интернетом), вы имеете возможность разрешать и запрещать отдельные типы трафика. Например, заголовок пакета содержит адрес назначения пакета, так что вы можете запретить пакеты, идущие в определенные участки другой сети. Другой пример: вы используете браузер для доступа к каким-либо архивам информации. А браузер постоянно загружает рекламу какой-либо баннерной сети, баннеры которой находятся на страницах этих архивов, что отнимает мое время. Запрет через фильтр пакетов на прохождение всех пакетов к серверу баннерной сети или обратно решает эту проблему. — когда ваша linux машина единственная преграда между хаосом Интернета и вашей классной и правильной сетью, было бы хорошо знать, что вы можете запретить то, что ломится к вам. Например, вы можете разрешить все, что идет из вашей сети, и позаботиться о всем известном Ping of Death, приходящего от злобных внешних пользователей. Другой пример: вы не хотите, чтобы внешние пользователи соединялись с вашей машиной по telnet протоколу, даже несмотря на то, что все аккаунты защищены паролями. Может быть, вы хотите (как и большинство людей) быть наблюдателем в Интернете, а не сервером. Просто не позвольте никому соединяться с вашим компьютером, запретив в фильтре пакетов все входящие пакеты, используемые при установке соединения. — временами плохо сконфигурированная машина в сети решает извергнуть во внешний мир какие-либо пакеты. Есть отличная возможность указать фильтру пакетов, чтобы он давал вам знать, если что-либо ненормальное случилось; возможно, вы что-то сможете сделать, или, возможно, вы просто любопытны по своей природе. Как же можно сделать фильтрование пакетов в Linux? Ядра Linux имеют способность отфильтровывать пакеты еще с версии 1.1. Первое поколение фильтров, основанное на ipfw от BSD, было спортированно Аланом Коксом в конце 1994 года. Оно было улучшено Джо Возом и другими в версии ядра 2.0; пользовательская утилита ipfwadm контролировала правила фильтра в ядре. В середине 1998, для Linux 2.2, ядро было переработано достаточно основательно, на всеобщеее обозрение была представлена новая утилита для управления фильтром — ipchains. Наконец, в середине 1999, код ядра был снова полностью преписан для версии 2.4, появилась утилита четвертого поколения "iptables". Это именно та утилита, про которую ниже пойдет речь. Вам необходимо ядро, которое имеет netfilter-инфраструктуру: netfilter — это основа внутри Linux ядра, в которую могут встраиваться другие компоненты (такие как модуль iptables). Это означает, что вам необходимо ядро 2.3.15 или выше, и вам необходимо включить (ответить 'Y') на опцию CONFIG_NETFILTER при конфигурировании ядра. Утилита iptables взаимодействует с ядром и указывает ему, какие пакеты фильтровать. Именно с помощью этой программы вы будете управлять фильтром пакетов. Iptables — это замена для ipfwadm и ipchains. Утилита iptables вставляет и удаляет правила из таблицы фильтра пакетов ядра. Это означает, что, что бы вы ни устанавливали или настраивали, это будет потеряно при перезагрузке. Что исправить для того, чтобы гарантировать, что правила восстановятся после перезагрузки машины? Для этого были написаны утилиты iptables-save и iptables-restore, которые занимаются тем, что сохраняют и восстанавливают правила фильтрации. Как пакеты проходят фильтры? Ядро запускается с тремя списками правил в таблице фильтра пакетов; эти списки называются firewall chains или просто chains (цепочки). Три цепочки называются INPUT, OUTPUT и FORWARD. Цепочки устроены примерно так (см. рис. 1). Три овала представляют три цепочки. Когда пакет приходит в определенный овал, цепочка исследуется для того, чтобы определить, что делать с пакетом в дальнейшем. Если цепь говорит, что надо сбросить (DROP) пакет, пакет разрушается; если цепь разрешает прохождение пакета (ACCEPT), пакет проходит к следующему шагу по схеме. Цепочка — это набор определенных правил. Каждое правило говорит "если заголовок пакета выглядит так, значит надо делать с пакетом то-то". Если правило не совпадает с пакетом, пакет переходит к следующему правилу в данной цепочке. Наконец, если в цепочке не осталось больше правил, ядро проверяет установленный policy (правило, действующее по умолчанию для всей цепочки) для данной цепочки, чтобы решить, что делать с пакетом дальше. В защищенных системах policy обычно говорит ядру — разрушить пакет (DROP). 1. Когда пакет приходит (скажем, через Ethernet карту), ядро сперва просматривает адрес назначения пакета — это называется "маршрутизацией". 2. Если пакет предназначен для этой машины, пакет проходит через диаграмму в цепочку INPUT. Если это так, то любой процесс, ожидающий данный пакет, получит его. 3. Иначе, если в ядре отключена возможность маршрутизации или если ядро не знает, как этот пакет маршрутизировать, пакет разрушается. Если маршрутизация разрешена и пакет предназначен для другого сетевого интерфейса (если вы имеете его), пакет идет по нашей диаграмме прямо в цепочку FORWARD; если он разрешен (ACCEPT), он будет маршрутизирован. 4. Наконец, программа, работающая на самой машине, может посылать пакеты. Такие пакеты будут проходить через цепочку OUTPUT: если цепочка разрешает (ACCEPT) их, значит пакет продолжает свой путь на интерфейс, для которого он предназначен. Применение iptables. Iptables имеет достаточно хорошо написанную и подробную manual-страницу (man iptables), там вы можете найти все интересующие вас моменты. Есть несколько различных вещей, которые вы можете сделать с помощью iptables. Вы начинаете работу с тремя встроенными цепочками INPUT, OUTPUT и FORWARD, которые вы не можете удалить. Давайте посмотрим, что мы можем делать с цепочками: 1. Создать новую цепочку (-N). 2. Удалить пустую цепочку (-X). 3. Изменить policy для встроенной цепочки (-P). 4. Просмотреть правила в цепочке (-L). 5. Очистить все правила в цепочке (-F). 6. Обнулить счетчики пакетов и байтов во всех правилах в цепочке (-Z). Есть несколько путей управления правилами внутри цепочки: 1. Добавить новое правило к цепочке (-A). 2. Вставить новое правило в цепочку (-I). 3. Заменить правило в цепочке (-R). 4. Удалить правило в цепочке (-D). 5. Удалить первое правило в цепочке, соответствующее указанному (-D).
Материал подготовлен с использованием "Linux 2.4 Packet Filtering HOWTO by Rusty Russell". |