IP Firewall (ядра 2.0)

Первое поколение IP firewall для Linux появилось в ядре 1.1. Это была версия BSD ipfw firewall для Linux (автор Alan Cox). Поддержка firewall второго поколения появилась в ядрах 2.0 (авторы Jos Vos, Pauline Middelink и другие) и с этого момента стало возможным реально работать с firewall в Linux.

Использование ipfwadm

Команда ipfwadm представляет собой инструмент конфигурации для второго поколения Linux IP firewall. Возможно, самый простой способ описывать использование команды ipfwadm это примеры. Начнем с примера сети.

Пример сети

Предположим, что у нас есть сеть небольшой организации, которая использует Linux-машину с firewall для связи с Internet. Мы разрешаем пользователям этой сети обращаться к web-серверам в Internet, но не позволяем какой-либо другой трафик.

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

Предположим, что наша сеть имеет 24-битную сетевую маску (класс C) и ее сетевой адрес 172.16.1.0. Правила будут такими:

# ipfwadm -F -f
# ipfwadm -F -p deny
# ipfwadm -F -a accept -P tcp -S 172.16.1.0/24 -D 0/0 80
# ipfwadm -F -a accept -P tcp -S 0/0 80 -D 172.16.1.0/24

Параметр -F инструктирует ipfwadm, что мы определяем правило пересылки пакетов (forwarding). Первая команда предписывает ipfwadm очистить все правила. Это гарантирует, что мы работаем с известным состоянием, и после добавления правил не окажется, что остались еще какие-то неизвестные нам правила.

Второе правило устанавливает нашу заданную по умолчанию стратегию пересылки. Мы сообщаем, что ядро должно отвергать пересылку всех IP-пакетов, кроме тех, которые мы позже разрешим. Это очень важный момент, так как здесь определяется судьба всех пакетов, которые не подходят какому-либо правилу.

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

Давайте расмотрим все параметры:

-F

Определяет правило пересылки (Forwarding).

-a accept

Добавляет правило со стратегией "accept", позволяющей принимать все пакеты, соответствующие этому правилу.

-P tcp

Правило применимо к TCP-пакетам (не трогает пакеты UDP или ICMP).

-S 172.16.1.0/24

Исходящий адрес должен иметь маску подсети в 24 бита и адрес сети 172.16.1.0.

-D 0/0 80

Адрес назначения должен иметь нулевые биты (0.0.0.0). Это соответствует любому адресу. Число 80 определяет порт назначения, в этом случае WWW. Вы можете также использовать любую запись из файла /etc/servicesдля определения порта, например, -D 0/0 www.

ipfwadm принимает сетевые маски в форме, с которой Вы можете быть незнакомы. Запись /nn обозначает сколько бит адреса значительны или размер маски. Биты всегда считаются слева направо. Ряд примеров перечислен в таблице 9-1.

Таблица 9-1. Распространенные значения бит сетевой маски

Сетевая маска Биты
255.0.0.0 8
255.255.0.0 16
255.255.255.0 24
255.255.255.128 25
255.255.255.192 26
255.255.255.224 27
255.255.255.240 28
255.255.255.248 29
255.255.255.252 30

ipfwadm имеет одну полезную возможность, которая упрощает создание правил. Это опция -b, которая создает двунаправленное правило. Эта опция позволяет сворачивать команды для двух правил в одну:

# ipfwadm -F -a accept -P tcp -S 172.16.1.0/24 -D 0/0 80 -b

Рассмотрим внимательно набор правил

Итак, посмотрим на наш набор правил. Видите ли вы, что в нем есть дыра, через которую все еще можно атаковать систему?

Наш набор правил позволяет проходить в нашу сеть всем пакетам с исходным портом 80. Это будет включать и пакеты с установленным битом SYN! Бит SYN объявляет TCP-пакет запросом подключения. Если человек снаружи имел привилегированный доступ к компьютеру, он может сделать подключение через наш firewall на любой из наших компьютеров, если он использует порт 80 на своей стороне. Вот и дырка...

К счастью, проблема решаема. Команда ipfwadm имеет параметр, который позволяет формировать правила, которые будут соответствовать пакетам с битом SYN. Давайте изменим наш пример, чтобы включить такое правило:

# ipfwadm -F -a deny -P tcp -S 0/0 80 -D 172.16.10.0/24 -y
# ipfwadm -F -a accept -P tcp -S 172.16.1.0/24 -D 0/0 80 -b

Опция -y заставляет правило соответствовать только, если в пакете установлен бит SYN. Так что наше новое правило предписывает отвергать любые внешние пакеты с порта 80 с установленным битом SYN.

Почему мы поместили это специальное правило перед основным правилом? IP firewall функционируют так, что используется первое соответствие. Оба правила соответствуют пакетам, которые мы хотим остановить, так что мы должны убедиться, что поместили отвергающее ( deny) правило перед пропускающим (accept).

Просмотр наших правил

После ввода правил можно попросить ipfwadm их показать в виде списка:

# ipfwadm -F -l
Эта команда внесет в список все конфигурированные правила пересылки. Вывод будет примерно таким:
# ipfwadm -F -l
IP firewall forward rules, default policy: accept
type  prot source               destination          ports
deny  tcp  anywhere             172.16.10.0/24       www -> any
acc   tcp  172.16.1.0/24        anywhere             any -> www
Команда ipfwadm будет пытаться транслировать номер порта в сервисное имя, использующее /etc/services, если там есть такая запись.

Заданный по умолчанию вывод не включает одну важную деталь: он не показывает действие параметра -y. Команда ipfwadm способна произвести более детализированный вывод, если Вы определяете параметр -e (расширенный вывод). Он включает в себя столбец opt (опции), в котором будет показан параметр -y для пакетов SYN:

# ipfwadm -F -l -e
P firewall forward rules, default policy: accept
 pkts bytes type  prot opt  tosa tosx ifname  ifaddress   source        ...
    0     0 deny  tcp  --y- 0xFF 0x00 any     any         anywhere      ...
    0     0 acc   tcp  b--- 0xFF 0x00 any     any         172.16.1.0/24 ...

Более сложный пример

Предыдущий пример был самым простым. Не все сетевые услуги так просты, как WWW. Давайте добавим сюда сервис посложнее: FTP. Мы хотим, чтобы наши внутренние сетевые пользователи были способны работать с серверами FTP в сети Internet: заходить на них, принимать и передавать файлы. Но мы не хотим, чтобы все желающие из Internet работали с нашими FTP-серверами.

FTP интересен тем, что он использует два TCP-порта: 20 (данные) и 21 (команды):

# ipfwadm -a deny -P tcp -S 0/0 20 -D 172.16.1.0/24 -y
# ipfwadm -a accept -P tcp -S 172.16.1.0/24 -D 0/0 20 -b
# ipfwadm -a deny -P tcp -S 0/0 21 -D 172.16.1.0/24 -y
# ipfwadm -a accept -P tcp -S 172.16.1.0/24 -D 0/0 21 -b
Правильно? Не совсем. FTP-сервера могут функционировать в двух различных режимах: пассивный режим и активный режим. В пассивном режиме FTP-сервер ждет подключения от пользователя. В активном режиме сервер фактически делает подключение к пользователю. Активный режим обычно задан по умолчанию.

Многие сервера FTP делают подключение данных с порта 20 при работе в активном режиме, что несколько упрощает нам жизнь, но, к сожалению, не все это делают.

Смотрите на наше правило для порта 20, порта FTP-данных. Правило считает, что наш пользователь подключается к серверу. Это будет работать, если мы используем пассивный режим. Но очень трудно для нас сконфигурировать удовлетворительное правило, чтобы позволить FTP активный режим, потому что мы не можем знать, какие порты будут использоваться.

Безопасней всего предписать нашим пользователям применять пассивный режим: большинство FTP-серверов и почти все FTP-клиенты его поддерживают. Еще лучше применить прокси-сервер для FTP, который принимает подключение из внутренней сети и устанавливает внешние подключения.

Обзор параметров ipfwadm

Команда ipfwadm имеет много параметров. В общем виде синтаксис таков:

ipfwadm category command parameters [options]

Категории (Categories)

Категории задают тип настраиваемых правил, поэтому категория в команде допустима только одна:

-I

Правило ввода (Input)

-O

Правило вывода (Output)

-F

Правило пересылки (Forwarding)

Команды

Применяются только к правилам в заданной категории. Команда сообщает Firewall, какое действие следует выполнить.

-a [policy]

Добавить правило

-i [policy]

Вставить правило

-d [policy]

Удалить правило

-p policy

Установить заданную по умолчанию стратегию

-l

Показать все существующие правила

-f

Стереть все существующие правила

Стратегии представляют собой следующее:

accept

Пропускать все пакеты для приема, передачи или транзитные (forward)

deny

Блокировать все пакеты для приема, передачи или транзитные (forward)

reject

Блокировать все пакеты для приема, передачи или транзитные (forward) и послать компьютеру, который послал пакет ICMP-сообщение об ошибке

Параметры

Они определяют, к каким пакетам применяется правило:

-P protocol

TCP, UDP, ICMP или все. Например:

-P tcp

-S address[/mask] [port]

Исходный IP-адрес пакета. Если сетевая маска не задана, она принимается как “/32”. Можно дополнительно задать порты, к которым относится данное правило. Необходимо также задать протокол, используя параметр -P. Если порт или несколько портов не заданы, предполагаются все. Порты могут быть заданы именами, используя файл /etc/services. В случае протокола ICMP поле порта используется, чтобы задавать типы пакетов ICMP. Несколько портов описываются так: lowport:highport. Например:

-S 172.29.16.1/24 ftp:ftp-data

-D address[/mask] [port]

Указывает IP-адрес назначения. Во всем остальном аналогичен предыдущему параметру. Например:

-D 172.29.16.1/24 smtp

-V address

Указывает адрес сетевого интерфейса, на котором пакет получен (-I) или послан (-O). Это позволяет Вам создавать правила, которые применяются только к некоторым сетевым интерфейсам на Вашей машине. Например:

-V 172.29.16.1

-W name

Задает имя сетевого интерфейса. Этот параметр работает таким же образом, как параметр -V, но задавать нужно имя устройства вместо адреса. Например:

-W ppp0

Необязательные параметры

Эти параметры иногда бывают очень полезны:

-b

Используется для двунаправленного режима. Этот параметр соответствует трафику в любом направлении между определенным источником и адресатом. Это избавляет Вас от необходимости создавать два правила: одно для прямого подключения и одно для обратного.

-o

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

-y

Используется, чтобы соответствовать TCP-пакетам запроса подключения. Этому правилу будут соответствовать только TCP-пакеты с установленным битом SYN и неустановленным битом ACK.

-k

Используется, чтобы соответствовать TCP-пакетам подтверждения попытки подключения. Этому правилу будут соответствовать только TCP-пакеты с установленным битом ACK.

Типы пакетов ICMP

Каждая из команд конфигурации firewall позволяет Вам определять типы пакетов ICMP. В отличие от портов TCP и UDP, не имеется никакого удобного файла конфигурации, который перечисляет типы пакетов и их значения. Типы пакетов ICMP определены в RFC-1700 (Assigned Numbers RFC). Они также перечислены в одном из стандартных библиотечных файлов C. Файл /usr/include/netinet/ip_icmp.h, который принадлежит обычной библиотеке GNU и используется C-программистами при написании сетевого программного обеспечения, работающего с протоколом ICMP, также определяет типы пакетов ICMP. Для Вашего удобства я привожу их в таблице 9-2. Интерфейс команды iptables позволяет Вам определять типы ICMP по их именам, так что я укажу и эти имена. Позже они пригодятся.

Таблица 9-2. Типы пакетов ICMP

Номер типа Обозначение iptables Описание
0 echo-reply Echo Reply
3 destination-unreachable Destination Unreachable
4 source-quench Source Quench
5 redirect Redirect
8 echo-request Echo Request
11 time-exceeded Time Exceeded
12 parameter-problem Parameter Problem
13 timestamp-request Timestamp Request
14 timestamp-reply Timestamp Reply
15 none Information Request
16 none Information Reply
17 address-mask-request Address Mask Request
18 address-mask-reply Address Mask Reply