LINUX.ORG.RU

Обрезка по скорости конкретного IP


0

0

#!/bin/bash
SHAPE_IP=айпишка которую режем
TC=/sbin/tc
iptables -t mangle -A FORWARD -s $SHARE_IP -j MARK --set-mark 1337
$TC qdisc del dev eth0 root handle 1: htb default 30
$TC qdisc add dev eth0 root handle 1: htb default 30
$TC class add dev eth0 parent 1: classid 1:1337 htb rate 1mbit ceil 1mbit burst 15k

Вот и мучает извечный вопрос русской интеллигенции, что делать и кто виноват?
Если серьезно то как порезать конкретную айпишку например до 64К?

anonymous

например можно с помощью cbq - предположим что интерфейс к пользователю - ppp0, его IP (пользователя) - 192.168.1.2, реальная скорость канала - 115 кбит, нужно ограничить до 64к

тогда на ppp0 вешаем шейпер:

tc qdisc del dev ppp0 root
tc qdisc add dev ppp0 root handle 1 cbq bandwidth 115Kbit avpkt 1000 cell 8
tc class change dev ppp0 root cbq weight 11.5Kbit allot 1514
tc class add dev ppp0 parent 1: classid 1:2 cbq bandwidth 115Kbit rate 64Kbit weight 6.4Kbit prio 1 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
tc qdisc add dev ppp0 parent 1:2 handle 2 tbf rate 64Kbit buffer 10Kb/8 limit 15Kb mtu 1500
tc filter add dev ppp0 parent 1:0 protocol ip prio 100 u32 match ip dst 192.168.1.2 classid 1:2

но имей ввиду - cbq ограничивает только исходящий трафик (в данном случае от сервера к клиенту), если нужно ограничить трафик от клиента нужно повесить еще один шейпер на интерфейс что смотрит в инет. Либо использовать IMQ. А вообще см. /etc/init.d/cbq

anonymous
()
Ответ на: комментарий от anonymous

Немного протупил, похоже у тебя канал = 1мбит, тогда это будет выглядеть так:


tc qdisc del dev ppp0 root
tc qdisc add dev ppp0 root handle 1 cbq bandwidth 1Mbit avpkt 1000 cell 8
tc class change dev ppp0 root cbq weight 100Kbit allot 1514

tc class add dev ppp0 parent 1: classid 1:2 cbq bandwidth 1Mbit rate 64Kbit weight 6.4Kbit prio 1 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
tc qdisc add dev ppp0 parent 1:2 handle 2 tbf rate 64Kbit buffer 10Kb/8 limit 15Kb mtu 1500
tc filter add dev ppp0 parent 1:0 protocol ip prio 100 u32 match ip dst 192.168.1.2 classid 1:2

anonymous
()
Ответ на: комментарий от anonymous

#!/bin/bash
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1 cbq bandwidth 1Mbit avpkt 1000 cell 8
tc class change dev eth0 root cbq weight 100Kbit allot 1514

tc class add dev eth0 parent 1: classid 1:2 cbq bandwidth 1Mbit rate 64Kbit weight 6.4Kbit prio 1 allot
1514 cell 8 maxburst 20 avpkt 1000 bounded
tc qdisc add dev eth0 parent 1:2 handle 2 tbf rate 64Kbit buffer 10Kb/8 limit 15Kb mtu 1500
tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip dst 192.168.101.7 classid 1:2

Громадное спасибо, режет исходящий траффик очень красиво, а как быть с входящим чтоды сделать тех же 64К? В идеале мне при коннектен юзера нужно делать нечто типа
#traflimit.sh [ip] [bandwidth]
Никто таким не занимался?

anonymous
()
Ответ на: комментарий от anonymous

я ж говорил, посмотри в сторону IMQ - http://www.linuximq.net/

там патчи для ядра и iptables, ASP Linux 10, кажется уже собран с их поддержкой.

эта штука создает виртуальный интерфейс, на который можно будет повесить шейпер чтобы ограничить скорость в обратном направлении, т.к. cbq может в любом случае ограничить только исходящий трафик. Это будет примерно так:


--- [INET] ---- [твой интернет интерфейс] --- [IMQ-интерфейс] --- [твой пользователь].

соответственно для ограничения скорости К клиенту ставишь шейпер на его интерфейс ( я описывал выше ), а для ограничения скорости ОТ клиента вешаешь аналогичный шейпер на IMQ интерфейс, т.к. входящий трафик от клиента к твоему серверу для IMQ интерфейса будет исходящим.

либо есть такой вариант


--- [INET] --- [твой роутер 1] --- [твой роутер2] -- клиенты

этот вариант более лучший, но соответственно требует 2х маршрутизатором вместо одного, и в данном случае шейпер будет устанавливаться на интерфейсы между роутером 1 и роутером 2.

либо еще как вриант можно повесить шейпер обратного трафика на твой интернет интерфейс.

anonymous
()
Ответ на: комментарий от anonymous

сорри, немного ошибся, первая схема такая:

--- [INET] ---- [твой интернет интерфейс] --- [IMQ-интерфейс] --- [интерфейс пользователя] --- [твой пользователь].

anonymous
()
Ответ на: комментарий от anonymous

а как считать параметры - см. скрипт /etc/init.d/cbq

anonymous
()
Ответ на: комментарий от anonymous

короче я так понимаю нормального продакшн решения под линукс не существует? Чтобы взять и порезать а не извращатся со всякими поделиями.

anonymous
()
Ответ на: комментарий от anonymous

что значит нормального решения? для нормального решения ставятся 2 тачки, на одной режется в одну сторону джля другой в другую. А для _НОРМАЛЬНОГО_ решения вообще не юзаются не винда не линукс, все режется железками типа Cisco.

anonymous
()
Ответ на: комментарий от anonymous

почему тогда с ipfw этоделается ровно одной строчкой без двух тачек и циски?

anonymous
()
Ответ на: комментарий от anonymous

>а как быть с входящим чтоды сделать тех же 64К?

маркируешь трафик на входе из локалки и делаешь тоже самое на внешнем и-фейсе, только фильтры ориентируешь на fwmark.

fagot ★★★★★
()
Ответ на: комментарий от anonymous

>для нормального решения ставятся 2 тачки

ты где это вычитал??? Или сам придумал? Если уж на то пошло, то _нормальный_ QoS ты и на трех тачках не получишь, а все остальное и на одной делается.

fagot ★★★★★
()
Ответ на: комментарий от fagot

>>маркируешь трафик на входе из локалки и делаешь тоже самое на внешнем и-фейсе, только фильтры ориентируешь на fwmark.

а можно практический пример например для зарезки 192.168.0.66 который воткнут в хаб смотрящий на eth0 учитывая что инет приходит с eth1 и трогать его не желательно?

anonymous
()
Ответ на: комментарий от anonymous

>практический пример

там их валом, учись читать.

function tcf() {
## Small wrapper for 'tc'

if ! $tc "$@" ; then
    echo "Failed on '$tc ${@}'"
    exit 1
fi
}

## Remove all existing settings
$tc qdisc del dev $dev root 2>/dev/null
$tc qdisc del dev $dev ingress 2>/dev/null

## Use ESFQ, if it is possible
leaf="sfq perturb 10"
modprobe sch_esfq && leaf="esfq hash $aDst perturb 10"

## Add root qdisc
tcf qdisc add dev $dev parent root handle 1: htb default 3
tcf class add dev $dev parent 1: classid 1:1 htb rate ${rate}Kbit

## Add client's class
tcf class add dev $dev parent 1:1 classid 1:2 htb rate 64Kbit
tcf qdisc add dev $dev parent 1:2 handle 2: $leaf

## Add default class
tcf class add dev $dev parent 1:1 classid 1:3 htb rate $[$rate-64]Kbit ceil ${ceil}Kbit
tcf qdisc add dev $dev parent 1:3 handle 3: $leaf

## Standart filter rules prefix
filter="tcf filter add dev $dev parent 1: protocol ip "

$filter handle 0x1 fw classid 1:2

Где-то так, думаю, со значением переменных разберешься. Вешаешь это на свои eth0 и eth1 и маркируешь client's трафик (надеюсь, показывать как не нужно?). 

Если я нигде не ошибся, ты получишь "выделенные" 64к входящих и исходящих у твоего клиента.

fagot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.