Перейти на первую страницу сайта
Перейти на первую страницу сайта
Здесь вы можете посмотреть ссылки других пользователей, а так же создать свою базу адресов/ссылок интересных для вас ресурсов интернета, если зарегестрируетесь.
  Показывать по:   категориям
алфавиту
Каталог
ISP-serv : вводная часть по сетевым програмным пакетам iptables и iproute2
на Linux ( Fedora Core 3) ядро 2.6.12.5


АНОТАЦИЯ
Ознакомление начинающих Linux пользователей с програмными пакетами для обработки пакетов и управления трафиком. Знания в этой области позволяют создавать firewall, выводить локальную сеть в интернет через один реальный IP-адрес, ограничивать приоритет паразитного трафика, повышать скорость WEB-серфинга для пользователей локальной сети с невысокой скоростью интернета и многому другое.



ИСПОЛЬЗУЕМЫЕ ПРОГРАМНЫЕ ПРОДУКТЫ:
  • полигон для испытаний: установленный в прошлой статье ISP-serv
  • Fedora Core 3
  • kernel 2.6.12.5
  • iptables
  • iproute2


  • КЛЮЧЕВЫЕ СЛОВА: минимальное ядро Linux, Fedora Core 3, FC-3, tc, iptables, iptraf, iftop, iproute2, Layer 7

    ПОЛЕЗНЫЕ РЕСУРСЫ ИНТЕРНЕТА:
    www.dzti.edu.lv/links/min-kern-2.6.php
    www.dzti.edu.lv/links/ISP-server-setup.php
    http://security.h12.ru/docs/unix/nastroika_firewalla_iptables.htm
    http://www.opennet.ru/docs/RUS/iptables
    http://www.linux.org.ru/books/HOWTO/packet-filtering-HOWTO.html#toc10
    http://gazette.linux.ru.net/rus/articles/lnx_dos.html
    http://www.nestor.minsk.by/sr/2003/12/31208.html
    http://l7-filter.sourceforge.net/L7-HOWTO-Netfilter
    http://iptraf.seul.org/index.html
    http://www.ex-parrot.com/~pdw/iftop/


    ВСТУПЛЕНИЕ
    Начну с небольшого кусочка своей биографии, когда я в первые установил Linux. Причины по которой установил Linux было две, одна из любопытства, а другая создание WEB-сайта для игры в шахматы онлайн. Наверно не секрет, что Linux популярен не как десктоп система, а как операционная система которая используется для работы WEB-сайтов. А раз так, то серверная часть шахматы онлайн должна работать под Linux. Раз надо програмировать под Linux, то следовательно стала необходимость установки Linux как десктопа, с этого момента появилось ряд проблем, таких как обезопасить Linux-десктоп от хакеров из интернета, как дать второму компьютеру (подключенному к Linux-десктопу) интернет. Сейчас одной из моих задач стало обеспечить общежитие интернетом.

    Вспоминая полученный опыт работы с Linux можно отметить две вещи:
  • большинтсво статей по Linux крайне узкоспециализированны, что не позволяет создать общего представления. Например я до не давнего времени думал что iptables может помочь во всем что касается фильтрации пакетов и даже ограничения скорости;
  • во всяких рода руководствах (howto iptables, iproute2, и так далее) информации написана без акцентов да и так много, что попросту утомляет.
    В большинтсве случаев, начинающий пользователь Linux немного знает об iptables, например как с помощью iptables создать firewall (огненную стену). Главная цель firewall это ограничения доступа к Вашему компьютеру из внешней сети. Однако утверждение что iptables это firewall под Linux неправильно! iptables позволяет не только создать firewall, с его помощью можно сделать NAT-сервер (позволяет локальную сеть выводить в интернет), маркировать пакеты в пределах компьютера, изменять поля в пакетах и многое другое. Важно отметить что с помощью iptables нельзя ограничивать скорость трафика, этой задачей занимается iproute2.

    Сориентируем начинающего пользоваетля какой програмный пакет используются для работы с пакетами, а какой для управления трафиком:
    iptables предназначен для оработки пакетов, под словом обработка понимается такие задачи как фильтрование пакетов, создание firewall, NAT-сервера, маркировка пакетов и так далее.
    iproute2 используется для упраления трафиком. Управление трафиком это ограничение скоростей, задание алгоритмов обработки пакетов в зависимости от их приоритетов. Для управения трафиком в большинстве случаев iproute2 использует маркировку пакета которая была сделана iptables.

    Для управления трафиком с помощью iproute2 используется команда tc, а для обработки пакетов с помощью iptables - команда iptables.


    КРАТКИЙ ОБЗОР iptables С ПРАКТИЧЕСКОЙ ТОЧКИ ЗРЕНИЯ

    Прежде чем использовать iptables необходимо иметь ясное представление о том, через какие этапы обработки проходит пакет. Поскольку Linux есть UNIX-овая системая в ней изначально заложены возможности работы не только как десктопа, но и как сетевого сервера. В задачи сервера входит обработка трех типов пакетов:
    INTERNET --> Программа работающая на компьютере
    Программа работающая на компьютере --> INTERNET
    INTERNET <--> Локальная вычислительная сеть транзитные пакеты

    Для эффективной обработки пакетов в iptables выделено три основных этапа обработки. Этапом обработки в iptables называется чепочки. В iptables есть три основных цепочки:
    INPUT правила для входящих пакетов.
    OUTPUT правила для исодящих пакетов.от локальных процессов
    FORWARD правила для транзитных пакетов

    Рекомендую подробнее ознакомиться с прохождением пакетов написанным в "Руководство по iptables (Iptables Tutorial 1.1.19)" раздел Порядок прохождения таблиц и цепочек обратите внимание на таблицу mangle! Таблица mangle используется для маркировки пакетов, маркировка пакет в дальнейшем используется для управления трафиком с помощью програмного пакета ipraoute2.

    В каждую из этих трех цепочек можно добавлять свои команды фильтрации. Есть следующие команды фильтрации:
    DROP (уничтожить пакет), REJECT (уничтожить пакет и послать сообщение источнику об этом), ACCEPT (пакет принимается прародительской цепочкой (INPUT,OUTPUT или FORWARD) и прекращает прохождения по всем цепочкам у которых прародителем является одна из основных цепочек: INPUT,OUTPUT или FORWARD). В каждую из цепочек INPUT,OUTPUT или FORWARD можно добавить свою цепочку переход на которую будет при выполнение опреленных параметров пакета (таких как адрес источника, порт и так далее). Для возврата из своей цепочки в родительскую используется команда RETURN.

    Применим полученные знания на практике, из предыдущей статьи
    http://www.dzti.edu.lv/links/ISP-server-setup.php
    были собраны из исходников програмные пакеты iptables и iptroure2. Поэтому для использования iptables, который был установлен нами, введем переменную ipt которая является полным путем к программе iptables.

    # ipt=/ISP-serv/iptables/usr/local/sbin/iptables

    Теперь для работы с iptables достаточно использовать ipt, например, для вывода информации о правилах теперь надо выполнить команду:

    # $ipt -L

    Для вывода более подробной информации о том сколько пакетов/байт прошло через правила в цепочках:

    # $ipt -L -n -v

    А для вывода информации о маркировке пакетов, которая хранится в таблице mangle, выполните команду:

    # $ipt -L -n -v -t mangle

    Однако для получения текущей информации о приходящих/исходящих пакетах необходимо использования утилиты tcpdump, например чтобы посмотреть прохождение пакетов в сети, к которой вы подключены через сетевой интрефей eth0 выполните следующую команду:

    # tcpdump -i eth0

    tcpdump настолько популярная утилита, что даже герои "матрицы" воспользовались ей :)

    Данная утилита также используется для отслеживания атак, более подробно об этом написано в:
    http://gazette.linux.ru.net/rus/articles/lnx_dos.html

    Если же ваша цель разобраться с тем что происходит на Вашем Linux { роутере, gateway, NAT-сервере } пригодятся следующие примеры использования tcpdump:

    Для вывода информации о пакетах связанных например с адресом 10.10.10.51
    # tcpdump -i eth1 host 10.10.10.51

    Для вывода информации о пакетах принадлежащих udp протоколу (это полезно если Ваша сеть тормозит, так как многие зараженные вирусами компьютеры, например студентов из общаги, посылают много маленьких udp пакетов):
    # tcpdump -i eth1 udp

    или более сложной командой, для выделения udp пакетов принадлежащихнапример адресу 10.10.10.46
    # tcpdump -i eth1 udp and host 10.10.10.46

    Полезным также бывает команда отслеживающая udp пакеты исходящие с указанного адреса, например:
    # tcpdump -i eth1 src 10.10.10.46 and udp

    Подробнее с синтаксисом tcpdump можно ознакомится:
    http://www.securitylab.ru/analytics/216362.php

    В качестве тренировки, запретим доступ из вне к нащему компютеру.
    ВНИМАНИЕ всегда произвоите конфигурацию fireewall на том же компьютере, ну а если вы удаленно этим будуту загиматься, то может так случиться что firewall просто не даст вам удаленного соединения.

    Первое что приходит на ум это написание правила, которое в цепочки INPUT уничтожает все пакеты, ради интереса попробуйте выполнить команду:

    $ipt -A INPUT -i eth1 -j DROP

    Кратенько по синтуксису:
    "-A INPUT" добавляет команду фильтрации в цепочку INPUT, команда фильтрации в данном примере DROP (уничтожение пакета)
    "-i eth1" условие которое которое выполняется для всех пакетов приходящих для входного сетевого интерфейса eth1
    а теперь попробуйте посмотреть интернет сайт, не получается, поскольку Ваш компьютер будет настолько защищен, что Все пакеты приходящие от запрашиваемого сайта уничтожатся!

    Поэтому самое время вернуться к начальному состоянию iptables, так и есть очистить все правила iptables командой:

    $ipt -F

    На основе приведенного неудачного эксперимента можно сделать вывод, что надо уничтожать не все приходящие пакеты, а только те которые не былы связаны с ответами на запросы исходившеми с Вашего компьютера. Для этих целей в iptables каждому пакету присвается информация о его состояние, всего их может быть: NEW, RELATED, ESTABLISHED, INVALID интуитивный смысл которых понятен.

    Для того чтобы обезопасить свой Десктоп компьютер, от вторжения из интернета, достаточно (на первых порах) принимать только пакеты, состояние которых RELATED, ESTABLISHED:

    $ipt -A INPUT -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

    Кратенько по синтуксису:
    " -m state" делает возможным работу с модулем iptables: state
    "--state RELATED,ESTABLISHED" критерии удовлетворящими состоянию пакета RELATED,ESTABLISHED

    Пока ограничемся этими знаниями по iptables, более сложные правила будут расматриваться в следующей статье, где будет рассмотрена реальная конфигурация ISP-serv для разграничения трафика по странам, управлением трафиком и так далее.



    КРАТКИЙ ОБЗОР iproute2 С ПРАКТИЧЕСКОЙ ТОЧКИ ЗРЕНИЯ

    Под управление трафиком подразумевает не только ограничение скорости, но и разделения трафика на классы. Например, в ISP-serv у нас будут отделные классы трафика для пакетов подтверждения, разрыва соединения, http протокола, DC++, Bittorrent, smtp, pop3, ftp, ssh и так далее. Разделения трафика необходимо когда канал имеет маленькую пропускную способность, а в локаольной сети есть пользователи которые качают фильмы, в этом случае надо чтобы трафик относящийся к WEB-серфингу имел приоритет над трафиком пиринговых программ.

    iproute2 позволяет управлять трафиком только на исходящих интерфесах, так например для приведенной ниже схемы
    INTERNET <----> eth0 <----> eth1 <----> ЛВС
    1. Ограничение [download] ЛВС путем ограничения исходящих в ЛВС пакетов, eth1
    2. Ограничение [upload ] ЛВС путем ограничения исходящих в INTERNET пакетов, eth0

    Если же надо только ограничить скорость пакетов, без классификации трафика, то можно ограничивать скорость приходящего (ingress) трафика.

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

    Для того чтобы узнать скорость тарфика пользователей ЛВС, сидящей на сетевом интерфейсе eth1, выполним следующую команду:

    # iftop -B -i eth1

    Для того чтобыувидеть полную картину с какой IP-адрес, например 10.10.10.46, обменивается пакетами, выполним следующую команду:

    # iftop -B -i eth1 -f "host 10.10.10.46"

    Более подробно о выводимой на экран информацией iftop можно ознукомится по:
    http://www.ex-parrot.com/~pdw/iftop/

    Однако использование iftop не позволяет получит информацию распределения скорости по протоколам, портам и так далее. Для этих целей используют утилиту iptraf. iptraf позволяет узнать с какой скоростью по каким протоколам и портам распределен трафик. Для запуска iptraf просто наберите команду:

    # iptraf

    Более подробно о iptraf можно ознукомится по:
    http://iptraf.seul.org/index.html

    Поскольку есть отличное описание по управлению трафиком
    http://www.nestor.minsk.by/sr/2003/12/31208.html
    далее будут рассмотрены практические аспекты.

    Так же как и в случае с iptables введем переменную ipr, которая содержит полный путь к программе tc:
    # ipr=/ISP-serv/iproute2/usr/sbin/tc

    Для того чтобы узнать по какому алгоритму посылаются пакеты с сетевого интрфейса eth1 наберите команду:

    # $ipr -s class show dev eth0

    из вывода этой команды можно сделать вывод, что все исходящие пакеты с сетевого интерфейса eth1 отправляются по алгоритму FIFO. Согласно этому алгоритму все пакеты стоят в общей очереди, и соотвтествеено при скачивание большого файла одним из пользователем локальной сети, интернет у других пользователей притормаживает. В данном примере c eth1 уходит большое количество пакетов для пользователя скачивающего большой файл, а другие пакеты дожидаются когда подойдет к ним очередь.

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

    Решение данной проблемы заключается в:
  • смене алгоритма отправки исходящих пакетов с интерфейсов (например для каждого IP-адреса создается своя очередь);
  • ограничение скорости и понижения приоритета пакетов относящихся к большому файлу.


    Для этого надо выделить отдельный класс обслуживающй подобного рода трафика. Трафик больших файлов как правило принадлежит пиринговым сетям, таким как edonkey, bittorrent, dc++, и т.д.). Выделить подобного рода трафика (edonkey, bittorrent, dc++ и т.д.) можно с помщью iptables с использованием модуля layer7. Layer-7 для классификации трафика использует первые три пакета установки соединения, а не порты (в ряде пиринговых сетей специально используются нефиксированные порты).

    В качестве наглядного практического примера рассмотрим решение следующей ситуции:

    1. Имеется ЛВС (общежитие) из пользователей качающих через пиринговые сети большой объем трафика;
    2. Сеть имеет структуру: INTERNET <----> eth0 <--[ISP-serv] --> eth1 <----> ЛВС
    3. ЛВС имеет сеть: 10.10.10.0/24, с GATEWAY: 10.10.10.8
    3. Реальный алрес ISP-serv хxх.хxх.хxх.gw
    4. Требуется:
  • чтобы связь ISP-serv с IP-адресом админа имела наивысший приоритет (иначе при высокой загрузке сети можно не получить удовлетворительной скорости работы с удаленным терминалом);
  • http трафик имел приоритет над ftp, bittorrent, dc++, и т.д.
  • bittorrent, dc++ низкий приоритет, а при желание полностью блокировать bittorrent, dc++
  • весь остальной трафик

    Для краткости ниже приводится содержание скрипта по решению поставленной задачи:

    --------------------------------------------------------------------------------------------------
    #!/bin/sh
    
    # разрешаем форвардинг
    # o0oxid : 
    # Вот еще небольшая неточность.
    # ip_forward -  This variable is special, its change -= resets all configuration parameters =- to their default state (RFC1122 for hosts, RFC1812 for routers)
    # У автора стоит имзенение этого параметра почему-то в конце скрипта, 
    # .т.е. все настройки /proc/sys/net/ipv4/ сбросятся в дефолт, надо бы эту команду переместить в самое начало скрипта
    echo "1" > /proc/sys/net/ipv4/ip_forward
    
    
    ipt=/ISP-serv/iptables/usr/local/sbin/iptables
    ipr=/ISP-serv/iproute2/usr/sbin/tc
    
    touch /var/lock/subsys/local
    
    # защита от syncflood-a
    $ipt -A FORWARD -p tcp --syn -m limit --limit 15/minute -j ACCEPT
    
    # активация TCP SYN Cookie Protection
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    
    # отключение IP Source Routing
    echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
    
    # отключение ICMP Redirect
    echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
    
    # активация IP Spoofing Protection
    echo 1 >  /proc/sys/net/ipv4/conf/all/rp_filter
    
    # игнорирование Broadcast Request
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    
    # сообщения о Bad Error Message
    echo 1 >  /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
    
    # защита от скрытого сканирования портов
    $ipt -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST  RST  -m limit --limit 15/minute -j ACCEPT
    
    # реализация NAT-a
    $ipt -t nat -A POSTROUTING -s 10.10.10.0/24 -j SNAT --to-source xxx.xxx.xxx.gw
    
    # Максимум 15 одновременных соединений c  одного IP к eth1 (ЛВС)
    $ipt -A FORWARD -p tcp --syn  -i eth1  -m connlimit --connlimit-above 15 -j  REJECT 
    
    # защита от атак с неправильными пакетами
    $ipt -A INPUT -p tcp --tcp-flags ALL       FIN,URG,PSH           -j DROP
    $ipt -A INPUT -p tcp --tcp-flags ALL       ALL                   -j DROP
    $ipt -A INPUT -p tcp --tcp-flags ALL       SYN,RST,ACK,FIN,URG   -j DROP
    $ipt -A INPUT -p tcp --tcp-flags ALL       NONE                  -j DROP
    $ipt -A INPUT -p tcp --tcp-flags SYN,RST   SYN,RST               -j DROP
    $ipt -A INPUT -p tcp --tcp-flags SYN,FIN   SYN,FIN               -j DROP
    
    # защита от провайдерства интернета
    $ipt -A INPUT -i eth1 -m ttl --ttl-lt 128 -j DROP
    $ipt -A INPUT -i eth1 -m ttl --ttl-gt 128 -j DROP
    
    # блокирование UDP пакетов которые не связаны с DNS
    $ipt -A FORWARD -i eth1 -p UDP -s 0/0 --destination-port ! 53 -j DROP
    $ipt -A FORWARD -i eth0 -p UDP -s 0/0 --source-port ! 53 -j DROP
    $ipt -A INPUT -i eth1 -p UDP -s 0/0 --destination-port ! 53 -j DROP
    $ipt -A INPUT -i eth0 -p UDP -s 0/0 --source-port ! 53 -j DROP
    
    
    # запрет доступа к ssh с лвс
    $ipt -A INPUT -i eth1 -d 10.10.10.8 -p tcp --dport 22 -j DROP
    
    # очистка таблицы mangle
    $ipt -t mangle -F
    
    $ipr qdisc del dev eth0 root &> /dev/null
    $ipr qdisc del dev eth1 root &> /dev/null
    
    # kbps = KByte/sek
    # ограничение скорости канала -----------------------------------------------------------------
    $ipr qdisc add dev eth1 root handle 1: htb default 2
      $ipr qdisc add dev eth0 root handle 1: htb default 2
    $ipr class add dev eth1 parent 1:  classid 1:1  htb rate 200kbps burst 250k
      $ipr class add dev eth0 parent 1:  classid 1:1  htb rate 100kbps burst 250k
    # unclassified --------------------------------------------------------------------------------
    $ipr class add dev eth1 parent 1:1 classid 1:2 htb rate 20kbps ceil 30kbps burst 1k prio 7
      $ipr class add dev eth0 parent 1:1 classid 1:2 htb rate 10kbps ceil 20kbps burst 1k prio 7
    $ipr qdisc add dev eth1 parent 1:2 handle 2:  esfq perturb 10
      $ipr qdisc add dev eth0 parent 1:2 handle 2:  esfq perturb 10
    # web ------------------------------------------------------------------------------------------
    $ipt -t mangle -A POSTROUTING -m layer7 --l7proto http -j MARK --set-mark 3
    $ipr class  add dev eth1 parent 1:1  classid 1:3 htb rate 150kbps ceil 200kbps burst 150k prio 2
      $ipr class  add dev eth0 parent 1:1  classid 1:3 htb rate 70kbps ceil 100kbps burst 150k prio 2
    $ipr qdisc  add dev eth1 parent 1:3  handle 3: esfq perturb 10 hash dst
        # обратите внимание, esfq perturb 10 hash dst --> для распределния очередей по IP-адресам назначения 
      $ipr qdisc  add dev eth0 parent 1:3  handle 3: esfq perturb 10
    $ipr filter add dev eth1 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
      $ipr filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
    # p2p ----------------------------------------------------------------------------------------
    $ipt -t mangle -A POSTROUTING -m layer7 --l7proto bittorrent -j MARK --set-mark 4
    $ipt -t mangle -A POSTROUTING -m layer7 --l7proto directconnect -j MARK --set-mark 4
    $ipr class  add dev eth1 parent 1:1  classid 1:4 htb rate 10kbps ceil 20kbps burst 1k prio 3
      $ipr class  add dev eth0 parent 1:1  classid 1:4 htb rate 5kbps ceil 10kbps burst 1k prio 3
    $ipr qdisc  add dev eth1 parent 1:4  handle 4: esfq perturb 10 
      $ipr qdisc  add dev eth0 parent 1:4  handle 4: esfq perturb 10
    $ipr filter add dev eth1 protocol ip parent 1:0 prio 1 handle 4 fw flowid 1:4
      $ipr filter add dev eth0 protocol ip parent 1:0 prio 1 handle 4 fw flowid 1:4
    # ADMIN <--> xxx.xxx.xxx.gw ------------------------------------------------------------------------
    $ipt -t mangle -A OUTPUT -d xxx.xxx.xxx.adm1 -j MARK --set-mark 5
    $ipt -t mangle -A OUTPUT -d xxx.xxx.xxx.adm2 -j MARK --set-mark 5
    $ipr class add dev eth0 parent 1:1  classid 1:5 htb rate 30kbps burst 15k prio 1
      $ipr qdisc  add dev eth0 parent 1:5  handle 5: sfq perturb 100
      $ipr filter add dev eth0 protocol ip parent 1:0 prio 1 handle 5 fw flowid 1:5
    # ------------------------------------------------------------------------------
    
    --------------------------------------------------------------------------------------------------
    


    Важно иметь представления о том как укзанный команды скрипта работают, для этого
    1. Проверьте как промаркировались пакеты, команда:
       # $ipt -L -n -v -t mangle
    2. Проверьте счетчик прошедших пакетов по классам:
       # $ipr -s class show dev eth1
       # $ipr -s class show dev eth0


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


    Обсуждение в форуме на www.opennet.ru


    Andrejs Spunītis: spunitis AT one.lv
    23 август, 2005 год.

    www.top.lv --> Информация
    можно хранить свои линки и смотреть остальные

    Top.LV