 |
|
|
|
Здесь вы можете посмотреть ссылки других пользователей, а так же создать свою базу адресов/ссылок интересных для вас ресурсов интернета, если зарегестрируетесь.
|
|
|
|
Каталог
|
|
|
 |
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 --> Информация
можно хранить свои линки и смотреть остальные