Jump to content
Local
Sign in to follow this  
wifi_master

Nodeny отключения клиентов

Recommended Posts

У меня вопрос - когда у клиента отрицательный баланс 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 при включении правило удалялось.

Share this post


Link to post
Share on other sites

Тебе для микротика надо или для freebsd?

 

Во втором случае все гораздо проще чем ты даже себе можешь представить. Сначала идут разрешающие правила,

потом deny ip from any to any. Перед этм правилом пишешь (в nofire.pl):

 

fwd 127.0.0.1 81 tcp from any to any 80

 

и вешаешь на порт 81 страничку-заглушку

Share this post


Link to post
Share on other sites

Мне для freebsd. Что-то я не совсем понял как будет заблокированого клиента перекидать на страницу-заглушку? где прописать нада правило чтоб IP клиента передавть в фаервол ?

Share this post


Link to post
Share on other sites

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});

Share this post


Link to post
Share on other sites

А как создать эту заглушку на 81 порт? Это в apache что то прописывать нужно?

Share this post


Link to post
Share on other sites
А как создать эту заглушку на 81 порт? Это в apache что то прописывать нужно?

да

вешаешь веб-сервер на 81 порт

Share this post


Link to post
Share on other sites

Ну так у меня вебсервер должен работать на 80 порту, я могу все сайты оставить на 80-м порту, а эту заглушку сделать на 81-м ???

Share this post


Link to post
Share on other sites
Ну так у меня вебсервер должен работать на 80 порту, я могу все сайты оставить на 80-м порту, а эту заглушку сделать на 81-м ???

да

почитай документацию апача на предмет виртуальных хостов

Share this post


Link to post
Share on other sites

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");

Share this post


Link to post
Share on other sites

В /etc/rc.firewall:

 

ipfw add xxxx fwd 127.0.0.1,81 tcp from any to any 80

 

где xxxx - это номер правила. Не спрашивай какое

Share this post


Link to post
Share on other sites
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 и выложить сдесь готовый файл?

Share this post


Link to post
Share on other sites

аналогично сделал для 45ой версии, в rc.firewall

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

Share this post


Link to post
Share on other sites

Делаю так:

# 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" ничего толкового не сказал.

Сори за офтоп....

Share this post


Link to post
Share on other sites
Делаю так:

# 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

Share this post


Link to post
Share on other sites

tcpdump запускали? может пакеты идут на апач, но он неправильно настроен? Пример:

вы запрашиваете страницу http://lalala.com/bbb.html

есно, на вашем сервере нет файла bbb.html - вот вам и не отобразится заглушка. Нужно стандартную страницу с ошибкой 404 заменить на вашу заглушку, смотрите конфиг апача

Share this post


Link to post
Share on other sites

tcpdump запускал ничего не идет. У кого-то вобще получилось увидеть страницу заглушку?

Share this post


Link to post
Share on other sites

Покажи ipfw list на работающем сервере, где там можно запутаться в трех соснах..)

Share this post


Link to post
Share on other sites

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#

Share this post


Link to post
Share on other sites

1) пропиши в rc.firewall

 

ipfw add 350 fwd 127.0.0.1,81 tcp from any to any 80

 

2) почитай документацию на ipfw, в инете море информации. Чтобы понять где у тебя ошибка, достаточно иметь минимальные знания по ipfw, дерзай

Share this post


Link to post
Share on other sites

Страницу заглушку так и не удалось настроить, кто настроил покажите свой 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 версия глючная.....

Share this post


Link to post
Share on other sites

ты заюзал nofire.pl для других правил ipfw. В доке несколько примеров. Ты используешь простой, в котором только allow/deny, шейпы не юзаются. Тебе нужно взять пример из firewall.html. Только там используется не natd, а pf nat.

Share this post


Link to post
Share on other sites

Лично я считаю что пример конфига фаервола из доки не подходит никому или же подходит всем на 50%. Своими руками надо допиливать фаерволл и nofire.pl. nofire.pl это вообще отдельный разговор, открой в нормальном редакторе с подсветкой кода три файла - nofire.pl, noserver.pl и изучи их, а потом открой nofire.pl из папки simple и напрограммируй в нем то что тебе надо, время от времени подглядывая в предыдущие два файла. Разработчикам конечно респект за полный nofire.pl но оно ж не подходит всем. То что подходит фрегату может не подойти какому-то скайлайну итд ... И читай обязательно man ipfw. Исходя из собственного опыта, советую взять свой старый конфиг фаера и под него подпилять нофайр ну и сам фаер может подпилиш. И если раньше использовались таблицы, то следует поменять их нумерацию на номера после 30. Недавно поднимал все это, так говорю свой рецепт.

Share this post


Link to post
Share on other sites

и не пользуй natd, юзерленд не катит, вкомпили в ядро ipfw nat, преимущество в схожести конфигурирования и кернел левел

Share this post


Link to post
Share on other sites

Подведем итоги:

Сделал через pf nat все заработало шейпер работает, даже интернет както быстрее начал работать.

Заглушку показывает - добавил в фаервол правило ipfw add 5 fwd 127.0.0.1,81 tcp from not table\(\0 to any dst-port 80

 

Всем спасибо за помощь.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×