HELP! Нарезка скорости в linux

Аватар пользователя non-stop

Всем доброго времени суток!
Интересует вопрос по нарезке скорости средствами 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 ACCEPT "); return $?;
system("iptables -t filter -D FORWARD -s $ip -j ACCEPT "); return $?;
system("iptables -t filter -D FORWARD -d $ip -j ACCEPT "); return $?;
system("iptables -t filter -D OUTPUT -d $ip -j ACCEPT "); return $?;

}
1;

Задача:
Осуществить нарезку скорости в linux по примеру FreeBSD.Биллинг заточен под FreeBSD, и имеются работающие скрипты под 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;

Перелистал кучу литературы, так ничего не осуществил ((((

Кто напишет скрипт и поможет разобраться - ВОЗНАГРАЖДЕНИЕ!!!

Аватар пользователя RedBeard

Re: HELP! Нарезка скорости в linux

Ну, средствами iptables - это вряд ли, это всеж-таки файер, а не бандорезка! А вот в Squid все, что тебе надо, есть! Правда и тут свои ограничения - в основе своей это HTTP прокси!

Аватар пользователя DRVTiny

HELP! Нарезка скорости в linux

На OpenNet'е данной тематике посвящены десятки объёмных (написанных, правда, довольно специфическим языком Улыбка ) "монографий". я не думаю, что стоит обсуждать столь всеобъемлющий и сложный вопрос здесь.
Впрочем, сразу скажу, что мне для ограничения скорости и для подсчёта трафика достаточно одного NeTAMS'а. Вообще NeTAMS - это своеобразный нонсенс: бесплатная программа с таким богатым функционалом, да ещё и собственным форумом бесплатной же тех.поддержки!

RSS-материал