• 14.1. Применение IPChains
  • 14.2. Настройка IPChains
  • 14.3. Различные примеры
  • 14.3.1. Пакеты SYN
  • 14.3.2. Фрагментация пакетов
  • 14.3.3. Пинг смерти
  • 14.3.4. IР-спуфинг
  • 14.3.5. Фильтрация фрагментированных бомб
  • 14.4. Практический пример
  • 14.5. IPTables
  • 14

    Бастионы

    14.1. Применение IPChains

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

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

    Бастион (firewall, брандмауэр) — это системный компонент (фильтр), обеспечивающий защиту сети от несанкционированного доступа. IPChains представляет собой пакетный фильтр. Пакетный фильтр просматривает заголовок каждого пакета, который проходит через него, а потом решает, что делать со всем пакетом. Фильтрация пакетов встроена в ядро ОС Linux.

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

    С помощью IPChains можно ограничить свою хорошо организованную сеть от хаоса Интернет. Применение IPChains может решить такие виды атак, как пинг смерти, атака на отказ, IP-спуфинг, фрагментация пакетов. В этой главе будут описаны способы защиты от перечисленных атак на ваш сервер, а также будут приведены рекомендации по выявлению источника атак.

    Для поддержки IPChains вам необходимо перекомпилировать ядро. О том, как это сделать рассказано в гл. 18. При этом вам нужно включить опции ядра IP:firewalling и IP:firewall packet. Я также рекомендую включить опции IP: masquerading и IP: always defragment. Скорее всего, они также вам понадобятся. Также вам следует включить IP-Forwarding (если вы еще это не сделали) командой:

    echo "1" > /proc/sys/net/ipv4/ip_forward

    Если же вам нужна поддержка динамических IP-адресов (например, для DHCP — см. гл. 8), включите ее с помощью команды:

    echo "1" > /proc/sys/net/ipv4/ip_dynaddr

    14.2. Настройка IPChains

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

    Ядро стартует с тремя списками правил: input, forward, output. Эти правила называются firewall-цепочками или просто цепочками. Когда вы получаете новый пакет, ядро использует цепочку input (входная цепочка). Перед этим пакет проверяется: не был ли он поврежден при пересылке? Поврежденные пакеты отвергаются. Если с пакетом все в порядке, пакет проходит проверку целостности: не запутает ли пакет правила фильтрации? Если пакет не проходит проверку целостности, он отвергается.

    Если фильтр пропускает пакет, то ядро решает, куда его направить дальше. Это называется маршрутизацией. Если пакет предназначен для другой машины, то пакет должен пройти через цепочку forward. Если пакет проходит через фильтр forward, то удаленная машина получит этот пакет. Что делать с этим пакетом дальше, будет решать уже получившая его машина и для нас это не представляет интереса.

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

    Прежде чем пакет выйдет из сетевого интерфейса, он должен пройти цепочку output.

    Цепочка — это список правил. Каждое правило можно сформулировать примерно так: «если заголовок пакета удовлетворяет такому-то условию, то поступить с ним так-то». Если первое правило не применимо к этому пакету, то рассматривается следующее правило в цепочке. Если ни одно правило не применимо к пакету, пакет, скорее всего, будет отвергнут. Если какой-нибудь пакет отвергается, в журнале syslog появляется соответствующее сообщение.

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

    Параметры программы ipchains Таблица 14.1

    Параметр Описание
    -N Создать новую цепочку
    -X Удалить пустую цепочку
    -P Изменить стратегию для пустой цепочки
    -L Вывести правила цепочки
    -F Удалить все правила из цепочки
    -Z Обнулить счетчики пакетов и байтов во всех правилах цепочки
    Добавить новое правило к цепочке
    -I Вставить новое правило в определенную позицию
    -R Заменить правило
    -D Удалить правило, удовлетворяющее какому-нибудь условию

    Один из примеров использования IPChains мы уже рассматривали в главе 8. Напомню, в той главе нужно было организовать маршрутизацию средствами IPChains. При этом использовались следующие команды:

    ipchains –P forward DENY

    ipchains –A forward –s 192.168.1.0/24 –d 192.168.2.0/24 –j ACCEPT

    ipchains –A forward –s 192.168.2.0/24 –d 192.168.1.0/24 –j ACCEPT

    Первая команда изменяет стратегию для пустой цепочки forward, которая используется именно для маршрутизации. Вторая команда перенаправляет пакеты из сети 192.168.1.0 в сеть 192.168.2.0. Опция –s означает источник (source), а опция –d означает назначение (destination). Опция –j определяет действие. В том случае, если вы должны принять пакет, используется параметр ACCEPT. Если вам нужно отбросить пакет, используйте параметр DENY.

    Адреса источника и пункта назначения можно указывать четырьмя способами:

    1. Просто указать IP-адрес, например, 192.168.1.1.

    2. Указать имя компьютера, например, www.host.ru.

    3. Указать целую группу IP-адресов, например, 192.168.1.0/24.

    4. Указать группу адресов и маску сети, например, 192.168.1.0/255.255.255.0.

    Для формирования правил также используются опции, представленные в табл. 14.2.

    Все эти опции могут иметь предшествующий параметру символ «!». Как и в некоторых языках программирования, этот символ обозначает отрицание. Например, правило –s! localhost определяет любой пакет, не исходящий из компьютера localhost.

    Опции формирования правил Таблица 14.2

    Параметр Описание
    -s  Источник (IP-адрес или URL-адрес)
    -d Назначение (IP-адрес или URL-адрес)
    -i Интерфейс
    -p Протокол

    Указать протокол можно с помощью опции –р. Например, для указания протокола TCP служит правило –р TCP. Иногда нужно указать порт соединения TCP или UDP. Это можно сделать так: IP-addr/ports_range.

    Диапазон портов определяется параметром ports_range. Диапазон указывается через двоеточие, например, 0:1023. Нижний предел диапазона равен О, а верхний — 1023. Если нижний предел не задан, принимается значение по умолчанию — 0. Если не задан верхний предел, считается, что он равен 65535, то есть максимальному числу поддерживаемых портов.

    Указать интерфейс можно с помощью опции –i. Например, –i ppp0. Если у вас несколько интерфейсов, названия которых начинаются символами ррр, указать их всех вы можете опцией –i ppp+. Под интерфейсом понимается физическое устройство, на (из) который приходит (уходит) пакет. Для того, чтобы просмотреть список доступных в текущий момент интерфейсов, используйте команду ifconfig.

    Теперь рассмотрим пару полезных примеров. Возможно, вы захотите запретить использование telnet извне. Это можно сделать с помощью команды:

    ipchains –A prov –p tcp –destination-port 23 –j REJECT

    Через цепочку prov проходит весь трафик, идущий от провайдера. Ее можно создать командами:

    ipchains –N prov

    ipchains –A input –i ppp0 –j prov

    Предполагается, что вы подключаетесь к провайдеру через интерфейс ррр0. Скорее всего, в вашей сети найдутся несколько машин, которые работают под управлением ОС Windows и имеют общие ресурсы. Возможно, вы даже настроили протокол SMB на сервере. Чтобы протокол 8MB не был заметен извне, что очень нежелательно, воспользуйтесь следующими командами:

    ipchains –A prov –p tcp –destination-port 137 –j REJECT

    ipchains –A prov –p udp –destination-port 137 –j REJECT

    ipchains –A prov –p tcp –destination-port 138 –j REJECT

    ipchains –A prov –p udp –destination-port 138 –j REJECT

    ipchains –A prov –p tcp –destination-port 139 –j REJECT

    ipchains –A prov –p udp –destination-port 139 –j REJECT

    Можно запретить локальным процессам получать пакеты от определенных узлов. Например, я не хочу, чтобы мой Netscape тратил время на получения баннеров от машины с адресом 911.111.111.111. Для этого, возможно, удобнее было бы воспользоваться прокси-сервером, но сейчас нужно продемонстрировать, как это можно сделать с помощью IPChains.

    ipchains –A output –d 911.111.111.111 –j REJECT

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

    Для того, чтобы ваши правила были постоянными (при перезагрузке машины правила IPChains теряются), используйте сценарии ipchains-save и ipchains-restore. Настройте свои правила, затем выполните команду:

    # ipchains-save > /etc/ipchains.rules

    В листинге 14.1 представлен сценарий, управляющий пакетной фильтрацией.

    Листинг 14.1. Сценарий управления пакетной фильтрацией

    #! /bin/sh

    # Сценарий управления пакетной фильтрацией.,

    # Если правил нет, то ничего не делать.

    [ –f /etc/ipchains.rules ] || exit 0

    case "51" in

    start)

     echo –n "Включение пакетной фильтрации:" /sbin/ipchains-restore < /etc/ipchains.rules || exit 1

     echo 1 > /proc/sys/net/ipv4/ip_forward

     echo ". "

     ;;

    stop)

     echo –n "Отключение пакетной фильтрации:"

     echo 0 > /proc/sys/net/ipv4/ip_forward

     /sbin/ipchains –X

     /sbin/ipchains –F

     /sbin/ipchains –P input ACCEPT

     /sbin/ipchains –P output ACCEPT

     /sbin/ipchains –P forward ACCEPT

     echo " . "

     ;;

    *)

     echo "Использование: /etc/init.d/packetfliter {start|stop}"

     exit 1

     ;;

    esac

    exit 0

    Этот сценарий нужно добавить в сценарии загрузки системы.

    14.3. Различные примеры

    В этом пункте представлены несколько примеров для обеспечения безопасности вашей сети.

    14.3.1. Пакеты SYN

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

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

    Для фильтрации пакетов SYN нужно использовать опцию –у. Например, попытки соединения по протоколу TCP от узла 192.168.1.34 указываются так:

    –р TCP –s 192.168.1.34 –у

    14.3.2. Фрагментация пакетов

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

    Ядро должно анализировать начало пакета, которое содержится в первом фрагменте. Ведь только в первом фрагменте находится заголовок исходного пакета. Для решения этой проблемы вам нужно перекомпилировать ядро с включенной опцией IP: always defragment.

    В результате любое правило фильтрации не будет работать для фрагментированных пакетов. При этом только первый фрагмент будет обработан как пакет, а остальные не будут обрабатываться. Однако можно определить правило специально для фрагментированных пакетов. Это можно сделать с помощью опции –f. Эту опцию нельзя применять при указании портов протоколов TCP или UDP, кода ICMP или пакетов SYN.

    Следующая команда отбросит все фрагменты, приходящие на компьютер server.domain.com:

    # ipchains –A output –f –d 192.168.1.1 –j DENY

    14.3.3. Пинг смерти

    Есть хорошая новость по этому поводу: ОС Linux невосприимчива к пингу смерти. Напомню, что пинг смерти заключается в посылке большого пакета ICMP, который переполняет буферы стека TCP на компьютере-получателе.

    14.3.4. IР-спуфинг

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

    Для решения этой проблемы мы можем использовать Проверку Адреса Источника (Source Address Verification) или использовать следующие команды IPChains:

    ipchains –A prov –s 192.168.1.1/16 –l –j DENY

    ipchains –A prov –s 127.0.0.1/8 –l –j DENY

    Вторая команда нужна для ядер версий 2.0.x, но если мы ее укажем, явно хуже не будет. Опция –l позволяет протоколировать «плохие» пакеты. Файлом протокола является /var/log/messages. Ядра версий 2.1.x автоматически отклоняют пакеты, приходящие с адресов 127.*, которые зарезервированы для локального интерфейса.

    Для включения проверки адреса источника можно воспользоваться сценарием, представленном в листинге 14.2.

    Листинг 14.2. Запрещение IР-спуфинга

    # Наилучший способ: включить Source Address Verification и защитить

    # от спуфинга все текущие и будущие интерфейсы.

    if [ –e /proc/sys/net/ipv4/conf/all/rp_filter ] ; then

     echo –n "Установка защиты от спуфинга… "

     for f in /proc/sys/net/ipv4/conf/*/rp_fliter; do

      echo 1 > $f

     done

     echo "готово."

    else

     echo ПРОБЛЕМЫ ПРИ ПОПЫТКЕ ВКЛЮЧИТЬ ЗАЩИТУ ОТ СПУФИНГА.

     echo "Нажмите CONTROL-D для выхода в shell и продолжения сист. загрузки."

     echo

    # Запуск однопользовательской оболочки на консоли

     /sbin/sulogin $CONSOLE

    fi

    Защита с использованием проверки адреса источника является более надежной.

    14.3.5. Фильтрация фрагментированных бомб

    Иногда возникает такая ситуация, когда на машину приходят не все фрагменты. Такое бывает при очень большом количестве фрагментов. Обычно при использовании ОС Linux данная проблема вообще отпадает, но все-таки некоторые администраторы предпочитают «перестраховаться».

    Для решения этой проблемы вам нужно всего лишь перекомпилировать ядро с включенной опцией IP: always defragment. При этом нужно учитывать, чтобы ваш шлюз был единственным маршрутом для пакетов. Вторым способом является фильтрация фрагментов, но это может отразиться на нормальных пакетах. Честно говоря, я не особо забочусь об этой проблеме при настройке своего сервера.

    14.4. Практический пример

    А теперь рассмотрим более серьезный пример. Этот пример частично позаимствован мною из руководства DNS-HOWTO. Но прежде чем перейти непосредственно к практике, попробую объяснить некоторые термины, которые будут встречаться ниже.

    Прежде всего, определимся, что называется маскарадингом. Объяснение я приведу на сугубо формальном языке. Маскарадинг перезаписывает заголовки пакетов, когда они проходят через шлюз так, чтобы казалось, что они всегда исходят от шлюза непосредственно. Затем он перезаписывает ответы так, чтобы клиенту казалось, что они пришли от первоначального получателя. Например, у вас есть шлюз и одна небольшая локальная сеть. Шлюз обладает реальным IP-адресом 1.1.1.1, а адрес вашей локальной сети — 192.168.1.0. Клиент с IP-адресом 192.168.1.5 пытается обратиться к узлу http://www.romb.net. IP-адрес этого узла 62.244.59.193. Пакет клиента проходит через шлюз. IP-адрес шлюза в локальной сети — 192.168.1.1. Шлюз перезаписывает заголовок пакета и устанавливает вместо адреса клиента свой собственный адрес, то есть 1.1.1.1. После получения ответа, он перед отправлением пакета клиенту опять перезаписывает заголовок пакета и изменяет свой адрес 1.1.1.1 на адрес узла www.romb.net — 62.244.59.193. С точки зрения узла www.romb.net соединение было установлено между адресами 1.1.1.1 и 62.244.59.193. С точки зрения клиента соединение произошло между интерфейсами с адресами 192.168.1.5 и 62.244.59.193.

    Итак, приступим к рассмотрению практического примера. Предположим, у нас имеется соединение с Интернет и две подсети. Интерфейсу ррр0 назначен реальный IP-адрес — 111.1.1.1, интерфейсу eth0 назначен IP-адрес внутренней сети — 192.168.2.1, а интерфейсу eth1 – 192.168.1.1. (см. рис. 14.1).


    Рис. 14.1. Структура сети


    Нам нужно обеспечить маршрутизацию между тремя сетями: Интернет, 192.168.2.0 и 192.168.1.0. Другими словами, требуется таким образом настроить пакетную фильтрацию, чтобы можно было пропинговать любую сеть или выполнить трассировку пакетов через любую сеть. Пинговать сеть будем, естественно, с помощью программы ping, а выполнять трассировку будем программой traceroute. В ОС Windows NT те же операции можно выполнить с помощью программ ping и tracert соответственно.

    Нам также нужно, чтобы сервер WWW обрабатывал как запросы из внутренних сетей, так и запросы пользователей Internet. Сервер SMTP должен принимать внутренние и внешние соединения, а также отправлять почту в Internet. Получать почту по протоколу POP3 могут только пользователи внутренних сетей. Сервер DNS также должен обрабатывать запросы от всех сетей.

    Еще раз определим, к чему будут иметь доступ пользователи Интернет:

    1. Наш внутренний сервер WWW.

    2. Наш сервер FTP.

    3. Наш сервер DNS.

    4. Сервер SMTP.

    Пользователи локальных сетей будут иметь доступ к:

    1. Серверу WWW нашей сети.

    2. Серверу FTP нашей сети.

    3. Серверу SMTP для отправки почты, как пользователям локальной сети, так и пользователям Интернет.

    4. Серверу DNS нашей сети, а также к серверам DNS сети Интернет.

    5. Серверу POP3 для получения почты.

    6. Серверам WWW сети Интернет.

    7. Серверам FTP сети Интернет.

    Наши пользователи также должны иметь возможность использовать программы ping, traceroute, ssh. Чуть не забыл! Нам же нужно также обеспечить нормальную работу клиента ICQ. Эта программа стала уже стандартом, как Netscape или Internet Explorer.

    Прежде, чем настраивать пакетный фильтр, убедимся, что мы запретили IP-спуфинг и правильно настроили все сетевые интерфейсы. В этой главе уже приводился более подробный пример запрещения IP-спуфинга (листинг 14.2). Эту задачу можно попробовать решить одной командой (при этом вы должны использовать интерпретатор bash):

    for f in /proc/sys/net/ipv4/conf/*/rp_fliter; do echo 1 > $f; done

    Теперь установим правила, которые запрещают любые пакеты, кроме пакетов обратной петли (loopback):

    # ipchains –A input –i ! lo –j DENY

    # ipchains –A output –i ! lo –j DENY

    # ipchains –A forward –j DENY

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

    Очень желательно вставить модуль ip_masq_ftp для маскарадинга сервера FTP. Благодаря этому наш внутренний FTP-сервер сможет работать в активном и пассивном режимах.

    Теперь создадим несколько цепочек. Все они будут отфильтровывать проходящие пакеты, то есть будут аналогичны цепочке forward. Название каждой из них определяется направлением передачи пакетов, например, netl-net2 — по этой цепочке пакеты будут передаваться от сети 192.168.1.0 к сети 192.168.2.0.

    ipchains –N netl-net2

    ipchains –N net1-inet

    ipchains –N net2-net1

    ipchains –N net2-inet

    ipchains –N inet-net2

    ipchains –N inet-net1

    Также создадим цепочку для приема ICMP-сообщений:

    ipchains –N icmp

    В цепочке forward мы знаем только исходящий интерфейс, а для выяснения входящего интерфейса, то есть того, из которого пришел пакет, мы используем адрес источника. Подделать этот адрес невозможно, так как мы запретили IP-спуфинг. Выполним следующие команды:

    ipchains –A forward –s 192.168.1.0/24 –i eth0 –j net1-net2

    ipchains –A forward –s 192.168.1.0/24 –i ppp0 –j net1-inet

    ipchains –A forward –s 192.168.2.0/24 –i ppp0 –j net2-inet

    ipchains –A forward –s 192.168.2.0/24 –i eth1 –j net2-net1

    ipchains –A forward –i eth0 –j inet-net2

    ipchains –A forward –i eth1 –j int-net1

    ipchains –A forward –j DENY –1

    Теперь определим правила для цепочки приема ICMP-сообщений:

    ipchains –A icmp –p icmp —icmp-type destination-unreachable –j ACCEPT

    ipchains –A icmp –p icmp —icmp-type source-quench –j ACCEPT

    ipchains –A icmp –p. icmp —icmp-type time-exceeded –j ACCEPT

    ipchains –A icmp –p icmp —icmp-type parameter-problem –j ACCEPT

    Мы будем принимать только ICMP-сообщения об ошибках, все остальные приниматься не будут. Далее определим правила для цепочки netl-net2. Как уже было сказано выше, от нас требуется обеспечить доступ к сервисам WWW, FTP, ssh. Также нужно разрешить доступ к серверам SMTP, POPS, DNS, использование программ traceroute и ping (все отклоненные пакеты мы будем регистрировать в журнале). С этой целью определим следующие правила:

    ipchains –A net1-net2 –p tcp –d 192.84.219.128 smtp –j ACCEPT

    ipchains –A net1-net2 –p tcp –d 192.84.219.128 pop-3 –j ACCEPT

    ipchains –A net1-net2 –p udp –d 192.84.219.129 domain –j ACCEPT

    ipchains –A net1-net2 –p tcp –d 192.84.219.129 domain –j ACCEPT

    ipchains –A net1-net2 –p tcp –d 192.84.218.130 www –j-j ACCEPT

    ipchains –A net1-net2 –p tcp –d 192.84.218.130 rsync –j ACCEPT

    ipchains –A net1-net2 –p icmp –j icmp ipchains –A net1-net2 –j DENY –l

    Эти правила также разрешают вызов rsync к серверу Web. Теперь определим правила для цепочки inet-net2. Так как в сети 192.168.2.0 находятся серверы SMTP, DNS и Web, то определим ограничения для них. Почтовый сервер должен отправлять почту во внешнюю сеть (Интернет), а также принимать почту из внешней сети. На прием почты по протоколу POP3 имеют право только пользователи внутренней сети. Сервер имен (DNS-сервер) должен посылать запросы во внешнюю сеть, а также принимать запросы из внешней сети через шлюз. Сервер Web должен принимать запросы от пользователей всех сетей. Доступ rsync разрешен только для пользователей внутренних сетей. Все это реализуется следующими правилами:

    ipchains –A inet-net2 –p tcp –d 192.168.2.98 smtp –j ACCEPT

    ipchains –A inet-net2 –p udp –d 192.168.2.99 domain –j ACCEPT

    ipchains –A inet-net2 –p tcp –d 192.168.2.99 domain –j ACCEPT

    ipchains –A inet-net2 –p tcp –d 192.168.2.97 www –j ACCEPT

    ipchains –A inet-net2 –p icmp –j icmp ipchains –A inet-net2 –j DENY

    Далее задаем правила цепочки net1-inet. Пользователи внутренней сети могут получать доступ к сервисам WWW, FTP внешней сети, использовать traceroute во внешнюю сеть. Нужно разрешить доступ к почтовому серверу, серверу имен, Web-серверу. Модуль masq обеспечит пассивный доступ к серверу FTP. Возможные нарушения будут регистрироваться. Пользователи внутренней сети также смогут использовать программу ssh для доступа к внешним узлам, и программу ping.

    ipchains –A net1-inet –p tcp www –j MASQ

    ipchains –A net1-inet –p tcp ssh –j MASQ

    ipchains –A net1-inet –p udp –dport 33434:33500 –j MASQ

    ipchains –A net1-inet –p tcp –dport ftp –j MASQ

    ipchains -A net1-inet -p icmp -icmp-type ping -j MASQ

    ipchains -A net1-inet -j REJECT -l

    Сейчас займемся определением правил для цепочки net2-net1. Пользователи могут получать доступ к серверам Web, SMTP, DNS, POPS. Как и для предыдущего случая, мы будем использовать модуль masq для пассивного режима работы FTP-сервера и будем регистрировать нарушения. Правила для этой цепочки будут таковыми:

    ipchains -A net2-net1 -р tcp i -y -s 192.84.219.128 smtp -j ACCEPT

    ipchains -A net2-net1 -р udp -s 192.84.219.129 domain -j ACCEPT

    ipchains -A net2-net1 -р tcp i -y -s 192.84.219.129 domain -j ACCEPT

    ipchains -A net2-net1 -р tcp i -y -s 192.84.218.130 www -j ACCEPT

    ipchains -A net2-net1 -р tcp i -y -s 192.84.218.130 rsync -j ACCEPT

    ipchains -A net2-net1 -р icmp -j icmp

    ipchains -A net2-inet -j DENY -l

    Правила для цепочки net2-inet выглядят так:

    ipchains -A net2-inet -p tcp -s 192.84.219.128 smtp -j ACCEPT

    ipchains -A net2-inet -p udp -s 192.84.219.129 domain -j ACCEPT

    ipchains -A net2-inet -p tcp -s 192.84.219.129 domain -j ACCEPT

    ipchains -A net2-inet -p tcp ! -y -s 192.84.218.130 www -j ACCEPT

    ipchains –A net2-inet –p icmp

    ipchains –A net2-inet –j DENY

    Эти правила разрешают отправлять почту во внешнюю сеть, принимать почту из внешней и внутренней сети, получать почту только пользователям внутренней сети. Сервер DNS имеет право посылать запросы во внешнюю сеть, принимать запросы от внутренней и внешней сетей, а также от шлюза. Сервер WWW принимает запросы от пользователей внутренней и внешней сетей. Доступ rsync разрешен пользователям внутренней сети.

    Следующая цепочка — это inet-net1. В этом случае мы не разрешаем никакого доступа из внешней сети к машинам внутренней сети.

    ipchains –A inet-net1 –j REJECT

    Основные правила уже определены, осталось установить правила для цепочки input шлюза. Создадим три цепочки input для каждого возможного адресата:

    ipchains –N inet-if

    ipchains –N net2-if

    ipchains –N net1-if

    По первой цепочке будут приходить пакеты от внешней сети, а по второй и третьей — от внутренних сетей. Правила для этих цепочек выглядят так:

    ipchains –A input –d 192.84.219.1 –j inet-if

    ipchains –A input –d 192.84.219.250 –j net2-if

    ipchains –A input –d 192.168.1.250 –j net1-if

    Непосредственно для цепочки inet-if определим такие правила:

    ipchains –A inet-if –i ! ppp0 –j DENY –1

    ipchains –A inet-if –p TCP –dport 61000:65096 –j ACCEPT

    ipchains –A inet-if –p UDP –dport 61000:65096 –j accept

    ipchains –A inet-if –p ICMP —icmp-type pong –j ACCEPT

    ipchains –A inet-if –j icmp

    ipchains –A inet-if –j DENY

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

    Цепочку net2-if определим следующим образом:

    ipchains –A net2-if –i ! eth0 –j DENY

    ipchains –A net2-if –p TCP ! –y –s 192.168.2.99 53 –j ACCEPT

    ipchains –A net2-if –p UDP –s 192.168.2.99 53 –j ACCEPT

    ipchains –A net2-if –p ICMP –icmp-type pong –j ACCEPT

    ipchains –A net2-if - j icmp

    ipchains –A net2-if –j DENY –l

    Правила этой цепочки разрешают те же операции, что и для цепочки inet-if, только в этом случае вместо интерфейса ррр0 используется eth0.

    Входящая цепочка net1-if определяется так:

    ipchains –A net1-if –i ! eth1 –j DENY

    ipchains –A net1-if –p ICMP –icmp-type ping –j ACCEPT

    ipchains –A net1-if –p ICMP –icmp-type pong –j ACCEPT

    ipchains –A net1-if –j icmp ipchains –A net1-if –j DENY –l

    Разрешается доступ к серверам WWW, SMTP, POP3. Можно использовать программы ping, traceroute, ssh.

    Теперь осталось удалить правила блокировки:

    ipchains –D input l

    ipchains –D forward l

    ipchains –D output l

    В начале этого пункта я обещал объяснить настройку ICQ. Предположим, что сервер SQUID у вас установлен на шлюзе, то есть на той машине, которая обеспечивает пакетную фильтрацию (о прокси-сервере SQUID читайте в следующей главе). В файле конфигурации SQUID разрешите порт 5190. Именно этот порт используется новыми клиентами ICQ.

    acl SSL_ports port 443 563 5190

    Затем установите сервер socks. Можно, конечно, настроить ICQ, используя маскарадинг, но данный метод, как мне кажется, лучше. В качестве сервера socks я рекомендую использовать сервер dame-socks. В файле конфигурации /etc/socks.conf установите внутренний и внешний адреса шлюза:

    internal: 192.168.1.1 port = 1080

    external: 111.1.1.1

    Затем определите узлы, которые могут использовать socks:

    client pass {

     from: 192.168.0.0/16 to: 0.0.0.0/0

    }

    Осталось определить, кто может отвечать клиентам:

    pass {

     from: 0.0.0.0/0 to: 192.168.0.0/16

     command: bindreply udpreply

     log: connect error

    }

    14.5. IPTables

    Пакетный фильтр IPChains использовался в ядрах Linux до версии 2.4. В новых версиях ядра (начиная с 2.4) вместо IPChains используется пакетный фильтр IPTables. Практически все основные опции остаются прежними. Только, естественно, в командной строке вместо ipchains следует писать iptables.

    В этом пункте будут рассмотрены некоторые новые опции ядра, связанные непосредственно с IPTables. Эти опции для большей наглядности я представил в табл. 14.3. Если вы еще не знакомы с компилированием ядра, то эта информация вам пригодится после прочтения гл. 18.

    Опции ядра Таблица 14.3

    Опция Описание
    CONFIG_PACKET Позволяет использовать программы, которые работают непосредственно с сетевым устройством. Примером такой программы может послужить tcpdump
    CONFIG_NETFILTER Включите данную опцию, если вы собираетесь использовать ваш компьютер в качестве шлюза
    CONFIG_IP_NF_CONNTRACK Позволяет отслеживать соединения. Данная опция необходима для работы функций NAT или IP-маскарадинга. В случае со шлюзом включите данную опцию
    CONFIG_IP_NF_FTP Прослеживает FTP-соединения. Включите эту опцию, если на вашем компьютере установлен FTP-сервер. Из-за большого количества FTP-запросов модуль IP_NF_CONNTRACK не в состоянии проследить все FTP-соединения, поэтому в помощь ему добавлена опция CONFIG_IP_NF_FTP
    CONFIG_IP_NF_IPTABLES Необходимая для работы IPTables опция. Без ее включения вы не сможете использовать IPTables
    CONFIG_IP_NF_MATCH_LIMIT Необязательная опция. Позволяет ограничить количество пакетов передаваемых/принимаемых за промежуток времени
    CONFIG_IP_NF_MATCH_MAC Позволяет блокировать пакеты, используя МАС-адрес (а не IP-адрес)

    Все остальные опции, связанные с IPTables, содержат в своем названии слово MATCH, например, CONFIG_IP_NF_MATCH_MARK. Эти опции разрешают выполнять определенные действия над пакетами. Действия над пакетами, как вы уже знаете, задаются с помощью опции -j. Использование этой опции аналогично как для IPChains, так и для IPTables. Назначение всех возможных действий вы можете узнать из документации по IPTables. Ранее, на примере IPChains, мы рассмотрели два основных действия — ACCEPT и DENY. В IPTables вместо действия DENY нужно использовать аналогичное ему действие DROP. А вместо MASQ (см. п. 14.4) — MASQUERADE.

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

    Представим, что вам нужно что-либо сделать с пакетами, приходящими от узла с МАС-адресом 11:12:13:14:15:16. Выделить данный пакет можно с помощью правила iptables –A INPUT —mac-source 11:12:13:14:15:16.

    Дальнейшие операции над пакетом вы уже определите сами, с помощью опции –j. Если же вам нужно выделить все пакеты, кроме тех, которые присылает вам узел с МАС-адресом 11:12:13:14:15:16, то нужно использовать отрицание — !

    Допустим, что теперь вам нужно ограничить число пакетов, присылаемым узлом с МАС-адресом 11:12:13:14:15:16, например, не более 10 пакетов в минуту. Делается это следующим образом: iptables –A INPUT –ra limit —limit 10/minute. Промежуток времени можно указать в секундах (second), минутах (minute) и часах (hour).

    IPTables позволяет выделять (а потом производить с ними операции) пакеты одновременно, указав несколько портов, например:

    iptables -A INPUT –p tcp -m multiport -source-port 22,53,80,110

    Порты указываются через запятую. Вы можете указать максимум 15 портов. Вместо портов источника вы можете указать порты назначения, используя опцию —destination-port. Если вы хотите одновременно указать как порты источника, так и порты назначения, используйте опцию —port:

    iptables -A INPUT –p tcp -m multiport -port 22,53,80,110

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

    iptables -A OUTPUT -m owner -uid-owner 500

    Естественно, вы сможете это сделать только для исходящих пакетов, поскольку вы не знаете, какой UID имеет пользователь другой системы, тем более, что информация об этом не передается по протоколу TCP.

    Аналогично вы можете ограничивать исходящие пакеты группы или процесса:

    iptables -A OUTPUT -m owner -gid-owner 0

    iptables -A OUTPUT -m owner -pid-owner 78

    Пакетный фильтр IPTables обладает значительно большими возможностями по сравнению с IPChains, но на практике вы вряд ли будете их использовать: в основном используются возможности IPChains, описанные в п. 14.1…14.4.








    Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх