Online Documentation Server
 ПОИСК
ods.com.ua Web
 КАТЕГОРИИ
Home
Programming
Net technology
Unixes
Security
RFC, HOWTO
Web technology
Data bases
Other docs

 


 ПОДПИСКА

 О КОПИРАЙТАХ
Вся предоставленная на этом сервере информация собрана нами из разных источников. Если Вам кажется, что публикация каких-то документов нарушает чьи-либо авторские права, сообщите нам об этом.




IPCHAINS-HOWTO-RUS 1.01

Здесь по идее должны быть замечания о лицензии и о том, что автор не несет никакой ответственности, но я это опущу за ненадобностью - кому надо ЭТО, может спокойно прочитать в оригинальном IPCHAINS-HOWTO. Данный документ представляет собой почти полный перевод оригинального текста и был сделан для публикации на linux.irk.ru Вячеславом Калошиным (multik@istu.edu)

Что такое ipchains.

Linux ipchains это замена, пришедшая на смену ipfwadm (который, в свою очередь, был списан с BSD. Для работы с ними вам необходима версия ядра выше, чем 2.1.102.

Зачем переходить на ipchains ?

В старых версиях линукса файрволл не работал с фрагментами пакетов, имел 32х битные счетчики (на intel-процессорах), не давал указывать типы протоколов, отличные от TCP,UDP и ICMP, не давал делать большие изменения автоматически, не имел инверсных правил, и был очень тяжелым для управления.

Немного информации.

Весь траффик в сети посылается в виде пакетов. В начале каждого пакета идет информация о том, откуда он идет, тип пакета и другие подобные детали. Начало пакета называется заголовком (хедером,header), остальная часть пакета обычно назвается телом (body).

Некоторые протоколы, как TCP, которые используются для web, mail и прочего, используют понятие "соединения" - перед тем, как любой пакет с данными будет послан получателю, проходят некоторые установочные пакеты (со специальными заголовками)с сообщениями типа "я хочу установить соединение", "хорошо", "спасибо,устанавливаю". И только потом пойдут нормальные пакеты с информацией.

Фильтр пакетов - это часть программного обеспечения, которое смотрит на заголовки пакетов и либо пропускает пакет дальше, либо запрещает его дальнейшее движение. Есть некоторое различие между понятиями "запрет" (deny) и "отказ" (reject). "Запрет" - это когда пакет от отправителя отвергается системой так, что отправитель думает, что пакет не дошел до получателя, а "Отказ" - это когда отправитель пакета извещается о том, что его пакет был отвергнут получателем.

Зачем вообще нужен фильтр пакетов ?

Управление

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

Безопасность

Когда линукс стоит один на один с хаосом интернета, да еще и служит мостом в интернет для машин внутренней сети, вы должны быть уверены, кто и куда ходит через мост. Например, вы желаете ходить по интернет, но не желаете, чтобы ваша машина была сервером (а вы уверены, что у вас все пользователи имеют пароли и лишние сервисы закрыты ?). С наличием файрволла эти проблемы решаются легко и быстро.

Крутость ;-)

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

Как установить фильтр пакетов ?

Вы нуждаетесь в ядре, в который вкомпилен фильтр пакетов. Посмотрите на файл /proc/net/ip_fwchains - если вы его видите, то все в порядке. Если вы его не видите, то вам необходимо взять ядро 2.1.102 или выше. Если у вас ядро серии 2.0, то вам необходима специальная заплатка. Отконфигурируйте ядро так, чтобы у него были включены опции IP firewalling. В /usr/src/linux/.config для ядер 2.1 и 2.2 должны быть включены следующие опции

CONFIG_FIREWALL=y
CONFIG_IP_FIREWALL=y

Также необходимо скачать утилиту ipchains , которая и будет управлять фильтром пакетов в ядре. Все последние дистрибутивы linux, которые основаны на ядрах 2.1 и 2.2 , уже имеют такую утилиту в наличии.

Как пакеты проходят через фильтры

Ядро стартует с 3мя списками правил, эти правила называются правилами файрволла или просто цепочками (chains). Эти три цепочки называются input (входная), output (выходная) и forward (пересылка). Когда пакет приходит (скажем, через сетевую карту), ядро использует входную цепочку для определения того, может ли пакет двигаться дальше. Если пакет проходит эту проверку, то он двигается дальше ( это еще называется роутинг). Если он предназначен другой машине, ядро смотрит на цепочку пересылки (forward). В конце, перед тем, как пакет уйдет наружу, ядро смотрит на выходную цепочку.

Цепочка - это список правил. Каждое правило выглядит так "если заголовок пакета содержит то и то, то делай с пакетом то". Если правило не подходит к заголовку пакета, ядро смотрит на следующее правило в цепочке. В конце, если пакет прошел всю цепочку правил, и ни одно правило не сработало, ядро смотрит на правила цепочки. В защищенных системах пакет обычно отвергается или запрещается.

                     ACCEPT/
                    REDIRECT                                    ACCEPT
--> C --> S --> ______ --> D --> ~~~~~~~~ --> local ------> ______ -->
    h  -> a    |input |    e    {Routing } |  __|____ -->+>|output|
    e  |  n    |Chain |    m    {Decision} | |forward|   | |Chain |
    c  |  i    |______|    a     ~~~~~~~~  | |Chain  |   | |______|
    k  |  t       |        s        |      | |_______|   |     |
    s  |  y       |        q        |      |     |       |     |
    u  |  |       v        e        v      |     |       |     v
    m  |  |     DENY/      r  Local Process|     v       |   DENY/
    |  |  v    REJECT      a        |-------   DENY/     |  REJECT
    |  |DENY               d        |         REJECT     |
    v  |                   e -------+--------------------+
   DENY|                            |
       +----------------------------+

Пошаговое описание каждой стадии

Проверка контрольной суммы (Checksum) - ядро проверяет пакет на предмет целостности и коректности заголовков. Если пакет не удовлетворяет этим условиям, он отвергается.

Назначение (Sanity) - ядро проверяет, кому предназначен пакет, зачем и куда. Множество лишних пакетов отсеиваются именно на этой стадии, но приоритет "входной" (input) цепочки выше.

Входная цепочка (input) - это первая цепочка, с помощью которой фильтр отсеивает пакеты. Если решение этой цепочки не "отвергнуть" (REJECT) или "запретить" (DENY), то пакет продолжает свое движение дальше.

Демаскарад (Demasquaerade) - если пакет - это ответ на предыдущий маскарадный пакет, он демаскарадируется, и сразу пропускатеся на выходную цепочку. Если вы не использете маскарадинг, вы можете мысленно стереть это место из рисунка.

Роутинг (routing) - поле "получатель" пакета анализируется частью кода, которая ответственна за то, куда пакет пойдет дальше - на локальную обработку или будет перенаправлен на другую машину (смотрите на цепочку "пересылка" (forward))

Локальная обработка (local) - задача, запущенная на локальной машине, может получить пакет только после того, как он пройдет роутинг, и может посылать пакеты в ответ (которые пройдут через выходную цепочку, затем через входную цепочку интерфейса "lo", если пакет предназначен для процесса на этой-же машине, или уйдет через выходную цепочку).

Если пакет не создан задачай на локальной машине, проверяется цепочка "пересылка" (forward) , в другом случае пакет идет сразу на "выходную" (output) цепочку.

Цепочка "пересылка" (forward) - эту цепочку проходят все пакеты, которые предназначены для транзитного прохода через систему.

"Выходная" (output) цепочка - через эту цепочку проходят все пакеты, которые отправляются этой машиной.

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

Сначала проверьте, какая версия ipchains стоит у вас на машине.

# ipchains --version
ipchains 1.3.5, 26-June-1998

Этот документ ссылается именно на эту версию программы.

ipchains имеет man-документацию, но если вам необходимо больше узнать о путях прохождения пакетов, вы можете проверить руководство по программированию интерфейсов (man 4 ipfw), или файл net/ipv4/ipfw.c в исходных текстах ядра линукса, они достаточно компетентны в данном вопросе ;-).

Есть несколько различных вещей, которые можно делать с цепочками. Первое - это оперирование целыми цепочками. Ядро стартует с 3мя встроенными цепочками - "входная", "выходная", "пересылка" (input, output, forward) - их вы не можете удалить. Нижу указано, что можно делать.

Создание новой цепочки (-N)
Удаление пустой цепочки (-X)
Смена правил для встроенных цепочек (-P)
Список всех правил в цепочке (-L)
Очистка цепочки от правил (-F)
Сброс счетчиков пакетов и байт во всех правилах цепочки) (-Z)

Есть несколько путей для манипулирования правилами внутри цепочки

Добавить новое правило к цепочке (-А)
Вставить новое правило в указанную позицию в цепочке (-I)
Заменить правило в указанной позиции цепочки (-R)
Удалить правило в указанной позиции (-D)
Удалить первое правило, которое срабатывает в цепочке (-D)

Если еще несколько операций для маскарадинга

Показать текущие соединения через маскарад (-M -L)
Установить тайм-ауты для маскарада (-M -S)

В конце, есть команды, которые дают вам проверить, что случиться с данным пакетом, если он пойдет через указанную цепочку.

Операции с одним правилом.

Это основные операции в ipchains - манипуляция правилами. Обычно, вы можете попробовать команды добавить (-А) и удалить (-D) правило. Аналогично и с командами вставить (-I) и заменить (-R) - синтаксис их практически одинаков.

Каждое правило указывает список условий, которые пакет должет иметь, и что с ним делать при совпадении условий. Для примера, давайте запретим все ICMP пакеты, которые идут с адреса 127.0.0.1. В нашем случае протокол должен быть ICMP, и адрес источника 127.0.0.1 - для таких условий "запретить".

Адрес 127.0.0.1 - это интерфейс-заглушка, который есть, даже есть вы не имеете реальных сетевых соединений. Вы можете использовать программу ping для генерации этих пакетов (он просто посылает пакеты с типом ICMP 8 (echo request), на которые обычно все дружественные системы обычно отвечают пакетами с типом ICMP 0 (echo reply)). Это нам и потребуется для тестирования.

# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms
# ipchains -A input -s 127.0.0.1 -p icmp -j DENY
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
#

Вы видите, что первый ping прошел успешно (ключ "-с 1" говорит ping'у, что надо послать всего один пакет)

Потом мы добавили (-А) во "входную" цепочку правило, которое указывет, что пакеты 127.0.0.1 (-s 127.0.0.1) с протоколом ICMP (-p ICMP) должны запрещаться (-j DENY).

Затем мы проверили наше правило, используя второй ping. Он маленько подождал, пока не сдался, ожидая пакет с ответом, который никогда не придет.

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

# ipchains -D input 1

Это удаляет правило номер 1 из входной цепочки.

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

# ipchains -D input -s 127.0.0.1 -p icmp -j DENY

Синтакис после команды (-D) должен совпадать с систаксисом команды -A (или -I и -R), которой и было заданно это правило. Если есть несколько одинаковых правил в разных цепочках, только первое правило будет удаленно.

Спецификация для фильтров.

Мы будем использовать -p для указания протокола и -s для указания адреса источника, но есть и другие опции, которые указывают другие характеристики пакетов. Они будут описаны дальше.

Указание ip-адресов источников и получателей.

ip-адреса источников (-s) и получателей (-d) могут быть указаны 4мя путями. Обычно их указывают полными именами, например "localhost" или "linux.irk.ru". Второй путь - указание полного ip-адреса, например 127.0.0.1. Третий и четвертые пути дают возможность указывать группы ip адресов, например "62.76.19.0/24" или "62.76.19.0/255.255.255.0". Оба эти варианта указывают адреса с 62.76.19.0 включительно до 62.76.19.255. Цифры после "/" указывают, какая чать ip адреса будет значимой. По умолчанию принимается "/32" или "/255.255.255.255" (попадают все ip адреса). Для указания любого ip адреса возможно применение "/0", например # ipchains -A input -s 0/0 -j DENY Это вызовет такой-же эффект, как и без указания -s вообще.

Указание инверсии

Многие флаги, включая -s и -d могут иметь третий аргумент в виде "!", для вычисления адресов, которые НЕ попадают в указанные. Например под "-s ! localhost" попадают все пакеты, которые не идут с localhost.

Указание протокола

Протокол может быть указан с помощью флага -p. Протокол может быть номером (если вы знаете значение номеров протоколов для ip) или одним из следующих значений : TCP, UDP или ICMP. Регистр не имеет значения, tcp то же самое, что и TCP. Протоколы также могут быть инвертированы с помощью "!", напрмер "-р ! ТСР" указывает на те протоколы, которые не TCP.

Указание TCP и UDP портов

Когда указаны протоколы TCP или UDP, возможен третий аргумент, который указывает TCP&UDP порты или их диапазон (включая конечные порты). Диапазон указывается с помощью символа ":", например "6000:6100" указывает на 11 портов, от 6000 до 6010 включительно. Если нижняя граница не указана, за нее принимается 0. Если верхняя граница не указана, она принимается равной 65535. Например, для указания TCP соединений, идущих с портов ниже 1024, синтаксис будет следующим "-p TCP -s 0.0.0.0/0 :1024". Также порты могут быть указаны по имени, например www (для перевода в численное значение смотрите файл /etc/services)

Номера портов также можно инвертировать с помощью "!". Например, для указания любого TCP пакета, кроме WWW пакетов, вы должны указать "-p TCP -d 0.0.0.0/0 ! www" Важно понять, что "-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 то есть на любую машину, кроме 192.168.1.1 и на любой порт, кроме WWW

Указание типов и кодов ICMP

ICMP также допускает использование дополнительных аргументов, но ICMP не имеет портов (ICMP использует тип и код для передачи данных).

Вы можете указывать имена ICMP пакетов (ipchains -h icmp для списка имен) после ключа -s, или числовое значение типа и кода ICMP, где тип следует после ключа -s, а код следует после ключа -d.

ICMP имена на такие длинные, достаточно указать несколько символов, по которым их можно однозначно отличить от других.

Ниже приведена маленькая таблица ICMP типов

Номер Имя                     Нужен для

0     echo-reply              ping
3     destination-unreachable любого TCP/UDP траффика.
5     redirect                роутинга,если не запущен демон роутинга
8     echo-request            ping
11    time-exceeded           traceroute

Запомните, что ICMP типы не могут быть использованы вместе с "!" НЕ БЛОКИРУЙТЕ 3 тип ICMP пакетов !!!!!

Указание интерфейса

Ключ -i указывает имя интерфейса для обработки. Интерфейс - это физическое устройство, через которое "ходят" пакеты. Для выдачи списка работающих интерфейсов есть команда ifconfig, которая покажет список "поднятых" интерфейсов.

Интерфейс для входящих пакетов (то есть для тех, которые проходят "входную" цепочку) - это одно и то же, что и выходной интерфейс.

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

Разрешается также указывать после имени интерфейса знак "+". Это указывает на обработку всех интерфейсов, начинающихся на эти буквы. Например, для обработки всех PPP соединений, можно указать -i ppp+

Разрешается вместе с именем интерфейса указывать знак "!" для отрицания (то есть обрабатывать все интерфейсы, кроме указанного)

Указание только TCP SYN пакетов

Эта опция полезна для разрешения TCP соединений только в одну сторону. Для примера, вы хотите ходить по чужому серверу, но запретить чужому серверу устанавливать соединение с вами. Обычное решение - запретить прием TCP пакетов, идущих с сервера не подходит, так как сервер должен как-то отдавать вам информацию.

Решение состоит в том, что запрещать прием только тех TCP пакетов, которые запрашивают соединение. Эти пакеты называются SYN-пакетами (по правде говоря, это обычные пакеты, только с установленным флагом SYN)

Ключ -y используется как раз для этого. Для примера, если необходимо разрешить соединения с 192.169.1.1, необходимо написать следующее

-p TCP -s 192.168.1.1 -y

Как и обычно, этот ключ может использоваться вместе с флагом "!", разрешая любые пакеты, кроме пакетов инициализации соединений.

Обработка фрагментов.

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

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

Если ваша машина подключена только к внешней сети, эту проблему обойти легко При компиляции ядра поставьте always defragmet в "Y". Эта опция указывает ядру всегда собирать все фрагменты перед дальнейшей работой.

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

Для обеспечения срабатывания правила только на первый фрагмент, ключ -f можно использовать со знаком "!".

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

Памятка для машин, которые служат головными в сети - множество пакетов (TCP, UDP и ICMP) идут уже фрагментированными - будьте осторожны.

Для примера, следующее правило будет сбрасывать все фрагменты, идущие на 192.168.1.1

ipchains -A output -f -D 192.168.1.1 -j DENY

Что происходит в фильтре пакетов ?

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

  1. Счетчик байтов для этого правила увеличивается на размер пакета (вместе с заголовком)
  2. Счетчик пакетов для этого правила увеличивается
  3. Если правило требует этого, информация о пакете записывается в лог
  4. Если правило требует этого, поле TypeOfService пакета меняется
  5. Если правило требует этого, пакет маркируется (не для ядер 2.0)
  6. Проверяется следующее правило по пути следования пакета

Установка указаний.

Данные ключи позволяет указать ядру, куда переслать пакет, который попал под действие правила. ipchains использует ключ "-j" (от jump-to - прыгнуть-к) для указания адресата пакета.

Простейший случай - это не указывать адресата вообще. Этот тип правил называется accounting , они обычно используются для подсчета числа определенного типа пакетов. Без разницы, попадает пакет под действие этого правила или нет, ядро все равно проверит следующие правила в цепочке. Для примера, для подсчета числа пакетов, приходящих с 192.168.1.1, мы можем указать следующее:

ipchains -A input -s 192.168.1.1

Используя команду ipchains -L -v вы сможете просмотреть счетчики пакетов и байт для каждого правила.

Есть 6 специальных указаний, первые три ACCEPT, REJECT и DENY понятны. ACCEPT пропускает пакет, REJECT отвергает пакет с оповещением источника, DENY отвергает пакет так, как будто он никогда не приходил.

Следующее указание, MASQ говорит ядру , чтобы он замаскарадил пакет. Чтобы это правило работало, ядро необходимо скомпилировать с включенной поддержкой IP Masquerading. Для уточнения деталей маскарадинга, читайте Masquerading-HOWTO. Это правило сработает только для цепочки "пересылки"

Указание REDIRECT указывает ядру переслать пакет на указанный адрес без учета реального адреса, указанного в заголовке пакета. Это правило работает только для TCP и UDP протоколов. Дополнительно вы можете указать порт (номер или имя) после "-j REDIRECT". В этом случае пакет будет переслан на указанный порт, даже если он послан на другой порт. Это правило работает только для "входной" цепочки.

Указание RETURN указывает ядру немедленно пропустить пакет до конца цепочки.

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

           `input'                         `Test'
 ----------------------------    ----------------------------
 | Rule1: -p ICMP -j REJECT |    | Rule1: -s 192.168.1.1    |
 |--------------------------|    |--------------------------|
 | Rule2: -p TCP -j Test    |    | Rule2: -d 192.168.1.1    |
 |--------------------------|    ----------------------------
 | Rule3: -p UDP -j DENY    |
 ----------------------------

Возьмем TCP пакет, который идет от 192.168.1.1 к 1.2.3.4. Он входит в "входную" цепочку, и проверяется правило 1 - не попадает. Правило 2 срабытывает, но его указание - Test, и поэтому следующее правило, которое проверяется, это первое правило в цепочке Test. 1е правило не срабатывает, и проверяется 2е. Оно тоже не срабатывает, и мы достигли конца цепочки и возвращаемся назад, проверятся правило 3, которое тоже не срабатывает.

Обрисуем путь пакета.

                            v    __________________________
     `input'                |   /    `Test'                v
    ------------------------|--/    -----------------------|----
    | Rule1                 | /|    | Rule1                |   |
    |-----------------------|/-|    |----------------------|---|
    | Rule2                 /  |    | Rule2                |   |
    |--------------------------|    -----------------------v----
    | Rule3                 /--+___________________________/
    ------------------------|---
                            v

Запись пакетов в лог

Если в правиле указан флаг -l, ядро при срабатывании правила, выдаст вам предупреждение. Этот флаг полезен для эксперементов и для извещения вас о приходе какого-нибудь пакета.

Управление TypeOfService

Есть 4 бита в заголовке пакета, называемые битами TypeOfService (тип сервиса) - "Minimum Delay" (минимальная задержка), "Maximum Throughput" (максимальная пропускная способность) , "Maximum Reliability" (максимальная доступность) и "Minimum Cost"(минимальная стоимость). Только один из этих битов может быть использован.

Обычно устанавливают для соединений, относящихся к telnet&ftp control минимальную задержку, а для FTP data максимальную пропускную способность. Это делается следующим путем

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 пакета выполняется AND (логическое-и), а со вторым XOR (исключающее-или). Это довольно трудно для понимания, поэтому вот вам табличка

TOS Имя                Значение        Используется

Minimum Delay           0x01 0x10       ftp, telnet
Maximum Throughput      0x01 0x08       ftp-data
Maximum Reliability     0x01 0x04       snmp
Minimum Cost            0x01 0x02       nntp

Маркировка пакетов

К сожалению, это пока не сделано, но в любом случае этого не будет на ядрах 2.0

Операции над целой цепочкой

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

Создание новой цепочки

Давайте создадим новую цепочку. Поскольку у меня нет фантазии, назовем ее test

    ipchains -N test

Это просто, теперь можете помещать правила в цепочку.

Удаление цепочки

Удаление цепочки так же просто, как и создание.

    ipchains -X test

Почему -X ? А просто больше не было подходящих букв ;-).

Запомните, вы не можете удалить цепочку, пока она не пустая !.

Очистка цепочки

Самый простой путь очистить цепочку, это использовать команду -F ipchains -F forward

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

Просмотр цепочек

Вы можете просмотреть все правила в цепочке используя команду -L

# ipchains -L input
Chain input (refcnt = 1): (policy ACCEPT)
target     prot opt    source                destination           ports
ACCEPT     icmp -----  anywhere              anywhere              any
# ipchains -L test
Chain test (refcnt = 0):
target     prot opt    source                destination           ports
DENY       icmp -----  localnet/24           anywhere              any
#

refcnt показывает, сколько правил в цепочке. Это число должно быть 0, для того, чтобы цепочку можно было удалить.

Для ключа -L есть 3 опции. -n запрещает ipchains попытки преобразовать ip адреса в символические. -v показывает вам детальный список правил. Например

# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
pkts bytes target prot opt tosa tosx ifname mark source destination ports
10   840   ACCEPT icmp --- 0xFF 0x00 lo          anywhe anywhere    any

Запомните, что число пакетов может выводиться с соответствующими суффиксами (K, M, G соответственно для килобайт, мегабайт и гигабайт). Используя -x вы сможете выводить числа в полном формате.

Сброс счетчиков

данное действие может быть сделано с помощью ключа -Z

Единственная проблема, которая может случиться в этом случае, состои в том что после команды -L и до команды -Z может прийти несколько пакетов, которые не будут подсчитаны. Выход из этого состоит в следующем - одновременное использование ключей -L и -Z. Но в этом случае вы не сможете оперировать с одной цепочкой - действия будут происходить для всех цепочек,как для одной

Установка указаний для цепочки

Эта опция полностью аналогична установке указаний для правил, за исключением некоторых моментов.

  1. возможны толко указания ACCEPT, DENY, REJECT или MASQ
  2. указание MASQ возможно только в цепочке пересылка (forward)
  3. указание RETURN должно использоваться с большой осторожностью.

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

Команда IP маскарадинга -M может быть объеденина с -L для просмотра текущих соединений, или с -S для установки параметров.

Команда -L может быть использована с ключами -n для просмотра адресов и портов текущих соединений или с -v для более детального просмотра той же информации.

Команда -S должна идти с 3мя параметрами таймаута, каждый в секундах: первый для TCP сессий, второй для TCP сессий после пакета FIN и для UDP пакетов. Если вы не хотите менять какой-либо из параметров, просто поставьте его значение в "0".

Значения по умолчанию содержатся в файле `/usr/include/net/ip_masq.h', обычно 15 минут, 2 минуты и 5 минут соответственно.

Проверка пакетов.

Иногда вам надо увидеть, что случается с пакетом, который входит какими-либо путями в машину, например, протестировать цепочки на предмет ошибок. ipchains имеет для этого случая команду -C.

Для указания, какую именно цепочку надо тестировать, ее имя можно указать после команды -C, иначе ядро начнет проходить цепочки, начиная с input.

Для указания типов пактов применяются те же ключи, что и при указании правил к фильтрам.

Например, тестируем TCP SYN пакет от 192.162.1.1 по порту 60000 к 192.168.1.2 порт www, начиная от входной цепочки. Это классическое www соединение

# ipchains -C input -p tcp -y -s 192.168.1.1 60000 -d 192.168.1.2 www
packet accepted

Полезные примеры
Для примера рассмотрим некую машину
Используется диал-ап (-i ppp0) , забираются новости (-p TCP -s news nntp) и почта (-p TCP -s mail pop-3), время от времени идет доступ по ftp для обновления системы ( -p TCP -y -s ftp.cdrom.com ftp-data). Доступ до web через прокси-сервер (-p TCP -d proxy 3128), но нам не нужна реклама с doubleclick.net или с Dilbert Archive (-p TCP -y -d 199.95.207.0/24 & -p TCP -y -d 199.95.208.0/24). Мы не хотим пускать пользователей к нам по ftp (-p TCP -d $LOCALIP ftp) и вообще в локальную сеть (-s 192.168.1.0/24).

1 - мы не хотим, чтобы что-то или кто-то
    посылал покетики на doubleclick.net

# ipchains -A output -d 199.95.207.0/24 -j REJECT
# ipchains -A output -d 199.95.208.0/24 -j REJECT

2 - создадим цепочку ppp-out для правил, которые будут действовать во
время коннекта
# ipchains -N ppp-out
# ipchains -A output -i ppp0 -j ppp-out
3 - минимальная задержка для telnet&web
# ipchains -A ppp-out -p TCP -d proxy.virtual.net.au 8080 -t 0x01 0x10
# ipchains -A ppp-out -p TCP -d 0.0.0.0 telnet -t 0x01 0x10
4 - минимальный приоритет для ftp данных, nntp, pop-3
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 ftp-data -t 0x01 0x02
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 nntp -t 0x01 0x02
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 pop-3 -t 0x01 0x02
5 - создадим цепочку для входящих по диал-апу пакетов
# ipchains -N ppp-in
# ipchains -A input -i ppp0 -j ppp-in
6 - запретим доступ во внутреннею сеть
# ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY
7 - разрешим соединения к DNS, ftp, и данных ftp только к нам
# ipchains -A ppp-in -p TCP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT
# ipchains -A ppp-in -p TCP -s 0.0.0.0/0
#  ftp-data -d $LOCALIP 1024:5999 -j ACCEPT
# ipchains -A ppp-in -p TCP -s 0.0.0.0/0
#  ftp-data -d $LOCALIP 6010: -j ACCEPT
# ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT
8 - локалные пакеты должны свободно ходить
# ipchains -A input -i lo -j ACCEPT
9 - если не одно из правил не сработало, запрещаем пакет
# ipchains -P input DENY

Сохранение и восстановление настроек файрволла.

Каждый раз утомляет вводить все вышеперечисленные команды. Есть 2 выхода либо записать все команды в шелл-скрипт, либо воспользоваться утилитами

ipchains-save и ipchains-restore
# ipchains-save > my_firewall
# ipchains-restore < my_firewall

Как ими пользоваться, видно из примеров. ipchains-save может иметь только один параметр - имя сохраняемой цепочки, если оно не указано, то сохраняются все цепочки. ipchains-restore имеет 2 ключа : -v, который описывает, что скрипт делает, и -f, который автоматически очищает существующую цепочку перед восстановлением в ней правил.

Более подробно о том, что не следует закрывать, и о отличиях между ipfwadm и ipchains вы можете прочитать в оригинальном IPCHAINS-HOWTO. Для построения нормально работающего файрволла достаточно и вышеприведенного. Автор не возражает, если кто-то наберется сил и смелости и допереводит и дополнит данный документ из оригинала - я устал. ;-)
5.04.1999 (linux.irk.ru)



With any suggestions or questions please feel free to contact us