wifi_master 132 Опубликовано: 2009-04-02 17:34:00 Share Опубликовано: 2009-04-02 17:34:00 У меня вопрос - когда у клиента отрицательный баланс Nodeny передает правила фаерволу и отключает доступ по IP клиента, получается что конект по PPPoE проходит а интернета нет клиент не понимает что случилось думает что проблемы с интернетом, так вот может кто-то такое делал задача когда клиент отключен чтоб все запросы на порт 80 переадресовывать на локальный web сервер где размещена страница с информацией что клиент отключен, весь остальной трафик блокировался. Как такое сделать с Nodeny? П.С. В случае с УТМ5 + микротик когда УТМ отключал клиента передавал на микротик правило редиректа chain=dstnat action=dst-nat to-addresses=192.168.6.81 to-ports=80 protocol=tcp src-address=192.168.0.155 dst-port=80 при включении правило удалялось. Ссылка на сообщение Поделиться на других сайтах
dead 93 Опубліковано: 2009-04-03 00:46:58 Share Опубліковано: 2009-04-03 00:46:58 Тебе для микротика надо или для freebsd? Во втором случае все гораздо проще чем ты даже себе можешь представить. Сначала идут разрешающие правила, потом deny ip from any to any. Перед этм правилом пишешь (в nofire.pl): fwd 127.0.0.1 81 tcp from any to any 80 и вешаешь на порт 81 страничку-заглушку Ссылка на сообщение Поделиться на других сайтах
wifi_master 132 Опубліковано: 2009-04-03 09:08:59 Автор Share Опубліковано: 2009-04-03 09:08:59 Мне для freebsd. Что-то я не совсем понял как будет заблокированого клиента перекидать на страницу-заглушку? где прописать нада правило чтоб IP клиента передавть в фаервол ? Ссылка на сообщение Поделиться на других сайтах
dead 93 Опубліковано: 2009-04-04 04:14:12 Share Опубліковано: 2009-04-04 04:14:12 nofire.pl: $NumIpfw=$End_num_ipfw; &SetIpfwRule(qq{deny ip from any to any}); -> $NumIpfw=$End_num_ipfw-1; &SetIpfwRule(qq{fwd 127.0.0.1,81 tcp from any to any 80}); &SetIpfwRule(qq{deny ip from any to any}); Ссылка на сообщение Поделиться на других сайтах
Meataboll 0 Опубліковано: 2009-04-04 07:16:16 Share Опубліковано: 2009-04-04 07:16:16 А как создать эту заглушку на 81 порт? Это в apache что то прописывать нужно? Ссылка на сообщение Поделиться на других сайтах
911 140 Опубліковано: 2009-04-04 08:24:50 Share Опубліковано: 2009-04-04 08:24:50 А как создать эту заглушку на 81 порт? Это в apache что то прописывать нужно? да вешаешь веб-сервер на 81 порт Ссылка на сообщение Поделиться на других сайтах
Meataboll 0 Опубліковано: 2009-04-04 08:41:02 Share Опубліковано: 2009-04-04 08:41:02 Ну так у меня вебсервер должен работать на 80 порту, я могу все сайты оставить на 80-м порту, а эту заглушку сделать на 81-м ??? Ссылка на сообщение Поделиться на других сайтах
911 140 Опубліковано: 2009-04-04 09:29:08 Share Опубліковано: 2009-04-04 09:29:08 Ну так у меня вебсервер должен работать на 80 порту, я могу все сайты оставить на 80-м порту, а эту заглушку сделать на 81-м ??? да почитай документацию апача на предмет виртуальных хостов Ссылка на сообщение Поделиться на других сайтах
PLOGIS 3 Опубліковано: 2009-04-04 21:58:01 Share Опубліковано: 2009-04-04 21:58:01 45ая версия. nofire.pl подскажете плиз куда тут добавлять?)) sub Allow { return unless $use_ipfw; # ЕЯКХ $use_ipfw=0, РН Я ТЮЕПБНКНЛ МЕ ПЮАНРЮЕЛ - БШУНДХЛ my ($num,$ip) = @_; system("${ipfw} add $num allow ip from $ip to any >/dev/null"); system("${ipfw} add $num allow ip from any to $ip >/dev/null"); } sub Deny { return unless $use_ipfw; # ЕЯКХ $use_ipfw=0, РН Я ТЮЕПБНКНЛ МЕ ПЮАНРЮЕЛ - БШУНДХЛ my ($num,$ip) = @_; system("$ipfw del $num >/dev/null"); Ссылка на сообщение Поделиться на других сайтах
dead 93 Опубліковано: 2009-04-05 09:24:26 Share Опубліковано: 2009-04-05 09:24:26 В /etc/rc.firewall: ipfw add xxxx fwd 127.0.0.1,81 tcp from any to any 80 где xxxx - это номер правила. Не спрашивай какое Ссылка на сообщение Поделиться на других сайтах
wifi_master 132 Опубліковано: 2009-04-06 10:30:07 Автор Share Опубліковано: 2009-04-06 10:30:07 nofire.pl: $NumIpfw=$End_num_ipfw; &SetIpfwRule(qq{deny ip from any to any}); -> $NumIpfw=$End_num_ipfw-1; &SetIpfwRule(qq{fwd 127.0.0.1,81 tcp from any to any 80}); &SetIpfwRule(qq{deny ip from any to any}); Сделал так как написано, после этого вобще пропал интернет. На страницу заглушку так и не перекидает. ded Вы бы не могли изменить nofire.pl и выложить сдесь готовый файл? Ссылка на сообщение Поделиться на других сайтах
PLOGIS 3 Опубліковано: 2009-04-06 12:24:51 Share Опубліковано: 2009-04-06 12:24:51 аналогично сделал для 45ой версии, в rc.firewall инет есть все пашет. но когда отрицательный баланс на стр. заглушку не перекидывает. Ссылка на сообщение Поделиться на других сайтах
Den_LocalNet 1 474 Опубліковано: 2009-04-06 14:34:11 Share Опубліковано: 2009-04-06 14:34:11 Делаю так: # ipfw add 250 fwd 127.0.0.1,80 tcp from 111.111.111.111 to any 80 работает Делаю так: # ipfw table 10 add 111.111.111.111 # ipfw add 250 fwd 127.0.0.1,80 tcp from "table(10)" to any 80 не работает. Кто знает почему так? гугл на вопрос "ipfw fwd table" ничего толкового не сказал. Сори за офтоп.... Ссылка на сообщение Поделиться на других сайтах
centre-lan 1 Опубліковано: 2009-04-06 14:52:39 Share Опубліковано: 2009-04-06 14:52:39 Делаю так:# ipfw add 250 fwd 127.0.0.1,80 tcp from 111.111.111.111 to any 80 работает Делаю так: # ipfw table 10 add 111.111.111.111 # ipfw add 250 fwd 127.0.0.1,80 tcp from "table(10)" to any 80 не работает. Кто знает почему так? гугл на вопрос "ipfw fwd table" ничего толкового не сказал. Сори за офтоп.... ipfw add 250 fwd 127.0.0.1,80 tcp from table\(10\) to any 80 было-бы правильно, смотря от куда выполняете.. у меня #/sbin/ipfw add 2 fwd 127.0.0.1,3330 tcp from table\(97\) to any dst-port 80 работает можно еще дописать out xmit $external_iface Ссылка на сообщение Поделиться на других сайтах
dead 93 Опубліковано: 2009-04-06 15:26:10 Share Опубліковано: 2009-04-06 15:26:10 tcpdump запускали? может пакеты идут на апач, но он неправильно настроен? Пример: вы запрашиваете страницу http://lalala.com/bbb.html есно, на вашем сервере нет файла bbb.html - вот вам и не отобразится заглушка. Нужно стандартную страницу с ошибкой 404 заменить на вашу заглушку, смотрите конфиг апача Ссылка на сообщение Поделиться на других сайтах
wifi_master 132 Опубліковано: 2009-04-07 16:29:44 Автор Share Опубліковано: 2009-04-07 16:29:44 tcpdump запускал ничего не идет. У кого-то вобще получилось увидеть страницу заглушку? Ссылка на сообщение Поделиться на других сайтах
dead 93 Опубліковано: 2009-04-07 17:27:47 Share Опубліковано: 2009-04-07 17:27:47 Покажи ipfw list на работающем сервере, где там можно запутаться в трех соснах..) Ссылка на сообщение Поделиться на других сайтах
wifi_master 132 Опубліковано: 2009-04-08 08:30:59 Автор Share Опубліковано: 2009-04-08 08:30:59 billing# ipfw list 00050 allow tcp from any to me dst-port 22 00051 allow tcp from me 22 to any 00100 allow ip from any to any via lo0 00150 allow ip from me to any keep-state 00160 skipto 500 ip from any to me 00200 divert 8668 ip from any to any via vr0 00210 allow ip from any to any out 00300 allow ip from table(0) to any 00390 deny ip from any to any 00500 check-state 00510 skipto 700 ip from any to any via vr0 00520 allow icmp from any to any 00530 allow udp from any to any dst-port 53,7723 00535 allow tcp from any to any dst-port 21 00540 allow tcp from any to any dst-port 80,443,10000 00590 deny ip from any to any 00700 divert 8668 ip from any to any 00710 allow tcp from any to any dst-port 80 00710 allow icmp from any to me 00720 deny ip from any to me 00730 allow ip from any to table(0) 00790 deny ip from any to any 05000 deny ip from not table(0) to any 05001 skipto 5010 ip from table(127) to table(126) 05002 skipto 5030 ip from any to not table(2) 05003 deny ip from any to not table(1) 05004 pipe tablearg ip from table(21) to any 05005 deny ip from any to any 05010 pipe tablearg ip from table(127) to any 05030 deny tcp from table(15) to any dst-port 25 05400 pipe tablearg ip from table(11) to any 31999 fwd 127.0.0.1,81 tcp from any to any dst-port 80 32000 deny ip from any to any 32000 deny ip from any to any 33000 pipe tablearg ip from table(126) to table(127) 33001 skipto 33010 ip from not table(2) to any 33002 pipe tablearg ip from any to table(20) 33003 deny ip from any to any 33400 pipe tablearg ip from any to table(10) 65535 deny ip from any to any billing# Ссылка на сообщение Поделиться на других сайтах
dead 93 Опубліковано: 2009-04-08 08:46:53 Share Опубліковано: 2009-04-08 08:46:53 1) пропиши в rc.firewall ipfw add 350 fwd 127.0.0.1,81 tcp from any to any 80 2) почитай документацию на ipfw, в инете море информации. Чтобы понять где у тебя ошибка, достаточно иметь минимальные знания по ipfw, дерзай Ссылка на сообщение Поделиться на других сайтах
wifi_master 132 Опубліковано: 2009-04-13 20:32:00 Автор Share Опубліковано: 2009-04-13 20:32:00 Страницу заглушку так и не удалось настроить, кто настроил покажите свой rc.firewall и nofire.pl. Потом возникла еще одна проблема с 49 нодени - не шейпит скорость. Вот мои конфиги: rc.firewall #!/bin/sh - f='/sbin/ipfw' ifOut='vr0' ${f} add 50 allow tcp from any to me 22 ${f} add 51 allow tcp from me 22 to any ${f} add 100 allow ip from any to any via lo0 ${f} add 150 allow ip from me to any keep-state ${f} add 160 skipto 500 ip from any to me ${f} add 200 divert natd ip from any to any via ${ifOut} ${f} add 210 allow ip from any to any out ${f} add 300 allow ip from "table(0)" to any ${f} add 390 deny ip from any to any ${f} add 500 check-state ${f} add 510 skipto 700 ip from any to any via ${ifOut} ${f} add 520 allow icmp from any to any ${f} add 530 allow udp from any to any 53,7723 ${f} add 540 allow tcp from any to any 80,443,10000 ${f} add 590 deny ip from any to any ${f} add 700 divert natd ip from any to any ${f} add 710 allow icmp from any to me ${f} add 720 deny ip from any to me ${f} add 730 allow ip from any to "table(0)" ${f} add 790 deny ip from any to any nofire.pl #!/usr/bin/perl # ============================================================================== # # NoDeny - подпрограммы разрешения/блокировки доступа # # ============================================================================== # # Данный скрипт управляет созданием правил в фаерволе разрешающих/запрещающих/shape-щих трафик клиентов. # Скрипт можно редактировать для выполнения ваших конкретных задач. Фаервол ipfw - в данном случае. # # Определения: # 1. Входящий/исходящий трафик рассматривается по отношению к клиенту, например, speed_in - # входящая скорость для клиента. Для сервера же этот трафик, естественно, будет исходящим. # # 2. Альтернативные направления - список сетей, для трафика в которые можно указать скорость # независимо от основной скорости пакета. Например, тариф `unlim 512кбит + 2048кбит видеосервер` - # подразумевает, что альтернативные направления будут включать в себя список ip видеосерверов. # Список ip алт. направлений задается в таблице 126 ipfw, сети заносятся туда автоматически (!) # после того как в настройках направлений (в админке NoDeny) для определенного названия направления # вы укажете, что все сети этого направления необходимо занести в таблицу 126 ipfw. # Если в тарифе не указана скорость к алт. направлением - фича не задействуется. # # nofire.pl вызывается из noserver.pl и выполняет его команды (подпрограммы): # Flush - Приводит ipfw в исходное состояние - удаляет все правила в диапазоне использования NoDeny, # формирует правила с шейпами. В правилах, используются таблицы ipfw, поэтому дальнейшая работа # скрипта заключается в добавлении/удалении ip клиентов из таблиц. Если же для заданного клиента # необходимо применить иные механизмы шейпов, то для него формируются персональные правила. # # Add_To_All_Ip - вызывается для каждого существуещего ip в NoDeny вне зависимости от группы, состояния # доступа и авторизации. Таким образом, подпрограмма получит последовательно все # существующие ip и занесет их в таблицу 2 (в данном случае). Это необходимо для того, чтобы # на уровне фаервола понять куда идет трафик - в интернет или к другому клиенту. Дело в том, # что если трафик идет к другому клиенту, то будет дополнительная проверка - авторизован # ли и разрешен ли доступ у целевого клиента (есть ли он таблице 1 ipfw), причем неважно # на данном либо ином маршрутизаторе. # # Delete_From_All_Ip - вызывается когда noserver.pl обнаруживает, что определенный ip удален из биллинга. # # Add_To_Table - вызывается когда необходимо добавить определенную сеть в определенную таблицу. # В настройках направлений указываются сети каких направлений должны попасть в какие таблицы # # Delete_From_Table # # Allow - вызывается, когда заданному ip необходимо включить доступ # # Deny - -//- заблокировать доступ # # Run_Ipfw_Rules - вызывается когда noserver.pl желает выполнить все подготовленные в $Rules команды ipfw, # при этом они скидываются в файл, после чего тот скармливается ipfw-утилите. # # ============================================================================== # # Описания таблиц ipfw, используемых скриптом: # 0 - ip клиентов, которых обслуживает данный сателлит и для которых выполняются условия, описанные в # конфиге сателлита, по умолчанию: # - клиент авторизован и доступ не заблокирован # - клиент в состоянии `всегда онлайн` и доступ не заблокирован # Если в данной таблице нет нужного вам ip, а должен быть - возможно, клиент в группе, которую не # обслуживает данный сателлит. # 1 - ip авторизованных, а также `всегда онлайн`, незаблокированных клиентов всех групп! Не только # тех, которые обслуживает данный сателлит. Эта таблица заполняется только если запущено ядро nodeny. # 2 - полный список всех ip NoDeny вне зависимости от авторизации и др. параметров. # # 10 - ip и pipe-ы для шейпов трафика, идущего к клиенту. Например # bash# ipfw table 10 list | grep 10.0.0.5 # 10.0.0.5/32 1234 # bash# ipfw pipe 1234 show # 01234: 512.000 Kbit/s # Здесь входящая скорость на клиента ограничена 512 кбит. # В 10 таблицу не обязательно попадают все `включенные ip` - в зависимости от условий (модификаторы скоростей, # персональные параметры) для ip могут быть сформированы персональные правила в ipfw # # 11 - То же для трафика от клиента # # 15 - ip, которым заблокирован доступ к запрещенным портам # # 20,21 - шейпы для трафика `клиент -> клиент`, т.е трафик между ip, которые ОБА присутствуют в NoDeny # # ============================================================================== # # Для любого клиента, если у него в пакете не указна скорость, можно указать персональную, которая # указывается в дополнительных полях учетной записи клиента. # В `Операции` -> `Настройки` -> `Дополнительные поля` необходимо создать 3 поля (если их там нет) # 1) входящая скорость (алиас: _speed_in) # 2) исходящая скорость (алиас: _speed_out) # 3) разрешение открытие 25го порта (алиас: _open_ports) # Важны не названия полей, а алиасы, которые в точности должны совпадать с указанными! # В настройках сателлита необходимо указать номер шаблон, в котором эти поля находятся. # Скорости задаются в килобайтах/сек. $IPFW='/sbin/ipfw -q '; $FW=$IPFW; # Для отладки установите $Del_Files=0 - сформированные файлы с командами ipfw не будут удаляться после выполнения $Del_Files=0; # Если раскомментировать следущую строчку - вместо выполнения, ipfw команды будут выводиться в STDOUT #$FW='/bin/cat'; # Следующий кусок кода будет выполнен при старте noserver.pl, здесь мы иннициализируем переменные. # Если у клиента в пакете или в личных данных не указаны скорости, то будут выставлены стандартные. # Стандартные указываются в конфиге сателлита, если там не указаны, то принимает такие: $default_in=(int $c{DefaultSpeedIn}) || 8192; # скорость к клиенту, кбит $default_out=(int $c{DefaultSpeedOut}) || 1024; # скорость от клиентаб кбит # Список запрещенных tcp портов. По умолчанию всем будет запрещено создавать соединения на эти порты, однако # в данных клиента можно разрешить персонально. Пример запрещения smtp: $denied_ports='25'; $denied_ports=$c{Denied_ports} || 0; # ============================ # Вспомогательные подпрограммы # По заданному id клиента возвращает два номера правила ipfw: `трафик от клиента` и `на клиента` # Делаем буфер в 500 правил т.к формируем общие правила в начале окон ipfw sub Get_Ipfw_Num { return($_[0]+$Start_num_ipfw+500,$_[0]+$Start_num2_ipfw+500); } # По id клиента генерируем номер pipe # Будут начинаться с 1000 (до этого зарезервированы), умножение на 4 - это 4 пайпа под каждый ip sub Get_Pipe_Num { return($_[0]*4+1000); } sub Add_Rule { $Rules.=$_[0]."\n"; $nRules++; } sub SetIpfwRule { &Add_Rule('add '.$NumIpfw++.' '.$_[0]); } # 0 - таблица # 1 - ip # 2 - tablearg sub Add_Tbl_Rule { return if $Tbl{$_[1]}{$_[0]}; $Tbl{$_[1]}{$_[0]}=1; $Rules.="table $_[0] add $_[1] $_[2]\n"; } sub Flush { # 1. Удаляет из фаервола все правила в диапазонах ($Start_num_ipfw .. $End_num_ipfw) и ($Start_num2_ipfw .. $End_num2_ipfw), # т.е. освобождет 2 окна, в которых будут формироваться динамические правила # 2. Формирует общие правила в созданных окнах %Pipe_count=(); # счетчик использования пайпов, как только на пайп перестают ссылаться - он удаляется %Pipe_used=(); # какой клиент какой pipe использует... $Rules=''; my @lines=split /\n/,`$IPFW list`; my $num=0; foreach (@lines) { next if !/^\s*(\d+)/ || $num==$1; # на правиле может быть несколько записей $num=$1; &Add_Rule("delete $1") if ($1>=$Start_num_ipfw && $1<$End_num_ipfw) || ($1>=$Start_num2_ipfw && $1<$End_num2_ipfw); } &Add_Rule("table 0 flush"); # ip авторизованных клиентов, неважно в каком режиме &Add_Rule("table 1 flush"); # ВСЕ включенные ip NoDeny, не только обслуживаемых групп клиентов &Add_Rule("table 2 flush"); # ВСЕ ip NoDeny, не только обслуживаемых групп клиентов &Add_Rule("table 10 flush"); # ip и пайпы трафика к клиенту &Add_Rule("table 11 flush"); # ip и пайпы трафика от клиента &Add_Rule("table 15 flush"); # для ip, которым заблокирован доступ к запрещенным портам (по умолчанию все попадают в этот список) &Add_Rule("table 20 flush"); # шейпы для клиент -> клиент &Add_Rule("table 21 flush"); # шейпы для клиент -> клиент &Add_Rule("-f pipe flush"); &Add_Rule("pipe 1 config bw 0bit/s"); # скорость 0 указывает на отсутствие шейпа, т.е unlimited $Start_num_ipfw_4tbl=$Start_num_ipfw+100; # с этого правила будут формироваться таблицы $Start_num2_ipfw_4tbl=$Start_num2_ipfw+100; $NumIpfw=$Start_num_ipfw; my $n1=$NumIpfw+10; my $n2=$NumIpfw+400; my $n3=$n1+20; &SetIpfwRule(qq{deny ip from not table(0) to any}); # запретим любой входящий трафик от незарегистрированных либо невключенных ip &SetIpfwRule(qq{skipto $n1 ip from table(127) to table(126)}); # переход на: клиент -> альт. направление &SetIpfwRule(qq{skipto $n3 ip from any to not table(2)}); # переход на: клиент -> не другой клиент ( -> мир) &SetIpfwRule(qq{deny ip from any to not table(1)}); # запретить трафик к невключенным зарегистрированным ip &SetIpfwRule(qq{pipe tablearg ip from table(21) to any}); # клиент -> клиент &SetIpfwRule(qq{deny ip from any to any}); # сюда skipto $NumIpfw=$n1; &SetIpfwRule(qq{pipe tablearg ip from table(127) to any}); # клиент -> альт. направление $NumIpfw=$n3; &SetIpfwRule(qq{deny tcp from table(15) to any $denied_ports}); # клиент -> запрещенные порты $NumIpfw=$n2; &SetIpfwRule(qq{pipe tablearg ip from table(11) to any}); # клиент -> мир $NumIpfw=$End_num_ipfw; &SetIpfwRule(qq{deny ip from any to any}); $NumIpfw=$Start_num2_ipfw; $n1=$NumIpfw+10; $n2=$NumIpfw+400; &SetIpfwRule(qq{pipe tablearg ip from table(126) to table(127)}); # альтернативное направление -> клиент &SetIpfwRule(qq{skipto $n1 ip from not table(2) to any}); # не от клиента -> &SetIpfwRule(qq{pipe tablearg ip from any to table(20)}); # клиент -> клиент &SetIpfwRule(qq{deny ip from any to any}); # $n1 ... $n2 буфер для таблиц направлений $NumIpfw=$n2; &SetIpfwRule(qq{pipe tablearg ip from any to table(10)}); # мир -> клиент } sub Add_To_All_Ip { &Add_Rule("table 2 add $_[0]"); } sub Delete_From_All_Ip { &Add_Rule("table 2 delete $_[0]"); } sub Add_To_Allow_Ip { &Add_Rule("table 1 add $_[0]"); } sub Delete_From_Allow_Ip { &Add_Rule("table 1 delete $_[0]"); } sub Add_To_Table { my ($net,$tbl)=@_; unless ($ExistRuleForTbl{$tbl}) { $ExistRuleForTbl{$tbl}=1; $_=$tbl+1; &Add_Rule("table $_ flush"); &Add_Rule("table $tbl flush"); my $tbl_from="table($_)"; my $tbl_to="table($tbl)"; $_=$Start_num_ipfw_4tbl+$tbl; &Add_Rule("add $_ allow ip from $tbl_from to $tbl_to"); $_=$Start_num2_ipfw_4tbl+$tbl; &Add_Rule("add $_ allow ip from $tbl_to to $tbl_from"); } &Add_Rule("table $tbl add $net"); } sub Delete_From_Table { &Add_Rule("table $_[1] delete $_[0]"); } sub Flush_Table { &Add_Rule("table $_[0] flush"); } # ==================== # Блокировка доступа # ==================== sub Deny { my $p=$_[0]; my $num=$p->{num}; my $ip=$p->{ip}; my ($num1,$num2,$tbl,$pipe); # удалим ip из всех таблиц, в которые он был записан foreach $tbl (keys %{$Tbl{$ip}}) { &Add_Rule("table $tbl delete $ip"); delete $Tbl{$ip}{$tbl}; } if ($Need_Del_Rule{$ip}) { $Need_Del_Rule{$ip}=0; ($num1,$num2)=&Get_Ipfw_Num($num); # добавим защиту от случая, когда кто-то удалит вручную правило, тогда выполнение потока команд прервется, # такая особенность работы ipfw. Добавим безобидное правило, чтобы его тут же удалить вместе с основным &Add_Rule("add $num1 count ip from any to any"); &Add_Rule("delete $num1"); &Add_Rule("add $num2 count ip from any to any"); &Add_Rule("delete $num2"); } $pipe=$Pipe_used{$num}; # данный ip использовал такой pipe if (--$Pipe_count{$pipe}<=0) {# больше данный pipe никто не использует, удалим $Pipe_count{$pipe}=0 if $Pipe_count{$pipe}; # перестраховка, в реальности не должно никогда сработать $num=3; while ($num--) {# на самом деле на каждого клиента приходится 3 pipe, удалим все &Add_Rule("pipe $pipe config"); &Add_Rule("pipe $pipe delete"); $pipe++; } } } # ================== # Разрешение доступа sub Allow { my $p=$_[0]; my ($auth,$dop_param,$i,$id,$ip,$mid,$n,$num,$num1,$num2,$opt,$options); my ($paket,$pipe2,$pipe_in,$pipe_out,$speed2,$speed_in,$speed_out); $ip=$p->{ip}; $id=$p->{id}; # id текущей записи (по таблице users) $num=$p->{num}; # виртуальный уникальный id текущей записи $mid=$p->{mid}; # id основной записи (по таблице users) $auth=$p->{auth}; # режим авторизации (on,off,ong) $paket=$p->{paket}; $speed2=$p->{speed2}; # альтернативная скорость, указанная в пакете $options=$p->{options}; # модификаторы скорости $main_num=$p->{main_num}; # виртуальный уникальный id основной записи $speed_in=$p->{speed_in}; # скорость к клиенту, указанная в пакете $speed_out=$p->{speed_out}; $dop_param=$p->{dop_param}; # дополнительные параметры учетки клиента $plan_flags=$p->{plan_flags}; # флаги пакета тарификации ($num1,$num2)=&Get_Ipfw_Num($num); # номера правил ipfw `от клиента` и `на клиента` $Need_Del_Rule{$ip}=0; # признак, что для $ip персонального правила не создано, # 0 останется если все будет оформлено через таблицы &Add_Tbl_Rule(0,$ip); my $s_in=$dop_param->{_speed_in}; # входящая скорость в учетке клиента, кб/сек my $s_out=$dop_param->{_speed_out}; # исходящая скорость в учетке клиента, кб/сек my $a_ports=$dop_param->{_open_ports}; # не блокировать запрещенные порты? # Если скорости не указаны, то берутся значения по умолчанию (из конфига сателлита) if ($speed_in) {# Cкорость указана в пакете. Это самая приоритетная скорость, даже если в учетной # записи в доп параметре указана другая. Получим уникальный номер pipe по основной записи: # $main_num - трафик всех алиасов должен попадать в один pipe! $pipe_in=&Get_Pipe_Num($main_num); &Add_Rule("pipe $pipe_in config bw ${speed_in}Kbit/s"); if ($speed_out) {# указана скорость от клиента, для нее отдельный pipe $pipe_out=$pipe_in+1; &Add_Rule("pipe $pipe_out config bw ${speed_out}Kbit/s"); }else {# входящий и исходящий трафик в одной трубе $speed_out=$speed_in; $pipe_out=$pipe_in; } } else {# Если какая-либо скорость не указана - берем стандартную. Нулевая скорость в пайпах = allow $pipe_in=&Get_Pipe_Num($num); $pipe_out=$pipe_in+1; $speed_in=$s_in>0? $s_in*8 : $default_in; $speed_out=$s_out>0? $s_out*8 : $default_out; &Add_Rule("pipe $pipe_in config bw ${speed_in}Kbit/s"); &Add_Rule("pipe $pipe_out config bw ${speed_out}Kbit/s"); } # Трафик между ip и другими клиентами if ($plan_flags=~/j/) {# пакет указывает шейпить локальный трафик для данного ip &Add_Tbl_Rule(20,$ip,$pipe_in); &Add_Tbl_Rule(21,$ip,$pipe_out); } else {# pipe № 1 - пайп unlimited &Add_Tbl_Rule(20,$ip,1); &Add_Tbl_Rule(21,$ip,1); } $Pipe_used{$num}=$pipe_in; # запомним какой pipe использует данный ip $Pipe_count{$pipe_in}++; # увеличим счетчик использования pipe - один пайп может использоваться # несколькими клиентскими ip - алиасами return if $auth eq 'off'; # авторизация в режиме `разрешить только локальный трафик` if ($speed2) {# к альтернативным направлениям в пакете указана скорость $pipe2=$pipe_in+2; # pipe для трафика в альтернативные направления &Add_Rule("pipe $pipe2 config bw ${speed2}Kbit/s"); &Add_Tbl_Rule(127,$ip,$pipe2); } if ($a_ports) {# для данного клиента разрешить доступ к портам, которые в списке запрещенных if ($TBL_15{$ip}) { &Add_Rule("table 15 delete $ip"); $TBL_15{$ip}=0; } }else {# для данного клиента запретить доступ к портам, которые в списке запрещенных unless ($TBL_15{$ip}) { &Add_Rule("table 15 add $ip"); $TBL_15{$ip}=1; } } # Подпрограмма отключает шейп трафика для сетей указанного пресета и направления sub set_allow { my ($id,$ip,$paket,$num1,$num2)=@_; $id=$Plan_preset[$paket].'-'.$id; my $tbl=$Tables{$id}; if ($tbl) {# сети заданного направления и пресета присутствуют в таблице $tbl ipfw if ($ExistRuleForTbl{$tbl}) {# кроме того есть правило, которое делает allow из таблицы $tbl+1 в $tbl и обратно # т.е. не нужно формировать дополнительные правила $tbl++; &Add_Tbl_Rule($tbl,$ip); }else { $Need_Del_Rule{$ip}=1; &Add_Rule(qq{add $num1 allow ip from $ip to table($tbl)}); &Add_Rule(qq{add $num2 allow ip from table($tbl) to $ip}); } } elsif ($NET{$id}) { $Need_Del_Rule{$ip}=1; &Add_Rule("add $num1 allow ip from $ip to $NET{$id}"); &Add_Rule("add $num2 allow ip from $NET{$id} to $ip"); } } if ($options) {# есть модификаторы скорости foreach $opt (split /\n/,$options) { next if $opt!~/^(\d+)\d+)$/; # поврежденная структура, игнорируем &set_allow($1,$ip,$paket,$num1,$num2); } } # пакет указывает не шейпить трафик клиента сети в определенные направления? &set_allow('2',$ip,$paket,$num1,$num2) if $plan_flags=~/x/; &set_allow('3',$ip,$paket,$num1,$num2) if $plan_flags=~/y/; &set_allow('4',$ip,$paket,$num1,$num2) if $plan_flags=~/z/; # -> клиент if ($Need_Del_Rule{$ip}) {# нельзя записывать в таблицу т.к после нее созданы правила, которые логически должны быть обработаны до правила с таблицей &Add_Rule("add $num2 pipe $pipe_in ip from any to $ip"); } else { &Add_Tbl_Rule(10,$ip,$pipe_in); } # клиент -> if ($Need_Del_Rule{$ip}) { &Add_Rule("add $num1 pipe $pipe_out ip from $ip to any"); } else { &Add_Tbl_Rule(11,$ip,$pipe_out); } } sub Run_Ipfw_Rules { return unless $Rules; my $fname=$Program_dir.'/'.time(); if (open(F,">>$fname")) { print F $Rules; close (F); $Rules=''; system("$FW $fname"); unlink $fname if $Del_Files; } } 1; billing# ipfw -a list 00050 125 12834 allow tcp from any to me dst-port 22 00051 108 50482 allow tcp from me 22 to any 00100 462 264866 allow ip from any to any via lo0 00150 16 1130 allow ip from me to any keep-state 00160 110890 141063744 skipto 500 ip from any to me 00200 77123 5768339 divert 8668 ip from any to any via vr0 00210 187598 146678502 allow ip from any to any out 00300 76817 5673324 allow ip from table(0) to any 00390 319 96895 deny ip from any to any 00500 0 0 check-state 00510 110889 141063700 skipto 700 ip from any to any via vr0 00520 0 0 allow icmp from any to any 00530 0 0 allow udp from any to any dst-port 53,7723 00540 0 0 allow tcp from any to any dst-port 80,443,10000 00590 0 0 deny ip from any to any 00700 110889 141063700 divert 8668 ip from any to any 00710 16 1578 allow icmp from any to me 00720 80 46885 deny ip from any to me 00730 110787 141006357 allow ip from any to table(0) 00790 0 0 deny ip from any to any 05000 0 0 deny ip from not table(0) to any 05001 0 0 skipto 5010 ip from table(127) to table(126) 05002 0 0 skipto 5030 ip from any to not table(2) 05003 0 0 deny ip from any to not table(1) 05004 0 0 pipe tablearg ip from table(21) to any 05005 0 0 deny ip from any to any 05010 0 0 pipe tablearg ip from table(127) to any 05030 0 0 deny tcp from table(15) to any dst-port 25 05400 0 0 pipe tablearg ip from table(11) to any 32000 0 0 deny ip from any to any 33000 0 0 pipe tablearg ip from table(126) to table(127) 33001 0 0 skipto 33010 ip from not table(2) to any 33002 0 0 pipe tablearg ip from any to table(20) 33003 0 0 deny ip from any to any 33400 0 0 pipe tablearg ip from any to table(10) 65535 1 44 deny ip from any to any billing# трафика в шейперах как видим нет, хотя счас сижу через нодени сервер ы идет закачка торентом на скорости 3 мегабита..... billing# ipfw pipe list 01004: 256.000 Kbit/s 0 ms 50 sl. 0 queues (1 buckets) droptail 00001: unlimited 0 ms 50 sl. 0 queues (1 buckets) droptail 01008: 512.000 Kbit/s 0 ms 50 sl. 0 queues (1 buckets) droptail 01009: 512.000 Kbit/s 0 ms 50 sl. 0 queues (1 buckets) droptail billing# billing# ipfw table 10 list | grep 192.168.40.39 192.168.40.39/32 1004 billing# billing# ipfw pipe 1004 show 01004: 256.000 Kbit/s 0 ms 50 sl. 0 queues (1 buckets) droptail billing# billing# ifconfig rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether 00:a1:b0:10:47:47 inet 192.168.40.1 netmask 0xffffff00 broadcast 192.168.40.255 media: Ethernet autoselect (100baseTX <full-duplex>) status: active vr0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether 00:13:8f:44:58:23 inet 192.168.7.81 netmask 0xffffff00 broadcast 192.168.7.255 media: Ethernet autoselect (100baseTX <full-duplex>) status: active plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> metric 0 mtu 1500 lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4 inet6 ::1 prefixlen 128 inet 127.0.0.1 netmask 0xff000000 ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1480 inet 192.168.40.1 --> 192.168.40.39 netmask 0xffffffff billing# П.С. Уже незнаю в чом дело может я туплю хз.. но кажется мне что 49 версия глючная..... Ссылка на сообщение Поделиться на других сайтах
dead 93 Опубліковано: 2009-04-13 22:59:09 Share Опубліковано: 2009-04-13 22:59:09 ты заюзал nofire.pl для других правил ipfw. В доке несколько примеров. Ты используешь простой, в котором только allow/deny, шейпы не юзаются. Тебе нужно взять пример из firewall.html. Только там используется не natd, а pf nat. Ссылка на сообщение Поделиться на других сайтах
blackjack 250 Опубліковано: 2009-04-14 05:57:51 Share Опубліковано: 2009-04-14 05:57:51 Лично я считаю что пример конфига фаервола из доки не подходит никому или же подходит всем на 50%. Своими руками надо допиливать фаерволл и nofire.pl. nofire.pl это вообще отдельный разговор, открой в нормальном редакторе с подсветкой кода три файла - nofire.pl, noserver.pl и изучи их, а потом открой nofire.pl из папки simple и напрограммируй в нем то что тебе надо, время от времени подглядывая в предыдущие два файла. Разработчикам конечно респект за полный nofire.pl но оно ж не подходит всем. То что подходит фрегату может не подойти какому-то скайлайну итд ... И читай обязательно man ipfw. Исходя из собственного опыта, советую взять свой старый конфиг фаера и под него подпилять нофайр ну и сам фаер может подпилиш. И если раньше использовались таблицы, то следует поменять их нумерацию на номера после 30. Недавно поднимал все это, так говорю свой рецепт. Ссылка на сообщение Поделиться на других сайтах
blackjack 250 Опубліковано: 2009-04-14 06:00:56 Share Опубліковано: 2009-04-14 06:00:56 и не пользуй natd, юзерленд не катит, вкомпили в ядро ipfw nat, преимущество в схожести конфигурирования и кернел левел Ссылка на сообщение Поделиться на других сайтах
wifi_master 132 Опубліковано: 2009-04-14 09:29:20 Автор Share Опубліковано: 2009-04-14 09:29:20 Подведем итоги: Сделал через pf nat все заработало шейпер работает, даже интернет както быстрее начал работать. Заглушку показывает - добавил в фаервол правило ipfw add 5 fwd 127.0.0.1,81 tcp from not table\(\0 to any dst-port 80 Всем спасибо за помощь. Ссылка на сообщение Поделиться на других сайтах
daizzy 0 Опубліковано: 2009-04-25 22:40:17 Share Опубліковано: 2009-04-25 22:40:17 Подведем итоги:Сделал через pf nat все заработало шейпер работает, даже интернет както быстрее начал работать. Заглушку показывает - добавил в фаервол правило ipfw add 5 fwd 127.0.0.1,81 tcp from not table\(\0 to any dst-port 80 Всем спасибо за помощь. Не мог бы ты вкраце рассказать что правил что бы шейпер работал ?? по настройкам которые в доках не работает не то что шейпер даже инет... Если без шейпера настраивать, то все работает нормально... Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас