Колонка редактора
Как это работает
Профессионал
Новости
Вопросы и ответы
Литература


Начальная страница
E-mail


Кто не спрятался, я не виноват!

Фильтрация пакетов, firewall и маскарадинг в Линуксе




ipchains: команды, параметры, флаги

Команды операций с правилами в цепочке:
  1. добавить новое правило к цепочке ('-A', add)
  2. вставить новое правило в определенную позицию цепочки ('-I', insert)
  3. заменить правило в определенной позиции цепочки ('-R', replace)
  4. удалить правило в определенной позиции цепочки ('-D', delete)
  5. удалить первое правило в цепочке, удовлетворяющее условию ('-D', delete)
Условия проверки пакетов, которые можно задавать в правилах:
  1. адрес отправителя ('-s', source)
  2. адрес получателя ('-d', destination)
  3. инверсия условия ('!', not)
  4. протокол ('-p', protocol)
  5. номера портов для протоколов TCP и UDP
  6. тип (type) и код (code) для протокола ICMP
  7. интерфейс ('-i', interface)
  8. флаг - только TCP SYN-пакеты ('-y')
  9. флаг - только фрагменты пакетов ('-f', fragment)
Действия с пакетами, которые можно задавать в правилах:
  1. основное действие ('-j', jump to)
  2. регистрация пакета в журнале ('-l', log)
  3. изменение Типа Обслуживания ('-t', TOS)
Команды операций с целыми цепочками:
  1. создать новую цепочку ('-N', new)
  2. удалить пустую цепочку ('-X')
  3. удалить все правила из цепочки ('-F', flush)
  4. распечатать правила цепочки ('-L', list)
  5. обнулить счетчики байт и пакетов для всех правил в цепочке ('-Z', zero)
  6. изменить политику для встроенной цепочки ('-P', policy)
Команды маскарадинга:
  1. вывести текущие параметры маскарадинга ('-M -L', masquerade list)
  2. установить значения таймаутов для маскарадинга ('-M -S', masquerade set)
Ручная проверка работы фильтра
Изменение нескольких правил одной командой:



А теперь подробно обо всех командах, параметрах и флагах:

Команды операций с правилами в цепочках

Добавление нового правила к цепочке производится командой '-A' (add), за которой следует имя цепочки и все другие необходимые параметры и флаги, например:

ipchains -A input -s 127.0.0.1 -p icmp -j DENY
будет уничтожать ICMP-пакеты с адреса 127.0.0.1 при проверке по входной цепочке. Правила, добавляемые командой -A, приписываются в конец цепочки.

Новое правило можно вставить в определенную позицию цепочки командой '-I' (insert), после которой должен быть указано имя цепочки и номер, а также другие необходимые параметры. Остальные правила в цепочке (если они есть) будут сдвинуты на следующие позиции. Первое правило в цепочке имеет номер 1. Например:

ipchains -I forward 1 -p tcp -d 0/0 www -j DENY
запрещает пересылку tcp-пакетов на www-порт.

Заменить правило в определенной позиции цепочки можно командой '-R' (replace), после которой должен быть указано имя цепочки и номер, а также другие необходимые параметры. Синтаксис полностью совпадает с командой '-I'.

Удалить правило в определенной позиции цепочки можно командой '-D' (delete), например:

ipchains -D forward 1
Остальные правила в цепочке (если они есть) сдвигаются на 1 позицию.

Если вы не знаете номера правила в цепочке и не хотите его определять, то можно применить команду удаления по условию. Для этого после команды -D и названия цепочки надо указать абсолютно тот же набор параметров, который использовался при создании правила командами '-A', '-I' или '-R', например:

ipchains -D input -s 127.0.0.1 -p icmp -j DENY
Однако, если в цепочке было несколько одинаковых правил, будет удалено только первое из них.


Условия проверки пакетов, которые можно задавать в правилах:

Адреса отправителя и получателя могут быть заданы, соответственно, после параметров '-s' и '-d', в следующих формах:

  • в виде символического адреса (localhost, www.kernel.org и т.п.)
  • в виде IP-адреса (127.0.0.1)
  • в виде IP-адреса с маской в виде четырех десятичных чисел (1.2.3.0/255.255.255.0 - означает все адреса от 1.2.3.0 до 1.2.3.255)
  • в виде IP-адреса с битовой маской (1.2.3.0/24 эквивалентно 1.2.3.4/255.255.255.0, а 1.2.3.4/32 эквивалентно 1.2.3.4/255.255.255.255). Если маска после адреса не указана, то подразумевается /32, то есть правило распространяется только на сам указанный адрес. Чтобы указать любой адрес, можно использовать маску 0, сам адрес при этом может быть любым, хотя обычно тоже используется 0:
    ipchains -A input -s 0/0 -j DENY
    Однако, это используется крайне редко, потому что тот же эффект будет достигнут, если в правиле вовсе не указывать адрес. Практически единственный случай, когда применяется адрес 0/0 - это когда надо указать номер порта или тип и код ICMP-пакетов, поскольку их невозможно указать без адреса.

Инверсия условия: многие условия (в частности, -s и -d) допускают инвертирование путем указания '!' перед параметром. Например, чтобы указать все пакеты, кроме пришедших с localhost, надо использовать параметр

'-s ! localhost'

Протокол ('-p') может указываться в виде названия (большими или маленькими буквами) - TCP, UDP, ICMP, или в виде номера (см. /etc/protocols). К протоколам также может применяться инверсия:

'-p ! TCP'
означает любой протокол, кроме TCP.

Для протоколов TCP и UDP в параметрах '-s' и '-d' после адреса могут указываться номера портов. Порты могут указываться в виде символического имени, например, www (см. /etc/services), в виде десятичного номера (например, 80) и в виде диапазона (80:82 включает порты 80, 81, 82). Если в диапазоне пропущена нижняя граница, то подразумевается 0 (например, :19 означает все порты с 0 по 19 включительно), если верхняя, то подразумевается 65535. Если порт не указан вовсе, то подразумеваются все. К портам также может применяться инверсия:

'-p TCP -d 0.0.0.0/0 ! www'
означает все пакеты протокола TCP, кроме адресованных на 80 порт.

Внимание! Условие

'-p TCP -d ! 192.168.1.1 www'
сильно отличается от
'-p TCP -d 192.168.1.1 ! www'
Первое означает любой TCP-пакет на www-порт любой машины, кроме как на 192.168.1.1. Второе означает любой TCP-пакет на любой порт машины 192.168.1.1, кроме порта www.
А запись
'-p TCP -d ! 192.168.1.1 ! www'
означает любой TCP-пакет, кроме адресованных на любой порт машины 192.168.1.1 и кроме адресованных на www-порт любой машины.

Для протокола ICMP могут указываться тип (type) и код (code) ICMP-пакетов. Тип может указываться после адреса в параметре '-s', а код - в параметре '-d'. Они могут указываться в виде чисел, а тип - и в виде символического имени. Чтобы получить список символических имен типов, наберите команду

ipchains -h icmp
Вот небольшая таблица наиболее распространенных типов ICMP-пакетов:
Номер типа: Название:               Кем используется:
0           echo-reply              ping
3           destination-unreachable любой TCP/UDP-трафик
5           redirect                маршрутизация в отсутствие демона маршрутизации
8           echo-request            ping
11          time-exceeded           traceroute
В текущей версии ipchains имена типов не могут инвертироваться с помощью '!'.

Внимание! Ни в коем случае не запрещайте передачу ICMP-пакетов типа 3! Это может сильно замедлить или вообще заблокировать передачу данных.

Интерфейсом называется физическое или логическое устройство, через которое могут приниматься или передаваться пакеты. Чтобы узнать, какие интерфейсы присутствуют в вашей машине и активны (up), воспользуйтесь командой ifconfig. Параметр '-i' позволяет задать проверку интерфейса в правиле.

Интерфейсом для входящих пакетов (т.е. проверяемых по входной цепочке) является тот интерфейс, через который они получены. Интерфейсом для выходящих пакетов (т.е. проверяемых по выходной цепочке) считается тот, через который они будут отправлены. Интерфейсом для транзитных пакетов (т.е. проверяемых по пересылочной цепочке) также считается тот, через который они будут отправлены дальше, хотя такое решение несколько произвольно.. При проверке по пользовательской цепочке интерфейс определяется в зависимости от того, из какой встроенной цепочки она была вызвана.

Вполне допустимо при задании правил указывать неактивный (down) или вообще отсутствующий в данный момент интерфейс. Такое правило просто не будет соответствовать ни одному пакету, пока интерфейс не активизируется.

Можно указать сразу некоторую группу интерфейсов, написав '+' после имени. Так, '-i ppp+' означает все интерфейсы, имена которых начинаются с 'ppp' (в том числе, и не существующие на момент задания правила).

К интерфейсам также применима инверсия: '-i ! eth0' означает все интерфейсы, кроме eth0.

Иногда бывает полезно разрешить создание TCP-соединений только в одну сторону (например, из локальной сети в остальной интернет, но не наоборот). Фильтрация пакетов только по адресам здесь не поможет, потому что TCP-соединение требует передачи пакетов в обе стороны. Решение состоит в том, чтобы уничтожать пакеты с запросом на установку соединения, идущие в нежелательную сторону.

Пакеты с запросом на установку TCP-соединения отличаются тем, что у них установлен флаг SYN, а флаги FIN и ACK сброшены, и по традиции называются SYN-пакетами. Проверка этого условия включается флагом '-y'. Он допустим только в правилах с указанным протоколом TCP, например:

-p TCP -s 192.168.1.1 -y
означает пакеты на установку соединения, отправленные с машины 192.168.1.1. В документации написано, что флаг -y может инвертироваться с помощью '!' для указания всех пакетов, кроме SYN, но я не представляю себе, как это пишется. Сами проверяйте.

Иногда случается так, что пакет превышает максимально возможный размер для передачи по некоторому каналу (MTU - maximum transfer unit). В этом случае он разбивается на несколько пакетов (фрагментов), которые посылаются по отдельности. Это называется фрагментацией (fragmentation). На принимающей стороне фрагменты собираются обратно (дефрагментация - defragmentation).

Проблема состоит в том, что некоторые данные, необходимые для проверки условий фильтрации, содержатся только в первом фрагменте (в частности, порт отправителя, порт получателя, тип ICMP, код ICMP, TCP флаг SYN). Если ваша машина является единственным шлюзом, соединяющим локальную сеть с остальным интернетом, вы можете указать ей дефрагментировать все проходящие через нее пакеты (надо собрать ядро с параметром CONFIG_IP_ALWAYS_DEFRAG).

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

'-p TCP -s 192.168.1.1 www'
не сработает на втором и последующих фрагментах пакета. Но также не сработает и обратное условие:
'-p TCP -s 192.168.1.1 ! www'
поскольку во втором и последующих фрагментах вообще нет информации о номере порта.

Вы можете указывать правила для второго и последующих фрагментов с помощью флага '-f'. Очевидно, его нельзя применять вместе с номерами портов TCP/UDP, типом и кодом ICMP, и TCP SYN флагом, поскольку эта информация во втором и последующих фрагментах отсутствует. Можно также указать, что правило не применяется ко второму и последующим фрагментам, указав '!' перед '-f'.

Раньше считалось безопасным пропускать второй и последующие фрагменты любых пакетов, поскольку первый фрагмент при необходимости будет уничтожен, и на машине-получателе весь пакет все равно собран не будет. Однако сейчас известны способы вызвать неработоспособность компьютеров просто путем посылки фрагментов. Имейте это в виду.

Некорректно сформированные пакеты (TCP, UDP, ICMP до того короткие, что из них нельзя извлечь информацию о номерах портов или коде и типе ICMP) также считаются фрагментами и обрабатываются по правилам для фрагментов.

Следующий пример уничтожает фрагменты, адресованные на 192.168.1.1:

ipchains -A input -f -d 192.168.1.1 -j DENY



Действия с пакетами, которые можно задавать в правилах:

Основное действие с пакетом, если он соответствует условию правила, задается с помощью параметра '-j' (jump to).

Существует шесть специальных действий:

  1. ACCEPT: принять пакет
  2. DENY: уничтожить
  3. REJECT: отвергнуть, т.е. уничтожить и послать квитанцию отправителю в виде ICMP-пакета, если, конечно, отвергаемый пакет сам не был ICMP.
  4. MASQ: замаскарадить пакет - допустимо только в пересылочной цепочке и только если ядро было скомпилировано с поддержкой маскарадинга
  5. REDIRECT: переадресовать пакет на определенный порт локальной машины, независимо от того, куда он был отправлен (прозрачное проксирование). Допустимо только во входной цепочке. Номер порта указывается после ключевого слова REDIRECT.
  6. RETURN: вызывает прекращение дальнейших проверок в цепочке и применение к пакету политики цепочки.
Любое другое действие означает переход к цепочке, определенной пользователем. Пакет начинает проверяться по правилам в указанной цепочке. Если ни одно из них не сработало, то продолжается проверка по правилам в текущей цепочке.

Если действие правила не указано, то даже при соответствии пакета его условиям продолжается проверка следующих правил в цепочке. Такие правила называются учетными (accounting) и используются для учета трафика. Например, чтобы считать трафик от 192.168.1.1, можно использовать правило:

ipchains -A input -s 192.168.1.1
и проверять трафик командой
ipchains -L -v

Флагом '-l' (log) можно указать, что пакет следует записать в системный журнал. Обычно это применяется для регистрации возможных атак или при отладке сетевых настроек. Не злоупотребляйте регистрацией в системном журнале, а то он начнет быстро распухать..

Изменение Типа Обслуживания (TOS, Type Of Service) задается параметром '-t'. В заголовке IP-пакета есть 4 специальных редко используемых битовых флага, которые могут влиять (а могут и не..) на обслуживание пакета некоторыми маршрутизаторами:

  • Minimum Delay - минимальная задержка
  • Maximum Troughput - максимальная пропускная способность
  • Maximum Reliability - максимальная надежность
  • Minimum Cost - минимальная цена
Может быть установлен только один из этих флагов. Наиболее часто они применяются так: для telnet'а и управляющего соединения ftp устанавливается флаг Minimum Delay, а для данных ftp - Maximum Throughput. Это делается следующими командами:
ipchains -A output -p tcp -d 0.0.0.0/0 telnet -t 0x01 0x10
ipchains -A output -p tcp -d 0.0.0.0/0 ftp -t 0x01 0x10
ipchains -A output -p tcp -s 0.0.0.0/0 ftp-data -t 0x01 0x08
Флаг '-t' имеет 2 шестнадцатиричных параметра, которые применяются так:
новыйTOS = (старыйTOS AND первый параметр) XOR второй параметр
Для простоты приводится таблица со значениями параметров:
Название Типа Обслуживания:  Значения параметров: Типичное применение
Minimum Delay                0x01 0x10            ftp, telnet
Maximum Throughput           0x01 0x08            ftp-data
Maximum Reliability          0x01 0x04            snmp
Minimum Cost                 0x01 0x02            nntp



Команды операций с целыми цепочками

Вы можете создавать свои цепочки правил. Называть цепочки можно любыми именами, кроме имен встроенных цепочек и стандартных действий (т.е. input, output, forward, ACCEPT, DENY, REJECT, MASQ, REDIRECT, RETURN). Не рекомендуется использовать в именах большие буквы, поскольку они могут быть задействованы в следующих версиях ipchains. Имя цепочки может содержать до 8 символов.

Создание новой цепочки производится командой '-N' (new), например:

ipchains -N test

Удаление цепочки производится командой '-X', например:

ipchains -X test
Почему '-X'? А потому, что все хорошие буквы уже задействованы. Существует ограничение: цепочку можно удалить только если она пустая (т.е. в ней нет ни одного правила), и если на нее не ссылаются никакие правила из других цепочек.

Очистка (flushing) цепочки (т.е. удаление из нее всех правил) производится командой '-F' (flush), например:

ipchains -F forward
Если имя цепочки не указано, то будут очищены все цепочки.

Просмотр одной цепочки или всех сразу производится командой '-L' (list), например:

ipchains -L input
Если имя цепочки не указано, то будут показаны все цепочки. В выводимой информации значение refcnt означает, сколько правил ссылаются на данную цепочку в своих действиях. Чтобы цепочку можно было удалить, ее refcnt должен быть равен 0. Вместе с командой '-L' можно указывать следующие флаги:
  • '-n' (numeric) - не преобразовывать IP-адреса в символические
  • '-v' (verbose) - показывать дополнительную информацию по правилам, в т.ч. счетчики байт и пакетов, маски Типов Обслуживания, маркировку пакетов. Если -v не указан, то эта информация не выводится.
  • '-x' (expand numbers) - обычно счетчики пакетов и байт выводятся с использованием суффиксов 'K', 'M' и 'G' (обозначающих, соответственно, 1000, 1 000 000 и 1 000 000 000). Флаг -x позволяет просмотреть точные значения счетчиков, как бы велики они ни были.

Сброс (обнуление) счетчиков производится командой '-Z' (zero), например:

ipchains -Z input
Если имя цепочки не указано, то обнуляются счетчики всех цепочек. Иногда требуется узнать состояние счетчиков непосредственно перед обнулением. Применение последовательно команд 'ipchains -L -v' и 'ipchains -Z' не подходит, поскольку в промежутке между их выполнением счетчики могут изменить свое значение. В таком случае можно указать обе команды в одном вызове:
ipchains -L -v -Z
но при этом нельзя задать конкретную цепочку - статистика будет выведена и затем сброшена для всех цепочек сразу.

Задание политики для цепочки производится командой '-P' (policy). Если пакет не удовлетворяет ни одному условию в цепочке, то к нему применяется политика цепочки. Политика может задаваться только для встроенных цепочек (input, output, forward). Политика может быть: ACCEPT, DENY, REJECT а для пересылочной цепочки еще и MASQ. Задание политики MASQ для пересылочной цепочки не рекомендуется по соображениям безопасности: злоумышленник может настроить маршрутизацию своих пакетов на ваш шлюз, и его пакеты, не соответствующие явно никаким правилам в пересылочной цепочке, будут по умолчанию маскарадиться. В результате он сможет работать в интернете с IP-адреса вашего шлюза, скрывая свой реальный адрес.

Хинт: использование действия RETURN в правилах цепочки позволяет применить к подходящему пакету текущую политику цепочки вместо конкретного действия.



Операции с маскарадингом:

Для работы с маскарадингом используется команда '-M' (masquerade), которая может сочетаться с '-L' (list) для просмотра текущих установок маскарадинга, и с '-S' (set) для установки параметров.

'-L' может использоваться со своими флагами '-n', '-v', '-x'.

После '-S' должны следовать три параметра, задающие таймауты в секундах, соответственно, для TCP-сеансов, для TCP-сеансов после FIN-пакета, и для UDP-пакетов. Если вы не хотите менять значение какого-то параметра, укажите для него значение 0. Наиболее часто приходится менять первый из этих параметров для нормальной работы FTP.



Ручная проверка работы фильтра пакетов

Если вы хотите проверить, как будет работать фильтр на некотором пакете, используйте команду '-C' (check). Параметры этого фиктивного пакета задаются точно так же, как и в правилах: '-p' для протокола, '-s' для адреса отправителя, '-d' для адреса получателя, '-i' для интерфейса. Если используется протокол TCP или UDP, то в адресах отправителя и получателя должен быть указан порт, а для ICMP - код и тип ICMP, кроме случая, когда проверяется не первый фрагмент пакета ('-f') - там этой информации быть не должно. Для протокола TCP и в отсутствие флага '-f' (т.е. проверяемый пакет не является фрагментом) можно указать флаг -y для имитации SYN-пакета. Пример: проверяем по входной цепочке TCP SYN-пакет от 192.168.1.1 порт 60000 на 192.168.1.2 порт www, пришедший через интерфейс eth0, (типичный запрос на установку www-соединения):

ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www
В ответ на эту команду ipchains сообщит судьбу пакета, например 'Packet accepted'.


Изменение нескольких правил одной командой

Иногда одна команда может воздействовать сразу на несколько правил. Это может происходить по двум причинам.

Во-первых, если вы указываете символический адрес машины, а его разрешение через DNS дает несколько различных IP-адресов, то ipchains будет действовать так, как если бы вы ввели несколько команд со всеми возможными сочетаниями IP-адресов. Например, если www.foo.com разрешается в 3 адреса, а www.bar.com - в 2 адреса, и вы ввели команду

ipchains -A input -j reject -S www.bar.com -d www.foo.com
то ко входной цепочке добавится 6 правил.

Во-вторых, ipchains может выполнить несколько действий, если вы указали флаг '-b' (bidirectional). При этом ipchains будет действовать так, как если бы вы ввели команду дважды, во втором случае поменяв местами параметры '-s' и '-d'. Например, чтобы запретить пересылку пакетов от и к 192.168.1.1, можно воспользоваться командой:

ipchains -b -A forward -j REJECT -s 192.168.1.1
Флаг '-b' может применяться в командах '-A', '-C', '-I', '-D' (кроме удаления по номеру правила).

Еще один полезный флаг - '-v' (verbose), который позволяет точно узнать, что сделала ваша команда. Он особенно полезен, если ваша команда может воздействовать сразу на несколько правил. Например, можно проверить, как работает пересылка фрагментов сразу в обе стороны между 192.168.1.1 и 192.168.1.2:

ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo
.

<< Страница 2 Страница 4 >>