Брандмауэры: фильтрация IP-пакетов
TCP-обертки можно использовать для того, чтобы разрешить доступ к определенным сервисам на машине определенной группе хостов, но часто желательно организовать более тонкий контроль над пакетами, поступающими в данную систему (или посылаемыми из нее). Нужно также учесть, что TCP-обертки действуют только в отношении сервисов, настроенных на работу с inetd или xinetd, тогда как некоторые сервисы (например, sshd в некоторых системах) являются «автономными» и обладают собственными функциями управления доступом.
Есть и другие сервисы, в которых не реализовано никакого контроля доступа, поэтому необходим другой уровень защиты, если мы хотим управлять соединениями с этими сервисами. В настоящее время для пользователей Интернета стало обычным делом защищать себя от сетевых атак с помощью технологии, называемой 1Р-фильтрацией. При IP-фильтрации ядро изучает каждый передаваемый или принимаемый пакет и, прежде чем пропустить его, решает, разрешить ли его прохождение, отбросить или каким-то образом модифицировать.
IP-фильтрацию часто называют брандмауэром (firewalling), поскольку путем тщательной фильтрации пакетов, приходящих в систему или покидающих ее, создается некая «стена» между машиной и остальной частью Интернета. IP-фильтрация не защитит вас от вирусов или троянских коней, как и от дефектов в программах, но она создает защиту против многих видов сетевых атак, например некоторых видов DoS-атак и фальсификации IP-адресов (таких как «спуфинг» - пометка пакетов как пришедших не от той системы, которая их в действительности отправила).
IP-фильтрация также предоставляет дополнительный уровень контроля, предотвращающий доступ нежелательных пользователей к системе. Чтобы заставить систему IP-фильтрации действовать, нужно знать, каким пакетам разрешать прохождение, а какие отвергать. Обычно решение о фильтрации пакета принимается на основании его заголовка, в котором содержатся такие данные, как IP-адреса отправителя и получателя, тип протокола (TCP, UDP и т. д.) и номера портов отправителя и получателя (указывающие конкретный сервис, для которого предназначен пакет). Различные сетевые сервисы используют различные протоколы и номера портов.
Например, большинство веб-серверов принимают запросы TCP на порт 80. Если мы хотим отфильтровать весь входящий трафик HTTP от нашей системы, нужно организовать IP-фильтр, который отклоняет все пакеты TCP, адресованные порту 80. Для решения некоторых задач фильтрации недостаточно изучить только заголовок пакета, а требуется проанализировать фактические данные, которые несет пакет. Эту технологию иногда называют проверкой пакетов с учетом состояния протокола (statef ul inspection), поскольку пакет рассматривается не изолированно, а в контексте текущего сетевого соединения.
Пусть, например, нужно разрешить пользователям нашей локальной сети работать с FTP-серверами, находящимися за ее пределами. FTP - сложный протокол, который использует одно соединение TCP для отправки серверу команд, а другое - для передачи фактических данных. К сожалению, в спецификации FTP не определен конкретный номер порта для передачи данных, поэтому клиент и сервер должны договориться о номерах портов с помощью ряда команд. Если не пользоваться технологией statef ul inspection, то для осуществления передачи данных по FTP потребуется разрешить подключения TCP к произвольным портам. Statef ul inspection решает эту проблему путем анализа переговоров между клиентом и сервером относительно номеров портов и разрешения прохождения пакетов TCP через выбранный ими порт. IP-фильтры реализованы в ядре Linux, в котором есть программный код, проверяющий каждый принимаемый и передаваемый пакет и применяющий правила фильтрации, которые решают судьбу этого пакета.
Правила настраиваются с помощью утилиты, которая в командной строке принимает от пользователя аргументы и преобразовывает их в спецификации фильтра, сохраняемые ядром и используемые им в качестве правил. Включенная в ядро Linux IP-фильтрация прошла в своем развитии три поколения, у каждого из которых свой механизм настройки. Первое поколение носило название ipfw (от «IP firewall») и обеспечивало основные возможности фильтрации, но было недостаточно гибким и эффективным в сложных конфигурациях. Сейчас ipfw используется редко.
Второе поколение IP-фильтров, под названием IP-цепочек (IP chains), было значительно эффективнее ipfw и до сих пор широко используется. Последнее поколение фильтров называется netfilter/iptables. net-filter - это компонент ядра, a iptables - утилита настройки, выполняемая в пространстве пользователя. Оба названия часто используют взаимозаменяемым образом, net filter не только обладает большей гибкостью в настройке, но и допускает расширение. В следующих разделах мы опишем netfilter и приведем примеры некоторых простых конфигураций.