Нарезка скорости в linux (Вознаграждение 20$)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

NON-STOP
Сообщения: 15

Нарезка скорости в 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 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;
################################################################################

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

Кто напишет скрипт и поможет разобраться - ВОЗНАГРАЖДЕНИЕ и благодарности!!!
Спасибо сказали:
Аватара пользователя
keir
Сообщения: 317
ОС: linux

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

Сообщение keir »

Если при подключении к инету для каждого клиента создается отдельный интерфейс (ppp, например), то можно резать с помощью tc. Просто по ip - не знаю.
Trust №1
Спасибо сказали:
olmibest
Сообщения: 68

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

Сообщение olmibest »

http://netup.ru/articles.php?n=2
Суть в том что метиш пакеты от определенного адреса и делаеш с ними что хош.
Давай сюда 20 баков моя аська 311459406 жду :)
Спасибо сказали:
NON-STOP
Сообщения: 15

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

Сообщение NON-STOP »

olmibest писал(а):
24.11.2006 01:25
http://netup.ru/articles.php?n=2
Суть в том что метиш пакеты от определенного адреса и делаеш с ними что хош.
Давай сюда 20 баков моя аська 311459406 жду :)

отписал в аську, надеюсь что поможешь :o
Спасибо сказали:
olmibest
Сообщения: 68

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

Сообщение olmibest »

Если я не прав поправте.

192.168.0.0 городская сеть
192.168.1.0 клиенстская подсеть
Ограничение скорости на интерфейсе eth0(смотрит в локальную сеть)

#Создание очереди:
tc qdisc add dev eth0 root handle 1: htb
#Создание классов:
# С инета 256 килобит
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit burst 200k
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 256kbit burst 5k
#Далее создается фильтр, заворачивающий трафик в класс:
tc filter add dev eth0 parent 1: protocol ip prio 3 handle 1 fw classid 1:10

iptables -t mangle -I FORWARD 1 -s 0.0.0.0/0 -d (здесь Ip клиента/маска) -j MARK --set-mark 1


# С города 1 мегабит

tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1mbit burst 20k
tc filter add dev eth0 parent 1: protocol ip prio 3 handle 2 fw classid 1:11

iptables -t mangle -I FORWARD 1 -s 192.168.0.0/24 -d (здесь Ip клиента/маска) -j MARK --set-mark 2


# В интернет 128 и вгород

tc class add dev eth0 parent 1:1 classid 1:12 htb rate 128kbit burst 2k
tc filter add dev eth0 parent 1: protocol ip prio 3 handle 3 fw classid 1:12

iptables -t mangle -I FORWARD 1 -s (здесь Ip клиента/маска) -d 0.0.0.0/0 -j MARK --set-mark 3
Спасибо сказали: