В статье (http://www.dzti.edu.lv/isp-serv/index.php?l=3) представлено комплексное решение задачи управления трафиком, используя Linux, iptables, iproute2, esfq, layer-7, geoip.
Рассмотрены вопросы разделения трафика на местный и зарубежный, ограничения скачивания больших файлов, равномерного разделения полосы между IP-адресами, блокирования трафика bittorrent, edonkey, dc++ и т.д.URL: http://www.dzti.edu.lv/isp-serv/index.php?l=3
Новость: http://www.opennet.me/opennews/art.shtml?num=6977
Давно искал подобное на русском.
Молодец, так держать !
А смысл делить по geoip если провайдер делит по bgp. Может быть в Латвии у всех анлим, то сдесь приходится считать каждый мегабайт и быть уверенным что пиринговый траф. не пойдет через бугор. Статья - так себе, прочитал и сделал по своему. Тут другая задача есть список сетей (локальный траф ~1200 сетей класса /22 - /23, провайдер отдает в виде файла (обновляется каждые 10 минут)). На провайдера есть канал по которому идет и локал траф и бугор. Задача как красиво зашейпить к примеру 1мбит локал траф. и 256 бугор, чтобы не плодить туеву кучу правил в фаерволе (маркирование пакетов идущих/уходящих с/на сети из списка ~1200 и последующим заворачиванием их в нужный класс) ?
например, сменить ОС, которая поддерживает фильтр PF - красиво зашейпить все что надо...
Быстрым решением, как мне кажется, может быть создание своей
GeoIPCountryWhois.csv в принципе её вид протой, наример:"222.166.0.0","222.167.255.255","3735420928","3735551999","HK","Hong Kong"
"222.168.0.0","222.223.255.255","3735552000","3739222015","CN","China"
...................................только вместо IP-адресов поставить провайдерские на зарубежку.
В написанной статье, главный уклон не был сделан на "ДЕЛАЙ КАК Я",
а были приведены QuickStart по iptables, geoip, iproute2, layer-7
которые помогут _начинающему_ админимтратору реализовывать свои задачи.Если Михаилу материал помог быстро овладеть выше перечисленным и сделать
на этой основе по своему, то я полагаю, что цель статьи достигнута.
Решение проблемы крайне тривиальное,По адресу:
http://www.dzti.edu.lv/isp-serv/index.php?l=5выложил исходники к написанной пограмме, которая на основание файла
содержащего местные сети сгененирует файл CVS, который в дальнейшем
можно использовать для создания файлов geoipdb.idx и geoipdb.bin,
которые используются geoIP.Тем самым geoIP позволяет уменьшить список правил в iptables.
Nu ja ispolzuju IMQ a opredeliaju bugor/local po REALM .... i v sootvetstvije s REALM kidaju v nuznij IMQ device ...
А realm'ы для префиксов как задаете?? Может, можно проще, а я патчил zebra'у...
>А realm'ы для префиксов как задаете?? Может, можно проще, а я патчил
>zebra'у...кстати, вот та же идея, но реализовано красивее:
Автору спасибо. И за все остальные статьи тоже.
Хороший и грамотный наор статей.
Автору огромное спасибо.
> Хороший и грамотный набор статей
Спасибо за лестные слова, постараюсь держать в том же духе,
поэтому написал статью:Увеличение скорости загрузки сервера или "Потрошим загрузочные скрипты Fedora Core 4"
http://www.dzti.edu.lv/isp-serv/index.php?l=6
В которой продолжается тема создания сервера для ISP (internet service provides), только теперь под прицелом оказались загрузочные скрипты Fedora Core 4.
с появлением модуля CLASSIFY предлагаю отказаться от фильтров в tc
Может и можно, но в первую очередь я не уверен что CLASSIFY
имеет теже потенциалньные возможности что и filter:
1) создание приоритетов для пакетов принадлежащих одному классу (prio 1), для
рассматриваемого в статье случая это очень важно, поскольку например внутри трафика
принадлежащего HTTP, есть скачка фильмов, а серфинг будет тормозить, не говоря о DNS
пакетах. Команда:
./ipr filter add dev $DEV_LAN protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:10
2) указание скорости (rate 32000bps) для принятия решения (дропаться или приниматься)
3) Минимальный размер обрабатываемого объекта (mpu)
4) Размер буфера пакетов (burst)А CLASSIFY имеет ту же функциональность ?
Здравствуйте!Я, возможно, не совсем корректно выразился, конечно же 100% CLASSIFY фильтры не заменит, хотя бы потому, что CLASSIFY ограничен возможностями iptables. Но в 60% случаев без фильтров можно обойтись, и результат будет не хуже, но нагляднее и проще для понимания. Тем более, что CLASSIFY не нужно ставить отдельно, как p-2-p модули.
PS: А вообще, статьи супер, Thnx! Когда n лет назад разбирался с tc, из доки были только LARTC и the source is best documentation :((
не линуксоид но цикл почитал. неплохо, доходчиво. с некоторыми моментами я бы поспорил, но в виду невысокой продвинутости в линуксе отнесу на свою неграмотность :)
# защита от провайдерства интернета
$ipt -A INPUT -i eth1 -m ttl --ttl-lt 128 -j DROP
$ipt -A INPUT -i eth1 -m ttl --ttl-gt 128 -j DROP
есть модуль который меняет TTL :)
PS а если человек честно использует ОС не видновс? 128 ?
этот вопрос уже поднимался в форуме для первой части
статьи: http://www.opennet.me/opennews/art.shtml?num=5994в форуме отведенной для обсуждения второй части статьи,
это вопрос не поднимался, так как такой проверки нету, смотри:
http://www.dzti.edu.lv/isp-serv/index.php?l=3#firewall
>echo "Attach qdisc: esfq to class id: 10 for WAN"
>./ipr qdisc add dev eth1 parent 1:0 handle 10 esfq perturb 5 hash dstс 1го компа 100 сессий на 100 ip
со 2го 1 сессия
1:100 это равномерное разделение полосы ?
Полоса делится между IP адресами, вне зависимости от того
сколько сессий с IP. Приведенный Вами пример это по сути дело
то что реализует SFQ (станлдартное поставляемое с дистрибутивом)
а в статье рассматривается ESFQ. В статье приведен хороший ресурс
по теории управления трафиком
Теория iproute2 изложена в статье "повесть о Linux и управлении трафиком" по адресу:
http://www.nestor.minsk.by/sr/2003/12/31208.html
В статье для исходящего трафика рассматривается ESFQ с "hash dst" !
с 1го компа 100 сессий на ip1
со 2го 1 сессия на ip0
50/50 окс 1го компа 100 сессий на ip1,ip2,ip3...ip100
со 2го 1 сессия на ip0
100/1 ?для исходящего трафика нужно использовать "hash src".
если NAT, то через псевдо-интерфейс IMQ
http://www.linuximq.net/
http://wiki.nix.hu/cgi-bin/twiki/view/IMQ/ImqFaq#Can_I_chang...
ip link set imq0 up
iptables -t mangle -A POSTROUTING -o eth1 -j IMQ --todev 0
DEV_WAN=imq0
tc qdisc add dev $DEV_WAN root handle 1:0 htb default 50
....
tc qdisc add dev $DEV_WAN parent 1:40 esfq perturb 5 hash src
...
Да Вы правы!надо ограничивать по сути дела входной трафик который поступает
из ЛВС на NAT-сервер по hash src. Но поскольку где в инете
промелькнула заметка что IMQ не совсем хорошо может дружить с последними
ядрами, то упростил слегка задачу.Вообще в найденных в инете скриптах иногда можно увидеть
что делают hash src, но при случае NAT получается src один
на кучу пользователей.Из практикического применения предлагаемый в статье подход
срабатывает, по всей видимости из за того что в основном качают внутрь
ЛВС а не наоборот (поскольку использование NAT всетаки накладывает
ограничения на upload).
Спасибо
постараюст проверить на практике, и если все сработает,
то обновлю материал в статьеЗЫ
а этого вопроса я давно ожидал :) молодец!
Простое человеческое спасибо!
Можно коментарий по "firewall & защита от смены IP" ?Скрипт с awk что делает ?
Как должна выглядить ips.cfg и ip-mac-tab ?с уважением
Разрешение IP-MAC
ips.cfg, запрещаем все, за исключением
!10.10.10.8@00:50:BA:49:B9:42
!10.10.10.7@00:01:A4:49:19:34
!10.10.10.23@00:03:42:43:11:31
и так далее
ip-mac-tab
Объяснения есть в статье "Привязка IP к MAC адресу"
http://www.opennet.me/tips/info/750.shtmlтам не работает
# обнуляем всю таблицу arp
arp -ad > nullпоэтому очищаем таблицу awk скриптом
for i in `awk -F ' ' '{ if ( $1 ~ /[0-9{1,3}].[0-9{1,3}].[0-9{1,3}].[0-9{1,3}]/ ) print $1 }' /proc/net/arp` ; do arp -d $i ; doneи вместо предлагаемого в статье "Привязка IP к MAC адресу"
while [ $I -le 254 ]
do
arp -s 192.168.0.${I} 0:0:0:0:0:0
I=`expr $I + 1`
done
arp -f /etc/ethers.localсоздаем в excell
arp -s 10.10.10.1 0:0:0:0:0:0
arp -s 10.10.10.2 0:0:0:0:0:0
.....
# arp -s 10.10.10.8 00:40:A1:43:B4:49
.....
arp -s 10.10.10.9 00:D0:B7:3B:27:78
arp -s 10.10.10.10 00:00:00:00:00:00
.....
Спасибо.Я правильно понимаю - надо потом каждого пользователя
вручную прописывать и в ip-mac-tab и в ips.cfg ?
Абсолютно верно,
только в скрипте ip-mac-tab всем свободным ip присвоен мак 00:00:00:....А в ips.cfg надо для каждого пользователя сделать запись.
Насколько я разобрался, подобная реализация на уровне arp просто облегчит загрузку сервера, хотя можно и в iptables было лы прописать все существующие маки пользователей, но сам по себе iptables изначально создавался для протокола tcp/ip
В принципе можно обойтись только ip-sentinel, поскольку она раньше всех перехватывает незарегестрированный ip-mac.
Утарнена ошибка в скрипте
Срипт маркировки пакетов
mark-isp.sh
http://www.dzti.edu.lv/isp-serv/index.php?l=3#qs_markschemaДля трафика P2P метка пакетов не соответсвовала схеме а так же
не соответсвовала правлиам фильтрам.
Скажите, а можно каким-то средством посмотреть сколько какому пользователю выделено полосы?
Простите, уже нашел прочитав предыдущую часть Вашей статьи.Вы на форуме задавали вопрос как прикрутить connbytes к новым ядрам, ответа не получили, но все равно используете этот модуль в вашей статье. Значит Вы нашли решение? Тогда почему бы не упомянуть о нем в статье. Пришлось самому разбираться, случайно наткнулся на http://patchwork.netfilter.org/netfilter-devel/patch.pl?id=3482
который фиксит проблему.Хочу задать вопрос по Layer-7. Вы проверяли насколько точно он классифицирует траффик, в особенности FTP. По моим наблюдениям ужасно:
http://www.opennet.me/openforum/vsluhforumID1/68420.htmlХочу выразить огромную благодарность за статью. К сожалению, когда я начинал свое знакомство с линукс ее не было под рукой, так что приходилось самому догадываться о многом. Пожалуй, по теме настройки интернет-шлюза она лучшая в РУ-нете (еще бы тему сквида упомянуть не мешало...).
Насколько я понял, в статье серьёзная ошибка связанная с тем предположением, что приоритет фильтров как-то влияет на приоритет трафика. На самом деле приоритет фильтров для того, чтобы делать, например, такие вещи при фильтрации пакетов:tc filter add dev eth1 parent 1 protocol ip prio 0 handle 1 fw flowid 1:1
tc filter add dev eth1 parent 1 protocol ip prio 0 handle 2 fw flowid 1:1
tc filter add dev eth1 parent 1 protocol ip prio 1 u32 match ip src 0.0.0.0/0 flowid 1:2Если я не прав, поправьте.
Начну по порядку:
>Вы на форуме задавали вопрос как прикрутить connbytes к
> новым ядрам, ответа не получили, но все равно используете этот модуль в вашей статье.
с выходом нового ядра, и использованием указанных пакетов
> Значит Вы нашли решение?
проблема connbytes сама собой решилась, в указанных пакетах ошибка это была исправлена,
именно это меня и сподвигло на обновление материалла
(ни какого утаивания информации не было, не мой стиль)>Насколько я понял, в статье серьёзная ошибка связанная с тем
>предположением, что приоритет фильтров как-то влияет на приоритет трафика.
>На самом деле приоритет фильтров для того, чтобы делать, например,
> такие вещи при фильтрации пакетов:
пример указанный Вами с одинаковым приоиритетом пакеты с меткой 1 и 2
направляет классу 1:1 что собственно и верно,
а пакеты у которых src 0.0.0.0/0 в класс 1:2А легче всего самому убедиться, назначьте классу
маленькую скорость, сделайте 2 фильтра, одному prio 0, другому prio 1
и проверьте кто у кого кислород отбирает.Давно дело было, боюсь соврать, но ошибки нету, да и эксперимент
тоже кажется это подтвердил... поскольку когда трафик DNS был низким, инет тормозил
в класс попадает трафик, на основание работы фильтров, теперь допустим что несколько
фильтров направляют свой трафик в один класс, возникает вопрос с какого фильтра трафик
в указанном классе имеет выше приоритет?
вот для этого и нужно указать prio для фильтра> Скажите, а можно каким-то средством посмотреть
> сколько какому пользователю выделено полосы?
в приведенной конфигурации пользователь не ограничен скоростью, поэтому если
нет других качков то он получает максимальную скоростьА для удобства отслеживания текущей скорости использую
iftop -B -i eth0
iftop -B -i eth0 -f "host 10.10.10.xxx"также написал скриптик с AWK который дает более наглядную
картину скоростей и тому подобнее (ниже приведены скрипты)например
root@ISP ISP-serv]# ./rate.sh****************************************************
* Statistic for incoming trafic's rate KByte/sek *
****************************************************TRAFFIC-TYPE RATE MIN-RATE MAX-RATE
---------------------------------------------------------
ALL : lv+nlv 121
LV : http 0 307 409
NLV : other 5 5 37
LV : ftpmail 0 49 99
LV : skype 0 74 256
LV : p2p 52 49 460
LV : other 0 24 460
NLV : http 1 74 99
NLV : ftpmail 0 11 24
NLV : skype 0 18 62
NLV : p2p 17 11 24
--------------------------------------------------------
Local : 52
Foreign : 24
--------------------------------------------------------
[root@ISP ISP-serv]# cat rate.sh
#!/bin/bash
cd /ISP-serv
./ipr -s -d class show dev eth1 > rate.txt
awk -f rate.awk rate.txt
[root@ISP ISP-serv]# cat rate.awk
function getKBps( rate )
{
suffix_Kbit = index( rate, "Kbit");
suffix_bit = index( rate, "bit");
KBps = 8;
if ( suffix_Kbit > 0 )
{
KBps = KBps;
suffix = suffix_Kbit;
}
else if ( suffix_bit > 0 )
{
KBps = KBps*1024;
suffix = suffix_bit;
}rate_val = substr( rate, 0, suffix );
rate_val = rate_val / KBps;return rate_val;
}BEGIN {
print "";
print " ****************************************************";
print " * Statistic for incoming trafic's rate KByte/sek *";
print " ****************************************************";
print"";
N=0; NLV=0; LV=0;
traffic ["1:1"] = "ALL : lv+nlv \t";
traffic ["1:10"] = "LV : http \t";
traffic ["1:20"] = "LV : ftpmail\t";
traffic ["1:30"] = "LV : skype \t";
traffic ["1:40"] = "LV : p2p \t";
traffic ["1:50"] = "LV : other \t";traffic ["1:60" ] = "NLV : http \t";
traffic ["1:70" ] = "NLV : ftpmail\t";
traffic ["1:80" ] = "NLV : skype \t";
traffic ["1:90"] = "NLV : p2p \t";
traffic ["1:100"] = "NLV : other \t";
}/class/ { class[N] =$3; str_min_rate[N] =$13; str_max_rate[N] =$15; }
/^ rate/ { str_rate[N]=$2; N=N+1; }
END {
printf( " TRAFFIC-TYPE \t RATE \t MIN-RATE MAX-RATE \n" );
print "---------------------------------------------------------";for ( i=0; i < N; ++i )
{
name = traffic[ class[i] ];
rate = str_rate[i];
min_rate = str_min_rate[i];
max_rate = str_max_rate[i];min_rate_val = getKBps( min_rate );
max_rate_val = getKBps( max_rate );
rate_val = getKBps( rate );if ( class[i] == "1:10" ||
class[i] == "1:20" ||
class[i] == "1:30" ||
class[i] == "1:40" ||
class[i] == "1:50" )
{
LV = LV + rate_val;
}
else if ( class[i] != "1:1" )
{
NLV = NLV + rate_val;
}if ( class[i] == "1:1" )
{
printf ( " %s %d \t \n", name, rate_val );
}
else
{
printf ( " %s %d \t %d \t %d \n", name, rate_val, min_rate_val, max_rate_val );
}
}print "--------------------------------------------------------";
printf ( "\tLocal : %d \n", LV );
printf ( "\tForeign : %d \n", NLV );
print "--------------------------------------------------------";
}ЗЫ
Если Вы заинтересованы в управление трафиком, то предлагаю вам
посмотреть статью
http://www.dzti.edu.lv/isp-serv/index.php?l=7возмолжно вместе скооперироваться, и сделать дистр типа LFS
только ориентированный на управление трафиком.А у Вас не возникла задача управления трафиком который шифруется poptop-serv
для Ваших клиентов (избежать подмены ip-mac)?
>с выходом нового ядра, и использованием указанных пакетов
>проблема connbytes сама собой решилась, в указанных пакетах ошибка это была исправлена,
>
>именно это меня и сподвигло на обновление материалла
>(ни какого утаивания информации не было, не мой стиль)Довольно странно, но с этой проблемой я столкнулся, хотя ядро у меня 2.6.17.9. К тому же по ссылке, которую я привел (http://patchwork.netfilter.org/netfilter-devel/patch.pl?id=3482)фиксится именно моя проблема, так что думаю, я не одинок.
>пример указанный Вами с одинаковым приоиритетом пакеты с меткой 1 и 2
>
>направляет классу 1:1 что собственно и верно,
>а пакеты у которых src 0.0.0.0/0 в класс 1:2Prio в описании фильтрах говорит о приоритетности фильтров, т.е. устанавливает порядок следования одних фильтров за другими (какой фильтр работает за каким).
>а пакеты у которых src 0.0.0.0/0 в класс 1:2
Как вы понимаете такой фильтр означает "любой пакет", но в контексте 2 фильтров с более высоким приоритетом, чем у данного это означает "любой пакет, который не имеет метки 1 или 2.
Чтоб не быть пустословным добавлю ссылку на авторитетный источник, где можете прочесть об этом параметре:
http://gazette.linux.ru.net/rus/articles/lartc/c1452.html
(или оригинал тут http://lartc.org/howto/lartc.adv-filter.html)
Да, я действительно не правильно понял следующую фразу из приведенного Вами документа:prio
Приоритет классификатора. Чем меньше число -- тем выше приоритет.
Уже давно не занимался этой темой, и сейчас признаюсь что мне самому не понятно
следующая ситуация:к примеру у меня есть два класса А и Б
есть два фильтра с одинаковым приоритеотом,
для двух этих фильтров условия фильтрации срабатывают,
тогда непонятно по какому критерию будет принято решение
в какой класс будет направлен пакет???
ЗЫ
Век живи, век учись....
>к примеру у меня есть два класса А и Б
>есть два фильтра с одинаковым приоритеотом,
>для двух этих фильтров условия фильтрации срабатывают,
>тогда непонятно по какому критерию будет принято решение
>в какой класс будет направлен пакет???И сразу же напрашивается встречный вопрос: зачем создавать 2 класса с одинаковым контентом и, если такие классы создаются, то зачем назначать их фильтрам одинаковый приоритет?
Так что вопрос Ваш теоретический скорее. Зависит от того как iproute2 формирует список фильтров с одинаковыми приоритетами (возможно по порядку создания, возможно по алфавиту или по номеру класса - вобщем вариантов много).
Вопрос был чисто теоритическим,а Вам удалсь решить свою проблему по игре в контрол страйк?
>Вопрос был чисто теоритическим,
>
>а Вам удалсь решить свою проблему по игре в контрол страйк?Ну проблема у меня не чисто по КС - моя задача обеспечить приоритетом некоторый трафик, который я раздаю в локальную сеть. КС - просто индикатор достижения цели (возможно, кстати, не очень удачный, так как трафик udp по некоторым мнениям плохо управляется).
Удалось, но роль приоритезации трафика в этом очень мало.
Вообще, возможно, это только моя проблема и у других все будет хорошо. Если интересно, можете почитать http://www.linux.org.ru/view-message.jsp?msgid=1547598
Что-то не могу найти как сохранить настройки после прописывания в tc, ip. Подскажите куда копать?