Страницы: 1 2 3 4 След.
RSS
ТИ + FreeBSD
 
В качестве развития вот этой темы ( https://forum.smart-soft.ru/?PAGE_NAME=read&TID=20386&PN=2 ) публикую решение для связки Трафик Инспектора с FreeBSD в качестве шлюза для серых

пользователей, дабы уйти от кучи проблем, если конечно у вас не 100 пользователей, а намного больше.



Итак, исходные данные:

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

2. Есть ядро сети - ну например коммутатор dlink 3610G или что-то по-проще, на котором валяются шлюзы пользователей и есть роут на 0.0.0.0 - на например 192.168.0.1 - это и есть FreeBSD

машинка, на которой нам надо сделать вкл-выкл пользователям инет ну и порезать скорость в соответствии с тарифом.



Простая схема - юзеры - сети 192.168.2.0/24, 192.168.3.0/24 - на ядре есть интерфейсы 192.168.1.1, 192.168.2.1 - это default gw для этих сетей. Сервер ТИ стоит как 192.168.0.2, Шлюз FreeBSD

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



Как реализована схема:

- юзер авторизуется на ТИ

- на сервере ТИ крутится апач ( или нжинкс, или .... - на выбор ) с поддержкой php.

- скрипт на сервере ТИ в пассивном режиме ( по запросу ) отдаёт массив пользователей шлюзу FreeBSD

- шлюз FreeBSD в цикле опрашивает сервер ТИ на изменение цепочек и корректирует правила файрвола



Время реагирования в моём случае от 2 до 4 секунд в зависимости от нагрузок ( у меня от 700 до 2200 юзеров ходят в инет).

Предупреждаю сразу - все коды, публикуемые в теме - НЕ ГИБКОЕ РЕШЕНИЕ - оно заточено под меня - например определение адресов 172.28... - ограждение попадания в массив реальных IP итд. Это

лишь руководство по рукоблудству!



Итак - поднимаем серверную часть ТИ: всё банально - простейший скрипт, который обращается к API ТИ:



Код
</br><br />&lt;?php</br><br />$APIKEY='вашключ';</br><br />$tinsp=new COM("TrafInsp.TrafInspAdmin");</br><br />$tinsp-&gt;APILogon($APIKEY);</br><br /></br><br />function search_attr_gr($dogovor, $attr){</br><br />&nbsp;&nbsp;&nbsp;&nbsp;global $tinsp;</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$Data=$tinsp-&gt;A PIGetA ttr(2, $dogov or, 24);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$xml = iconv("WINDOWS-1251","UTF-8",$Data);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$xml = simplexml_load_string($xml);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;foreach($xml-&gt;GroupAttrItem as $sku){</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;    if (iconv("UTF-8", "WINDOWS-1251", $sku["AttributeName"])==$attr){</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retur n  iconv("UTF-8", "WINDOWS-1251",$sku);</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;    }</br><br />&nbsp;&nbsp;&nbsp;&nbsp;}</br><br />}</br><br /></br><br />$UserBill=$tinsp-&gt;APIGetBillProp(3,"");</br><br /></br><br />function ListAbonent($id){</br><br />global $UserBill;</br><br />global $GruppBill;</br><br />global $tinsp;</br><br />if($id==1){</br><br />  foreach ($UserBill as $Users){</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$UserGRGuid=$tinsp-&gt;APIGetAttr (3,$Users[1], 7);</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($UserGRGuid!="{ 00000000-0000-0000-0000-000000000000}"  and search_attr_gr($UserGRGuid, "MikAccess")==1){</br><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$UsersAttr[]="".$Users[1]."";</br><br />&nbsp;&nbsp;&nbsp;&nbsp;}</br><br />  }</br><br />  return $UsersAttr;</br><br />} elseif($id==0) {</br><br /></br><br />foreach ($UserBill as $Users){</br><br />  $UserGRGuid=$tinsp-&gt;APIGetAttr (3,$Users[1], 7);</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($UserGRGuid!="{ 00000000-0000-0000-0000-000000000000}" ){</br><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$UsersAttr[]="".$Users[1]."";</br><br />&nbsp;&nbsp;&nbsp;&nbsp;}</br><br />  }</br><br />  return $UsersAttr;</br><br />}</br><br />}</br><br /></br><br />#---------------------------------------------------</br><br /></br><br />foreach(ListAbonent("0") as $k =&gt; $id) {</br><br /></br><br /> $active=$tinsp-&gt;APIGetAttr (3,$id, "User_Active");</br><br /> $ip=$tinsp-&gt;APIGetAttr (3,$id, 2);</br><br /> $speed = $tinsp-&gt;APIGetAttr (3,$id, "User_InBandwidth");</br><br /> $blocked = $tinsp-&gt;APIGetAttr (3,$id, "User_Blocked");</br><br /> $speed = $speed;</br><br /> $part = split("\.", $ip);</br><br /></br><br />if(eregi("172\.28\.", $ip)) {</br><br /> if($part[2] &lt; 10) {</br><br />  $unet = "0".$part[2];</br><br /> } else {</br><br />  $unet = $part[2];</br><br /> }</br><br /></br><br /> if($part[3] &lt; 10) {</br><br />  $uip = "00".$part[3];</br><br /> } elseif($part[3] &lt; 100) {</br><br />  $uip = "0".$part[3];</br><br /> } else {</br><br />  $uip = $part[3];</br><br /> }</br><br /></br><br /> $user_id = "$unet$uip";</br><br /></br><br /> if($user_id &lt; 63999) {</br><br />  print "$user_id\t";</br><br />  print "$active\t";</br><br />  if($blocked=='') $blocked=0;</br><br />  print "$blocked\t";</br><br />  print "$ip\t";</br><br />  print "$speed\n";</br><br /> }</br><br />}</br><br /></br><br />}</br><br />?&gt;</br><br />




Данный скрипт, если его "дёрнуть" со стороннего компа выдаст примерно такое:



Код
</br><br /> 05129&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;   1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;172.28.5 .129&nbsp;&nbsp;&nbsp;&nbsp;0</br> <br /> 07048&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;   1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;172.28.7 .48&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4096</br> <br /> 04186&nbsp;&nbsp;&nbsp;0  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;  1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;172.28.4.186& nbsp;&nbsp;&nbsp;&nbsp;4096</br><br /> 11185&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;    1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;172.28.11.185&n bsp;&nbsp;&nbsp;4096</br><br /> 06152&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;   0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;172.28.6 .152&nbsp;&nbsp;&nbsp;&nbsp;0</br> <br /> 10181&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;   0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;172.28.1 0.181&nbsp;&nbsp;&nbsp;4096</br><br /> 05190&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;   1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;172.28.5 .190&nbsp;&nbsp;&nbsp;&nbsp;4096</br> <br /> 08166&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;    1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;172.28.8.166&nb sp;&nbsp;&nbsp;&nbsp;8192</br><br />




где 0 - это лимитные тарифы - соответственно как считать траф - ваша головная боль, ибо у меня в таких нагрузках даже mirror с порта коммутатора клал ТИ сервер в полку, я на время перехода с

ТИ на "другой биллинг" просто не считаю им сейчас трафик, а режу на 8 мегабит - это будет далее во втором скрипте.



Теперь FreeBSD.



Ставим "голую 7.3". Почему 7.3? А фиг его знает - восьмёрка как-то не прижилась.

Сразу не забываем при установке ставить ветку dev и исходники ядра в /sys.

Я решил использовать во FreeBSD не natd а FIREWALL_NAT - ядерный нат, который естественно быстрее и менее ресурсо-ёмкий. Засим открываем ман по сборке собственного ядра -

https://www.freebsd.org/doc/ru/books/handbook/kernelconfig-bu ilding.html и просто добавляем в ядро следующее:



Код
</br><br />options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IPFIREWALL</br><br />options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IPFIREWALL_VERBOSE</br><br />options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IPFIREWALL_DEFAULT_TO_ACCEPT</br><br />options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IPDIVERT</br><br />options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IPFIREWALL_FORWARD</br><br />options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  DUMMYNET</br><br />options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IPFIREWALL_NAT</br><br />options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  LIBALIAS</br><br />




тут не всё нужно для работы моей схемы, но ибо избежать дальнейших вариаций на тему "решил юзать думинет, а у вас не работает ..." - добавил).

после пересборки ядра и ребута, ставим на фрю php5-cli и обязательно php5-curl - эта библиотека позволит нам обращаться по http в серверу ТИ.



Итак, скрипт запуска всего этого безобразия под FreeBSD ( скрипт шельный - не забудте сделать его +x ):



Код
</br><br />#!/usr/local/bin/php -q</br><br />&lt;?php</br><br /># Все вопросы шлите на dimka.smith(coбака)gmail.com</br><br /># URL скрипта на сервере ТИ</br><br />$ti_url="https://адрес_сервера_ТИ/хитрый_путь/ti.php";</br><br /># Сетевая карта, на которой шейпим скорость</br><br />$real_eth="em0";</br><br />$lim_max="8192"; // максимальная скорость для лимитных планов</br><br /># очищаем все цепочки, шейпер и nat</br><br />exec("ipfw -f flush");</br><br />exec("ipfw -f pipe flush");</br><br />exec("ipfw -f queue flush");</br><br />exec("ipfw -f table all flush");</br><br /># удаляем старые наты - не получилось пофлушить</br><br />exec("ipfw nat 100 delete");</br><br />exec("ipfw nat 101 delete");</br><br />exec("ipfw nat 102 delete");</br><br />exec("ipfw nat 103 delete");</br><br />exec("ipfw nat 104 delete");</br><br />exec("ipfw nat 105 delete");</br><br />exec("ipfw nat 106 delete");</br><br />exec("ipfw nat 107 delete");</br><br />exec("ipfw nat 108 delete");</br><br />exec("ipfw nat 109 delete");</br><br /># one_pass нафиг</br><br />exec("ipfw disable one_pass");</br><br /># включаем нат для пула внешних IP - у меня их столько, сколько тарифов</br><br /># дабы пользователям было комфортно качать с рапид итд. - чем дороже тариф, тем меньше юзеров на реальнике</br><br />exec("ipfw nat 100 config ip 109.197.112.2 log");</br><br />exec("ipfw nat 101 config ip 109.197.112.3 log");</br><br />exec("ipfw nat 102 config ip 109.197.112.4 log");</br><br />exec("ipfw nat 103 config ip 109.197.112.5 log");</br><br />exec("ipfw nat 104 config ip 109.197.112.6 log");</br><br />exec("ipfw nat 105 config ip 109.197.112.7 log");</br><br />exec("ipfw nat 106 config ip 109.197.112.8 log");</br><br />exec("ipfw nat 107 config ip 109.197.112.9 log");</br><br />exec("ipfw nat 108 config ip 109.197.112.10 log");</br><br />exec("ipfw nat 109 config ip 109.197.112.11 log");</br><br />exec("ipfw nat 65000 config ip 109.197.112.12 log");</br><br /># создаём трубы шейпера</br><br />exec("ipfw pipe 100 config bw 128Kbit/s mask dst-ip 0xffffffff");</br><br />exec("ipfw pipe 101 config bw 256Kbit/s mask dst-ip 0xffffffff");</br><br />exec("ipfw pipe 102 config bw 512Kbit/s mask dst-ip 0xffffffff");</br><br />exec("ipfw pipe 103 config bw 1024Kbit/s mask dst-ip 0xffffffff");</br><br />exec("ipfw pipe 104 config bw 2048Kbit/s mask dst-ip 0xffffffff");</br><br />exec("ipfw pipe 105 config bw 3072Kbit/s mask dst-ip 0xffffffff");</br><br />exec("ipfw pipe 106 config bw 4096Kbit/s mask dst-ip 0xffffffff");</br><br />exec("ipfw pipe 107 config bw 8192Kbit/s mask dst-ip 0xffffffff");</br><br />exec("ipfw pipe 108 config bw 12288Kbit/s mask dst-ip 0xffffffff");</br><br />exec("ipfw pipe 109 config bw 16384Kbit/s mask dst-ip 0xffffffff");</br><br /># создаём таблицы для тарифов</br><br />exec("ipfw add pipe 100 ip from table\(100\) to any out");</br><br />exec("ipfw add pipe 100 ip from any to table\(100\) in");</br><br />exec("ipfw add pipe 101 ip from table\(101\) to any out");</br><br />exec("ipfw add pipe 101 ip from any to table\(101\) in");</br><br />exec("ipfw add pipe 102 ip from table\(102\) to any out");</br><br />exec("ipfw add pipe 102 ip from any to table\(102\) in");</br><br />exec("ipfw add pipe 103 ip from table\(103\) to any out");</br><br />exec("ipfw add pipe 103 ip from any to table\(103\) in");</br><br />exec("ipfw add pipe 104 ip from table\(104\) to any out");</br><br />exec("ipfw add pipe 104 ip from any to table\(104\) in");</br><br />exec("ipfw add pipe 105 ip from table\(105\) to any out");</br><br />exec("ipfw add pipe 105 ip from any to table\(105\) in");</br><br />exec("ipfw add pipe 106 ip from table\(106\) to any out");</br><br />exec("ipfw add pipe 106 ip from any to table\(106\) in");</br><br />exec("ipfw add pipe 107 ip from table\(107\) to any out");</br><br />exec("ipfw add pipe 107 ip from any to table\(107\) in");</br><br />exec("ipfw add pipe 108 ip from table\(108\) to any out");</br><br />exec("ipfw add pipe 108 ip from any to table\(108\) in");</br><br />exec("ipfw add pipe 109 ip from table\(109\) to any out");</br><br />exec("ipfw add pipe 109 ip from any to table\(109\) in");</br><br /># нат загоняем в таблицы</br><br />exec("ipfw add nat 100 ip from table\(100\) to any");</br><br />exec("ipfw add nat 100 ip from any to 109.197.112.2");</br><br />exec("ipfw add nat 101 ip from table\(101\) to any");</br><br />exec("ipfw add nat 101 ip from any to 109.197.112.3");</br><br />exec("ipfw add nat 102 ip from table\(102\) to any");</br><br />exec("ipfw add nat 102 ip from any to 109.197.112.4");</br><br />exec("ipfw add nat 103 ip from table\(103\) to any");</br><br />exec("ipfw add nat 103 ip from any to 109.197.112.5");</br><br />exec("ipfw add nat 104 ip from table\(104\) to any");</br><br />exec("ipfw add nat 104 ip from any to 109.197.112.6");</br><br />exec("ipfw add nat 105 ip from table\(105\) to any");</br><br />exec("ipfw add nat 105 ip from any to 109.197.112.7");</br><br />exec("ipfw add nat 106 ip from table\(106\) to any");</br><br />exec("ipfw add nat 106 ip from any to 109.197.112.8");</br><br />exec("ipfw add nat 107 ip from table\(107\) to any");</br><br />exec("ipfw add nat 107 ip from any to 109.197.112.9");</br><br />exec("ipfw add nat 108 ip from table\(108\) to any");</br><br />exec("ipfw add nat 108 ip from any to 109.197.112.10");</br><br />exec("ipfw add nat 109 ip from table\(109\) to any");</br><br />exec("ipfw add nat 109 ip from any to 109.197.112.11");</br><br /># Юрики ( временно!) - у меня они бегают отдельной под-сеткой и пока не перешли на новый биллинг - раздаём халяву</br><br />exec("ipfw add nat 65000 ip from 172.28.9.0/24 to any");</br><br />exec("ipfw add nat 65000 ip from any to 109.197.112.12");</br><br /># ждём 1 сек</br><br /># sleep(1);</br><br /># функция обращения с серверу ТИ по http</br><br />function get($url) {</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$process = curl_init($url);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($process, CURLOPT_TIMEOUT, 60);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$return = curl_exec($process);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;curl_close($process);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;return $return;</br><br />}</br><br /># бесконечный цикл - если остановить скрипт - все цепочки на момент остановки будут живы</br><br /># при повторном запуске скрипт очистит их и возьмёт из ТИ текущих активных юзеров</br><br />while(true) {</br><br />&nbsp;&nbsp;&nbsp;&nbsp;# + получаем ВЕСЬ список с ТИ, с маркировкой Auth и Blocked</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$ti = get($ti_url);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$ti = split("\n", $ti);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;# получаем список текущих цепочек ipfw, преобразуем в массив IP</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$fw_chk = shell_exec("ipfw table all list | awk '{print $1}'");</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$fw = array();</br><br />&nbsp;&nbsp;&nbsp;&nbsp;$fw = split("\n", $fw_chk);</br><br />&nbsp;&nbsp;&nbsp;&nbsp;# получаем список цепочек шейпера, преобразуем в массив</br><br />&nbsp;&nbsp;&nbsp;&nbsp;# цикл обработки массива юзеров</br><br />&nbsp;&nbsp;&nbsp;&nbsp;foreach($ti as $val) {</br><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   if(ere gi("172\.28\.",$val)) {</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#  загоняем список юзеров с ТИ в массив, выделяем переменные</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user   = split("\t", $val);</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user  _id = $user[0];</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user  _active = $user[1];</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user  _blocked = $user[2];</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user  _ip = $user[3];</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user  _speed = $user[4];</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed==0)   { $speed = $lim_max."Kbit/s"; } else { $speed = $user_speed."Kbit/s"; }</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#  если юзер авторизирован по агенту и не заблокирован - тут мои тарифы!!!</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='1 28')  $table_id='100';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='2 56')  $table_id='101';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='5 12')  $table_id='102';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='1 024')  $table_id='103';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='2 048')  $table_id='104';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='3 072')  $table_id='105';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='4 096')  $table_id='106';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='8 192')  $table_id='107';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='1 0800')  $table_id='107';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='1 2228')  $table_id='108';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_speed=='1 6348')  $table_id='109';</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($user_active==1   && $user_blocked==0) {</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;    # если юзер активен</br><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;    if(in_array("$user_ip/32", $fw)) {</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #  цепочка есть, юзер работает, можно проверить скорость при динашейпинге и поменять pipe</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #  print "HAVE - ".$user_ip."\n";</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       }  else {</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       # новый юзер - создаём цепочку, врубаем шейпер по скорости</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #  пихаем в таблицу в соответствии с тарифом</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     if($table_id!='') {</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec("ipfw table $table_id add $user_ip/32");</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "NEW - ".$user_ip." - SPEED: $speed - IP: $real_ip - Table: $table_id\n";</br><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;    }</br><br />  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       }  elseif($user_active==0) {</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;    # если юзер неактивен, но цепочка есть, удаляем</br><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;    if(in_array("$user_ip/32", $fw)) {</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print "DELETE - ".$user_ip." - $speed - ipfw table $table_id delete $user_ip/32\n";</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #  удаляем нат цепочки</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  exec("ipfw table $table_id delete $user_ip/32");</br><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;    }</br><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</br><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }</br><br />&nbsp;&nbsp;&nbsp;&nbsp;}</br><br />&nbsp;&nbsp;&nbsp;&nbsp;print "-------------- Now: ".date("H:i:s")." ---------------------------\n";</br><br />}</br><br />?&gt;</br><br />




Повторюсь - это не универсальный код - у вас он не будет работать, если вы бездумно скопируете.



Идеология следующая - таблица 1XX - это тариф, в ней каждый пользователь ограничен одинаковой скоростью, которая не делится на всех, а присуща только одному пользователю, добавленному в

таблицу.



Ну и немного про тюнинг FreeBSD - постарайтесь не использовать 2х портовые карты (igb) - у них есть огромные проблемы - лучше уж материнка с 2мя em интерфейсами.

Почитайте сразу про sysctl.conf - важная вещь при использовании фри, как ната и шейпера.

я не тюнил сильно - вот мой sysctl.conf:



Код
</br><br />net.isr.direct=1</br><br />net.inet.ip.forwarding=1</br><br />net.inet.ip.fw.one_pass=0</br><br />net.inet.icmp.icmplim=1024 # чтобы пинги не дохли от юзеров</br><br />




и в /boot/loader.conf при использовании em интерфейсов не забудте добавить:



Код
</br><br />hw.em.rxd=4096</br><br />hw.em.txd=4096</br><br />




:-)



Время уже много, мог что-то забыть - потом дополню)

Удач всем ВНЕ Win32)MKC-adm40473.0861342593
 
Вы щедры х)
Мы по 1 мбиту отрезали тем кого обсчитать не могли =)
Вцелом хорошее решение, и позволяет плыть когда другие уже потонули ;) 
 
если делать такую связку, значит мб невазможно считат? а парвилно понял??
 
Цитата
если делать такую связку, значит мб

невазможно считат? а парвилно понял??




Возможно. В данной схеме можно на коммутаторе сделать

mirror на порт, который идёт на FreeBSD и отдать поток во

второй интерфейс ТИ сервера - в документации есть "Режим

прослушки". Всё будет считаться.

Но, повторюсь, у меня на 3500 абонентов ТИ сервер на 2х

ксеонах умирал на потоке ( у меня в совокупности 900Мбит на

3 канала ).
 
А если коммутатор умный, то можно делать mirror по ACL и трафика будет сыпатсья не так много ;)
 
Cisco  Catalyst 3500 XL, budu probovat, esli chto, otpishus, spasibo 
 
Цитата
А если коммутатор умный, то можно делать

mirror по ACL и трафика будет сыпатсья не так много ;)




зачем?) просто пофильтровать паразитный uTP трафик и поток

упадёт минимум на 25-30%. Последнее время это проблема у

всех провайдеров. Я фильтрую эту каку с помощью Layer7 на

бордере, т.е. в сеть оно не попадает. PPSы упали на 25%.
 
mozhno podrobnoee o filtracii UTP trafika?
 
В общем 2 суток - полёт нормальный. Можно юзать в продакшене)

Для теста я выпустил сеть через один нат, а не через два в балансировке как раньше для стресс-нагрузки, вот некоторые

скрины:



1. Нагрузка машины:







2. Экран отработки скрипта







3. Нагрузка сетевого интерфейса







Будет время, перепишу код под "универсальное" применение с выделенным конфигом.
 
zgdems
Страницы: 1 2 3 4 След.
Читают тему (гостей: 2)