Безопасность в Linux. Фильтрация пакетов 3
Безопасность в Linux. Фильтрация пакетов Продолжение. Начало в КГ №№ 2–4
Сегодня мы поговорим о спецификации целей. Зная, какие соответствия мы можем поставить пакету, мы бы хотели иметь путь, который бы указывал ядру, что делать с пакетом, совпадающим с нашими условиями. Такой путь называется целью правила. Есть два очень простых встроенных правила: DROP и ACCEPT. Мы уже встречались с ними. Если правило совпадает с пакетом и цель правила соответствует одной из этих двух целей, то больше никакие правила не просматриваются: судьба пакета уже решена. Есть два типа целей, отличающихся от встроенных, — расширения и пользовательские цепочки.
Пользовательские цепочки. Одна из мощных возможностей iptables, наследованная от ipchains — это возможность создавать пользовательские цепочки, в дополнение к встроенным (INPUT, FORWARD и OUTPUT). По общему согласию, пользовательские цепочки всегда создаются в малом регистре, чтобы их можно было легче различать.
Когда пакет совпадает с правилом, цель которого пользовательская цепочка, он пренаправляется на правила, определенные в этой пользовательской цепочке. Если пользовательская цепочка не разрешила дальнейшую судьбу пакета, то по завершении этой цепочки пакет возвращается на следующее правило в текущей цепочке. Представьте две простые цепочки (см. рис.): INPUT (встроенная цепочка) и test (пользовательская цепочка).
Представьте TCP пакет, приходящий с 192.168.1.1 и идущий к 1.2.3.4. Он попадает в INPUT цепочку и проходит проверку в Правиле1 — не совпадает. Правило2 совпадает, и его цель — test, поэтому следующее правило, которое сработает, — это Правило1 в test цепочке. Это правило в test совпадает, но не имеет цели, поэтому пакет перемещается к следующему правилу — Правилу2. Оно не совпадает; итак, мы достигли конца цепочки. Мы возвращаемся в цепочку INPUT, где мы только что закончили обработку Правила2, так что теперь мы переходим к Правилу3, которое также не совпадает. Пользовательские цепочки могут иметь в качестве цели другие пользовательские цепочки. Но никогда не создавайте замкнутых циклов: ваши пакеты будут сброшены, если фильтр определит, что они зациклены. Расширения iptables: новые цели. Другой тип цели — это расширение цели. Расширение цели состоит из модуля ядра и необязательного расширения в iptables для обеспечения новых ключей командной строки. Есть несколько устанавливаемых по умолчанию в пакете netfilter расширений: LOG, REJECT.
LOG. Этот модуль обеспечивает ведения лога для совпавших с правилом пакетов. Он имеет дополнительные ключи:
--log-level [x]. Этот ключ указывает уровень ведения логов. Вместо x подставляется имя уровня (это "debug", "info", "notice", "warning", "err", "crit", "alert" and "emerg") или соответствующие числа от "7" до "0". Вы можете ознакомиться с информацией по данным уровням в manual для syslog.conf.
--log-prefix [строка длиной до 29 символов]. Эта строка будет помещена в начало сообщения, записанного в лог-файл, для идентификации события. Этот модуль наиболее полезен в совокупности с расширением limit — так вы не позволите переполнить ваши лог-файлы.
REJECT. Этот модуль создает тот же эффект, что и цель "DROP", с одним исключением — отправителю пакета посылается ICMP пакет с сообщением об ошибке "port unreachable". Заметьте, что ICMP сообщение не будет послано, если (смотрите RFC 1122):
— Пакет был отфильтрован как ICMP пакет с сообщением об ошибке или как ICMP пакет неизвестного типа.
— Пакет был отфильтрован как фрагмент какого-либо пакета (не первый фрагмент).
— Если мы уже посылали слишком много ICMP пакетов с сообщением об ошибке отправителю.
REJECT имеет необязательный аргумент '--reject-with', который изменяет ответный пакет.
Ведя речь о целях, стоит также рассказать о специальных встроенных целях. Есть две специальные встроенные цели: RETURN и QUEUE. RETURN создает тот же эффект, как при достижении конца цепочки: для правила, находящегося во встроенной цепочке, начинает действовать policy данной цепочки. Для правила, находящегося в пользовательской цепочке, пакет продолжает свою проверку в предыдущей цепочке со следующего сработавшего правила. QUEUE — это специальная цель, которая ставит пакет в очередь на обработку пользовательскому процессу. Для того чтобы эта цель была полезна, необходимы еще два компонента:
— "queue handler" — обработчик очереди, который выполняет работу по передаче пакетов между ядром и пользовательским приложением;
— пользовательское приложение, которое будет получать, возможно обрабатывать и решать судьбу пакетов.
Стандартный обработчик очереди для IPv4 — это модуль ip-queue, который распространяется с ядром и помечен как экспериментальный. Ниже дан пример (последовательность команд), как можно использовать iptables для передачи пакетов в пользовательское приложение: modprobe iptable_filter
modprobe ip_queue
iptables -A OUTPUT -p icmp -j QUEUE
С этим правилом созданные локально пакеты ICMP-типа (такие, что создаются, скажем, при помощи команды ping) попадают в модуль ip_queue, который затем пытается передать их в пользовательское приложение. Если ни одно из таких приложений не найдено, пакеты сбрасываются.
Чтобы написать пользовательскую программу обработки пакетов, используйте libipq API. Оно распространяется с пакетом iptables.
Статус ip_queue можно проверить с помощью команды:/proc/net/ip_queue.
Максимальную длину очереди (то есть, число пакетов, передаваемых в пользовательское приложение без подтверждения обработки) можно контролировать с помощью команды:/proc/sys/net/ipv4/ip_ queue_maxlen.
По умолчанию максимальная длина очереди равна 1024. Как только этот предел достигается, новые пакеты будут сбрасываться, пока очередь не снизится ниже данного предела. Хорошие протоколы, такие как TCP, интерпретируют сброшенные пакеты как перегруженность канала передачи и успешно с этим справляются.
Однако, может потребоваться некоторого рода эксперемент, чтобы определить оптимальную длину очереди в каждом конкретном случае, если по умолчанию очередь слишком мала.
Очень полезное свойство iptables — это возможность группировать взаимозависимые правила в цепочки.
Вы можете называть ваши цепочки как вам удобнее, но рекомендуется использовать буквы малого регистра, чтобы избежать путаницы со встроенными цепочками и целями. Имена цепочек могут быть длиной до 31 символа.
Создание новой цепочки. Давайте создадим новую цепочку. Назовем ее test. Используем ключи "-N" или "--new-chain":iptables -N test.
Просто? Теперь вы можете создавать правила, как указано выше. Удаление цепочки. Удалить цепочку так же просто, как и создать ее, используем ключи "-X" или "--delete-chain".
iptables -X test
Есть пара ограничений при удалении цепочек: они должны быть пустыми (смотри очистку цепочек ниже) и они не должны использоваться как цель в любом из правил. Вы не сможете удалить ни одну из трех встроенных цепочек. Если вы не укажете имя удаляемой цепочки, то, если это возможно, все пользовательские цепочки будут удалены.
Очистка цепочек. Есть простой путь очистки всех правил из цепочки, используя ключ "-F" (или "--flush"). iptables -F FORWARD
Если вы не укажете имя цепочки, то все цепочки будут очищены. Просмотр цепочек. Вы можете просмотреть все правила в цепочке, используя ключ "-L" (или "--list"). Значение "refcnt" (счетчик) для каждой пользовательской цепочки — это число правил, ссылающихся на данную цепочку, как на цель. Он должен быть равен нулю (и цепочка должна быть пустой), прежде чем цепочку можно будет удалить. Если имя цепочки не указано, все цепочки будут показаны, даже пустые. Есть три параметра, которые могут быть использованы с ключом "-L". Это числовой параметр "-n", уберегающий iptables от преобразования IP адресов в доменные имена, что вызовет значительные задержки, если ваша DNS служба не настроена корректно или если вы отфильтровываете DNS запросы. С этим параметром TCP- и UDP-порты отображаются в цифровом виде, а не как имена сервисов, которые на них обычно запущены. Параметр "-v" выдаст детальную информацию по каждой цепочке, такую как счетчик пакетов и байт, сравнение TOS и интерфейсы. Иначе все эти значения не выдаются. Счетчики пакетов и байт печатаются с использованием суффиксов "K", "M" или "G" для зачений 1000, 1,000,000 и 1,000,000,000 соответственно. Используя параметр "-x" (расширенные числа), можно вывести полные значения, независимо от их величин.
Сброс счетчиков. Полезно иметь возможность сбрасывать счетчики. Это можно сделать с помощью ключа "-Z" (или "--zero"). Выполним следующее: iptables -L FORWARD
iptables -Z FORWARD
В вышеприведенном примере некоторые пакеты могли пройти во время интервала между выполнением первой "-L" и второй команды "-Z". По этой причине вы можете использовать эти две команды совместно, чтобы сбросить счетчики, во время просмотра.
Установка policy. Мы умолчали о том, что случится с пакетом при достижении конца встроенной цепочки, когда ранее обсуждали, как пакет проходит через цепочки. В этом случае policy данной цепочки будет определять судьбу пакета. Только встроенные цепочки имеют policy, так как если пакет достигнет конца пользовательской цепочки, то он продолжит свой путь в предыдущей цепочке. Policy может быть или ACCEPT, или DROP, например: iptables -P FORWARD DROP.
На этом мы заканчиваем рассмотрение темы фильтрации пакетов. Конечно, мы рассмотрели далеко не все аспекты данной темы, но полученных знаний с лихвой хватит для настройки безопасной работы вашего Linux в Сети.
Материал подготовлен с использованием "Linux 2.4 Packet Filtering HOWTO by Rusty Russell"
X-Stranger xstranger@tut.by
www.linux4u.narod.ru
Сегодня мы поговорим о спецификации целей. Зная, какие соответствия мы можем поставить пакету, мы бы хотели иметь путь, который бы указывал ядру, что делать с пакетом, совпадающим с нашими условиями. Такой путь называется целью правила. Есть два очень простых встроенных правила: DROP и ACCEPT. Мы уже встречались с ними. Если правило совпадает с пакетом и цель правила соответствует одной из этих двух целей, то больше никакие правила не просматриваются: судьба пакета уже решена. Есть два типа целей, отличающихся от встроенных, — расширения и пользовательские цепочки.
Пользовательские цепочки. Одна из мощных возможностей iptables, наследованная от ipchains — это возможность создавать пользовательские цепочки, в дополнение к встроенным (INPUT, FORWARD и OUTPUT). По общему согласию, пользовательские цепочки всегда создаются в малом регистре, чтобы их можно было легче различать.
Когда пакет совпадает с правилом, цель которого пользовательская цепочка, он пренаправляется на правила, определенные в этой пользовательской цепочке. Если пользовательская цепочка не разрешила дальнейшую судьбу пакета, то по завершении этой цепочки пакет возвращается на следующее правило в текущей цепочке. Представьте две простые цепочки (см. рис.): INPUT (встроенная цепочка) и test (пользовательская цепочка).
Представьте TCP пакет, приходящий с 192.168.1.1 и идущий к 1.2.3.4. Он попадает в INPUT цепочку и проходит проверку в Правиле1 — не совпадает. Правило2 совпадает, и его цель — test, поэтому следующее правило, которое сработает, — это Правило1 в test цепочке. Это правило в test совпадает, но не имеет цели, поэтому пакет перемещается к следующему правилу — Правилу2. Оно не совпадает; итак, мы достигли конца цепочки. Мы возвращаемся в цепочку INPUT, где мы только что закончили обработку Правила2, так что теперь мы переходим к Правилу3, которое также не совпадает. Пользовательские цепочки могут иметь в качестве цели другие пользовательские цепочки. Но никогда не создавайте замкнутых циклов: ваши пакеты будут сброшены, если фильтр определит, что они зациклены. Расширения iptables: новые цели. Другой тип цели — это расширение цели. Расширение цели состоит из модуля ядра и необязательного расширения в iptables для обеспечения новых ключей командной строки. Есть несколько устанавливаемых по умолчанию в пакете netfilter расширений: LOG, REJECT.
LOG. Этот модуль обеспечивает ведения лога для совпавших с правилом пакетов. Он имеет дополнительные ключи:
--log-level [x]. Этот ключ указывает уровень ведения логов. Вместо x подставляется имя уровня (это "debug", "info", "notice", "warning", "err", "crit", "alert" and "emerg") или соответствующие числа от "7" до "0". Вы можете ознакомиться с информацией по данным уровням в manual для syslog.conf.
--log-prefix [строка длиной до 29 символов]. Эта строка будет помещена в начало сообщения, записанного в лог-файл, для идентификации события. Этот модуль наиболее полезен в совокупности с расширением limit — так вы не позволите переполнить ваши лог-файлы.
REJECT. Этот модуль создает тот же эффект, что и цель "DROP", с одним исключением — отправителю пакета посылается ICMP пакет с сообщением об ошибке "port unreachable". Заметьте, что ICMP сообщение не будет послано, если (смотрите RFC 1122):
— Пакет был отфильтрован как ICMP пакет с сообщением об ошибке или как ICMP пакет неизвестного типа.
— Пакет был отфильтрован как фрагмент какого-либо пакета (не первый фрагмент).
— Если мы уже посылали слишком много ICMP пакетов с сообщением об ошибке отправителю.
REJECT имеет необязательный аргумент '--reject-with', который изменяет ответный пакет.
Ведя речь о целях, стоит также рассказать о специальных встроенных целях. Есть две специальные встроенные цели: RETURN и QUEUE. RETURN создает тот же эффект, как при достижении конца цепочки: для правила, находящегося во встроенной цепочке, начинает действовать policy данной цепочки. Для правила, находящегося в пользовательской цепочке, пакет продолжает свою проверку в предыдущей цепочке со следующего сработавшего правила. QUEUE — это специальная цель, которая ставит пакет в очередь на обработку пользовательскому процессу. Для того чтобы эта цель была полезна, необходимы еще два компонента:
— "queue handler" — обработчик очереди, который выполняет работу по передаче пакетов между ядром и пользовательским приложением;
— пользовательское приложение, которое будет получать, возможно обрабатывать и решать судьбу пакетов.
Стандартный обработчик очереди для IPv4 — это модуль ip-queue, который распространяется с ядром и помечен как экспериментальный. Ниже дан пример (последовательность команд), как можно использовать iptables для передачи пакетов в пользовательское приложение: modprobe iptable_filter
modprobe ip_queue
iptables -A OUTPUT -p icmp -j QUEUE
С этим правилом созданные локально пакеты ICMP-типа (такие, что создаются, скажем, при помощи команды ping) попадают в модуль ip_queue, который затем пытается передать их в пользовательское приложение. Если ни одно из таких приложений не найдено, пакеты сбрасываются.
Чтобы написать пользовательскую программу обработки пакетов, используйте libipq API. Оно распространяется с пакетом iptables.
Статус ip_queue можно проверить с помощью команды:/proc/net/ip_queue.
Максимальную длину очереди (то есть, число пакетов, передаваемых в пользовательское приложение без подтверждения обработки) можно контролировать с помощью команды:/proc/sys/net/ipv4/ip_ queue_maxlen.
По умолчанию максимальная длина очереди равна 1024. Как только этот предел достигается, новые пакеты будут сбрасываться, пока очередь не снизится ниже данного предела. Хорошие протоколы, такие как TCP, интерпретируют сброшенные пакеты как перегруженность канала передачи и успешно с этим справляются.
Однако, может потребоваться некоторого рода эксперемент, чтобы определить оптимальную длину очереди в каждом конкретном случае, если по умолчанию очередь слишком мала.
Очень полезное свойство iptables — это возможность группировать взаимозависимые правила в цепочки.
Вы можете называть ваши цепочки как вам удобнее, но рекомендуется использовать буквы малого регистра, чтобы избежать путаницы со встроенными цепочками и целями. Имена цепочек могут быть длиной до 31 символа.
Создание новой цепочки. Давайте создадим новую цепочку. Назовем ее test. Используем ключи "-N" или "--new-chain":iptables -N test.
Просто? Теперь вы можете создавать правила, как указано выше. Удаление цепочки. Удалить цепочку так же просто, как и создать ее, используем ключи "-X" или "--delete-chain".
iptables -X test
Есть пара ограничений при удалении цепочек: они должны быть пустыми (смотри очистку цепочек ниже) и они не должны использоваться как цель в любом из правил. Вы не сможете удалить ни одну из трех встроенных цепочек. Если вы не укажете имя удаляемой цепочки, то, если это возможно, все пользовательские цепочки будут удалены.
Очистка цепочек. Есть простой путь очистки всех правил из цепочки, используя ключ "-F" (или "--flush"). iptables -F FORWARD
Если вы не укажете имя цепочки, то все цепочки будут очищены. Просмотр цепочек. Вы можете просмотреть все правила в цепочке, используя ключ "-L" (или "--list"). Значение "refcnt" (счетчик) для каждой пользовательской цепочки — это число правил, ссылающихся на данную цепочку, как на цель. Он должен быть равен нулю (и цепочка должна быть пустой), прежде чем цепочку можно будет удалить. Если имя цепочки не указано, все цепочки будут показаны, даже пустые. Есть три параметра, которые могут быть использованы с ключом "-L". Это числовой параметр "-n", уберегающий iptables от преобразования IP адресов в доменные имена, что вызовет значительные задержки, если ваша DNS служба не настроена корректно или если вы отфильтровываете DNS запросы. С этим параметром TCP- и UDP-порты отображаются в цифровом виде, а не как имена сервисов, которые на них обычно запущены. Параметр "-v" выдаст детальную информацию по каждой цепочке, такую как счетчик пакетов и байт, сравнение TOS и интерфейсы. Иначе все эти значения не выдаются. Счетчики пакетов и байт печатаются с использованием суффиксов "K", "M" или "G" для зачений 1000, 1,000,000 и 1,000,000,000 соответственно. Используя параметр "-x" (расширенные числа), можно вывести полные значения, независимо от их величин.
Сброс счетчиков. Полезно иметь возможность сбрасывать счетчики. Это можно сделать с помощью ключа "-Z" (или "--zero"). Выполним следующее: iptables -L FORWARD
iptables -Z FORWARD
В вышеприведенном примере некоторые пакеты могли пройти во время интервала между выполнением первой "-L" и второй команды "-Z". По этой причине вы можете использовать эти две команды совместно, чтобы сбросить счетчики, во время просмотра.
Установка policy. Мы умолчали о том, что случится с пакетом при достижении конца встроенной цепочки, когда ранее обсуждали, как пакет проходит через цепочки. В этом случае policy данной цепочки будет определять судьбу пакета. Только встроенные цепочки имеют policy, так как если пакет достигнет конца пользовательской цепочки, то он продолжит свой путь в предыдущей цепочке. Policy может быть или ACCEPT, или DROP, например: iptables -P FORWARD DROP.
На этом мы заканчиваем рассмотрение темы фильтрации пакетов. Конечно, мы рассмотрели далеко не все аспекты данной темы, но полученных знаний с лихвой хватит для настройки безопасной работы вашего Linux в Сети.
Материал подготовлен с использованием "Linux 2.4 Packet Filtering HOWTO by Rusty Russell"
X-Stranger xstranger@tut.by
www.linux4u.narod.ru
Компьютерная газета. Статья была опубликована в номере 05 за 2002 год в рубрике soft :: linux