Интересует вопрос по нарезке скорости средствами iptables или какого нибудь шейпера.
Ситуация:
Есть биллинг, есть авторизатор, который при авторизации добавляет в фаервол правило разрешающее данному пользователю по его ip ходить в инет.
Код: Выделить всё
#!/usr/bin/perl
#===========================================================================
# &Allow - Разрешение доступа
sub Allow
{
my ($num,$ip) = @_;
system ("iptables -t filter -A INPUT -s $ip -j ACCEPT"); return $?;
system ("iptables -t filter -A FORWARD -s $ip -j ACCEPT"); return $?;
system ("iptables -t filter -A FORWARD -d $ip -j ACCEPT"); return $?;
system ("iptables -t filter -A OUTPUT -d $ip -j ACCEPT"); return $?;
}
sub Deny
{
my ($num,$ip) = @_;
system("iptables -t filter -D INPUT -s $ip -j DROP "); return $?;
system("iptables -t filter -D FORWARD -s $ip -j DROP "); return $?;
system("iptables -t filter -D FORWARD -d $ip -j DROP "); return $?;
system("iptables -t filter -D OUTPUT -d $ip -j DROP "); return $?;
}
1;
Задача:
Осуществить нарезку скорости в linux по примеру FreeBSD.
Биллинг заточен под FreeBSD, и имеются работающие скрипты нарезки скорости только для IPFW.
Примердля IPFW:
Код: Выделить всё
Для каждого пакета тарификации должна быть своя скорость в инет и город,
# например
# 1й пакет: с инета - 256 кб/сек, с города - 1024 кбит/сек, в инет/город - 128 кб/сек
# 2й пакет: с инета - 512 кб/сек, с города - 2048 кбит/сек, в инет/город - 150 кб/сек
# и т.д
# Вы должны заранее (/etc/rc.firewall) заготовить pipe-ы для всех пакетов:
# 1й пакет:
# ipfw pipe 1 config bw 256Kbit/s mask dst-ip 0XFFFFFFFF
# ipfw pipe 2 config bw 1024Kbit/s mask dst-ip 0XFFFFFFFF
# ipfw pipe 3 config bw 128Kbit/s mask src-ip 0XFFFFFFFF
# 2й пакет:
# ipfw pipe 4 config bw 512Kbit/s mask dst-ip 0XFFFFFFFF
# ...
# Т.е пакет 1 занимает пайпы 1,2,3
# пакет 2 - 4,5,6
# пакет 3 - 7,8,9
# и т.д.
# Обратите внимание на обязательное указание маски dst-ip 0XFFFFFFFF
# что означает "создавать для каждого ip отдельный pipe"
# Если не указать маску, то все клиенты данного пакета попадут в один pipe
# и скорость будет делиться на всех. Хотя ничто вам не запрещает
# продавать полосу на нескольких клиентов, т.н "негарантированный канал"
# Однако в этом случае pipe лучше заменить на queue с указанием приоритетов
# чтобы один клиент не смог монопольно забить всю доступную полосу (например,
# менеджером закачки, качающим файл в несколько потоков)
# Также обратите внимание на указание направления: dst - к клиенту, src - от клиента
# ===========================================================================
# &Allow - Разрешение доступа
# Вход:
# 1 - номер правила в ipfw (для других фаерволов игнорировать либо считать "id правила")
# 2 - ip
# 3 - 'yes' - необходимо разрешить доступ только к направлению класса 2
# 4 - пакет тарификации
# 5 - =1 если контракт клиента='adm', 0 в иных случаях
# 6 - "дополнительный параметр"
# 7 - =1 если в настройках данного клиента стоит указание полностью детализировать трафик, 0 в ином случае
sub Allow
{
return unless $use_ipfw; # если $use_ipfw=0, то с фаерволом не работаем - выходим
my $p;
my ($num,$ip,$gorod,$paket,$adm,$dop,$detail) = @_;
# вычислим номера пайпов исходя из номера пакета тарификации
my ($pipe1,$pipe2,$pipe3) = ($paket*3-2,$paket*3-1,$paket*3);
# В table(2) billing заносит городские сети (направление 2)
# Gorod -> Users
system("$ipfw add $num pipe $pipe2 ip from \"table(2)\" to $ip >/dev/null");
unless ($gorod)
{# авторизовался в режиме "внешний инет"
# Inet -> Users
system("$ipfw add $num pipe $pipe1 ip from any to $ip >/dev/null");
# Users -> Inet
system("$ipfw add $num pipe $pipe3 ip from $ip to any >/dev/null");
} else
{
# Users -> Gorod
system("$ipfw add $num pipe $pipe3 ip from $ip to \"table(2)\" >/dev/null");
}
}
sub Deny
{
return unless $use_ipfw; # если $use_ipfw=0, то с фаерволом не работаем - выходим
my ($num,$ip) = @_;
system("$ipfw del $num >/dev/null");
}
1;
################################################################################
Перелистал кучу литературы, так ничего не осуществил ((((
Кто напишет скрипт и поможет разобраться - ВОЗНАГРАЖДЕНИЕ и благодарности!!!