Первое поколение IP firewall для Linux появилось в ядре 1.1. Это была версия BSD ipfw firewall для Linux (автор Alan Cox). Поддержка firewall второго поколения появилась в ядрах 2.0 (авторы Jos Vos, Pauline Middelink и другие) и с этого момента стало возможным реально работать с firewall в Linux.
Команда 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-пакетов, кроме тех, которые мы позже разрешим. Это очень важный момент, так как здесь определяется судьба всех пакетов, которые не подходят какому-либо правилу.
Третье и четвертое правила определяют наши требования к пропускаемым пакетам. Третья команда позволяет нашим пакетам выходить из системы наружу, а четвертое правило позволяет приходить ответам.
Давайте расмотрим все параметры:
Определяет правило пересылки (Forwarding).
Добавляет правило со стратегией "accept", позволяющей принимать все пакеты, соответствующие этому правилу.
Правило применимо к TCP-пакетам (не трогает пакеты UDP или ICMP).
Исходящий адрес должен иметь маску подсети в 24 бита и адрес сети 172.16.1.0.
Адрес назначения должен иметь нулевые биты (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 |
Заданный по умолчанию вывод не включает одну важную деталь: он не показывает действие параметра -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 делают подключение данных с порта 20 при работе в активном режиме, что несколько упрощает нам жизнь, но, к сожалению, не все это делают.
Смотрите на наше правило для порта 20, порта FTP-данных. Правило считает, что наш пользователь подключается к серверу. Это будет работать, если мы используем пассивный режим. Но очень трудно для нас сконфигурировать удовлетворительное правило, чтобы позволить FTP активный режим, потому что мы не можем знать, какие порты будут использоваться.
Безопасней всего предписать нашим пользователям применять пассивный режим: большинство FTP-серверов и почти все FTP-клиенты его поддерживают. Еще лучше применить прокси-сервер для FTP, который принимает подключение из внутренней сети и устанавливает внешние подключения.
Команда ipfwadm имеет много параметров. В общем виде синтаксис таков:
ipfwadm category command parameters [options] |
Категории задают тип настраиваемых правил, поэтому категория в команде допустима только одна:
Правило ввода (Input)
Правило вывода (Output)
Правило пересылки (Forwarding)
Применяются только к правилам в заданной категории. Команда сообщает Firewall, какое действие следует выполнить.
Добавить правило
Вставить правило
Удалить правило
Установить заданную по умолчанию стратегию
Показать все существующие правила
Стереть все существующие правила
Стратегии представляют собой следующее:
Пропускать все пакеты для приема, передачи или транзитные (forward)
Блокировать все пакеты для приема, передачи или транзитные (forward)
Блокировать все пакеты для приема, передачи или транзитные (forward) и послать компьютеру, который послал пакет ICMP-сообщение об ошибке
Они определяют, к каким пакетам применяется правило:
TCP, UDP, ICMP или все. Например:
-P tcp
Исходный IP-адрес пакета. Если сетевая маска не задана, она принимается как “/32”. Можно дополнительно задать порты, к которым относится данное правило. Необходимо также задать протокол, используя параметр -P. Если порт или несколько портов не заданы, предполагаются все. Порты могут быть заданы именами, используя файл /etc/services. В случае протокола ICMP поле порта используется, чтобы задавать типы пакетов ICMP. Несколько портов описываются так: lowport:highport. Например:
-S 172.29.16.1/24 ftp:ftp-data
Указывает IP-адрес назначения. Во всем остальном аналогичен предыдущему параметру. Например:
-D 172.29.16.1/24 smtp
Указывает адрес сетевого интерфейса, на котором пакет получен (-I) или послан (-O). Это позволяет Вам создавать правила, которые применяются только к некоторым сетевым интерфейсам на Вашей машине. Например:
-V 172.29.16.1
Задает имя сетевого интерфейса. Этот параметр работает таким же образом, как параметр -V, но задавать нужно имя устройства вместо адреса. Например:
-W ppp0
Эти параметры иногда бывают очень полезны:
Используется для двунаправленного режима. Этот параметр соответствует трафику в любом направлении между определенным источником и адресатом. Это избавляет Вас от необходимости создавать два правила: одно для прямого подключения и одно для обратного.
Включает регистрацию соответствия пакетов через протокол ядра. Любой пакет, который соответствует этому правилу, будет регистрироваться как сообщение ядра. Это полезно, чтобы обнаружить несанкционированный доступ.
Используется, чтобы соответствовать TCP-пакетам запроса подключения. Этому правилу будут соответствовать только TCP-пакеты с установленным битом SYN и неустановленным битом ACK.
Используется, чтобы соответствовать TCP-пакетам подтверждения попытки подключения. Этому правилу будут соответствовать только TCP-пакеты с установленным битом ACK.
Каждая из команд конфигурации 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 |
Назад | Глобальное оглавление | Вперед |
Три способа фильтрации | Локальное оглавление | IP Firewall Chains (2.2 Kernels) |