Перейти до

Шейпинг


Рекомендованные сообщения

Подскажите плиз как это настроить.

 

Пока для меня вопрос как отметить(действие mark) правильно мои пакеты, сначала мне нужно отметить все пакеты от сети 192.168.0.0/16, потом от адресов 194.150.232.0/23, а весь трафик, который останется - как интернет.

 

Как это правильно сделать ? Хотел таким же способом, как и NAT у меня но не знаю как это правильно написать.

 

 

 

Так у меня проходит настройка фаера(все лишнее для INPUT,OUTPUT вырезал)

iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X

# Default Policy
iptables -t filter -P FORWARD DROP

#Нат, пропускаем мимо него пакеты с адресами 192.168.0.0/16 и 194.150.232.0/23
iptables -N nat_192_168 -t nat
iptables -N nat_194_150 -t nat
iptables -t nat -A POSTROUTING -o eth0 -j nat_192_168
iptables -t nat -A nat_192_168 -d ! 192.168.0.0/16 -j nat_194_150
iptables -t nat -A nat_194_150 -d ! 194.150.232.0/23 -j MASQUERADE

Ссылка на сообщение
Поделиться на других сайтах

как отметить правильно мои пакеты

через mangle

 

напиши нормально, что ты хочешь сделать

если хочешь через НАТ выруливать сетки, то можно через SNAT каждую сеть на разные внешние маршутизируемые IP, либо все под один, что не есть разумно.

Ссылка на сообщение
Поделиться на других сайтах

iptables -A PREROUTING -t mangle -p tcp -s твоя_сеть -j TOS --set-tos твой_tos

дальше пакеты попавшие под эти правила, буду промаркированы с именем TOS которое ты дал.

 

грамотно поставленный вопрос - 50% ответа.

Ссылка на сообщение
Поделиться на других сайтах
  • 2 weeks later...

подскажите пожалуйста, как правильно сделать шейпер на vpn

 

при этом пинг до сервера vpn поднимается сильно, как выличить?

 

SPEED=$5
IFNAME=$3
UNSPEED=$2

/sbin/tc qdisc del dev $3 root > /dev/null
/sbin/tc qdisc del dev $3 ingress > /dev/null
/sbin/tc qdisc add dev $3 root handle 1: htb default 20 r2q 1
/sbin/tc class add dev $3 parent 1: classid 1:1 htb rate "$2"kbit burst 4k
/sbin/tc class add dev $3 parent 1:1 classid 1:10 htb rate "$2"kbit burst 4k prio 1
/sbin/tc class add dev $3 parent 1:1 classid 1:20 htb rate "$2"kbit burst 4k prio 2
/sbin/tc qdisc add dev $3 parent 1:10 handle 10: sfq perturb 10 quantum 1500
/sbin/tc qdisc add dev $3 parent 1:20 handle 20: sfq perturb 10 quantum 1500
/sbin/tc filter add dev $3 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
/sbin/tc filter add dev $3 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
/sbin/tc filter add dev $3 parent 1: protocol ip prio 10 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u160x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10
/sbin/tc qdisc add dev $3 handle ffff: ingress
/sbin/tc filter add dev $3 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate "$5"kbit burst 12k drop flowid :1

Ссылка на сообщение
Поделиться на других сайтах

вот это тоже пинг повышает и режет как то криво

 

tc qdisc del dev $IFCE root
tc qdisc del dev $IFCE handle ffff: ingress
tc qdisc add dev $IFCE root tbf rate "$SPEED"kbit latency 50ms burst 40000

tc qdisc add dev $IFCE handle ffff: ingress
tc filter add dev $IFCE parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate "$UPSPEED"Kbit burst 4000 drop flowid :1

 

поделитеть ктонить нормальным творением

Ссылка на сообщение
Поделиться на других сайтах

/sbin/tc qdisc del dev $DEVICE root
/sbin/tc qdisc add dev $DEVICE root tbf rate ${DOWN}Kbit latency 50ms burst $[1500+$DOWN*10]
/sbin/tc qdisc del dev $DEVICE handle ffff: ingress
/sbin/tc qdisc add dev $DEVICE handle ffff: ingress
/sbin/tc filter add dev $DEVICE parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${UP}Kbit buffer $[7000+$UP*40] drop flowid :1

Размеры буферов подобраны экспериментально, методом проб и ошибок :)

Ссылка на сообщение
Поделиться на других сайтах

с этим скорость режет отлично а вот пинг до серверной стороны впна

Ответ от 192.168.100.1: число байт=32 время<1мс TTL=64
Превышен интервал ожидания для запроса.
Ответ от 192.168.100.1: число байт=32 время=152мс TTL=64
Ответ от 192.168.100.1: число байт=32 время=207мс TTL=64
Ответ от 192.168.100.1: число байт=32 время=90мс TTL=64
Ответ от 192.168.100.1: число байт=32 время<1мс TTL=64
Ответ от 192.168.100.1: число байт=32 время=203мс TTL=64
Ответ от 192.168.100.1: число байт=32 время=84мс TTL=64
Ответ от 192.168.100.1: число байт=32 время<1мс TTL=64
Ответ от 192.168.100.1: число байт=32 время=195мс TTL=64

Ссылка на сообщение
Поделиться на других сайтах

2ponomar: только что заново проверил, работает нормально с пингом <1 мсек с тем конфигом, что я привёл (у меня ось убунту сервер 7.10).

проблема явно у тебя в системе. Какой пинг, если отключить шейпер на впн? Опиши, какой линукс используешь.

Ссылка на сообщение
Поделиться на других сайтах
  • 1 month later...

Апну темку про шейпер в Linux.

Ось ASPLinux 12 (Carbon)

 

 

скрипты :

 

Shaper_and_Firewall:

 


#!/bin/bash


echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t mangle --flush

##########################  SHAPING ########################################
#shaping initialization

#deleting root qdisc
tc qdisc del dev eth0 handle ffff: ingress
tc qdisc del dev eth0 root handle 1: cbq avpkt 1000 bandwidth 100Mbit

#creating root qdisc
tc qdisc add dev eth0 handle ffff: ingress
tc qdisc add dev eth0 root handle 1: cbq avpkt 1000 bandwidth 100Mbit


 

 

OnConnect :

 



#!/bin/bash

int_iface=eth0

# Login
LOGIN=$1

#user IP
IP=$2

#cash
CASH=$3

#user ID
ID=$4

default_speed=32kbit



#=========  LIMIT =====================
usersconf="/var/stargazer/users/$LOGIN/conf"
usersstat="/var/stargazer/users/$LOGIN/stat"
anlim_key="anlim_"
logfile="/var/log/stargazer-test"

if [ ! -e "$usersconf" ]; then
  echo "ERROR: User file '$usersconf' not found" >> $logfile
  exit
fi

TariffName=`cat "$usersconf" | grep "Tariff=" | cut -d"=" -f2`

# limit
  if [ "_${TariffName#$anlim_key}" != "_${TariffName}" ]; then 
      limit_value=${TariffName:${#anlim_key}:4}       
     
      case $limit_value in 
           32) lim="4";;
    64) lim="8";;
  128) lim="16";;
  256) lim="32";;
  512) lim="64";;
1024) lim="128";;
      esac 

      
      limit="-m limit --limit ${lim}/s --limit-burst ${lim}0"
 fi
#=========  END of LIMIT ===============

declare -i mark=$ID+10

echo "$mark" > /var/stargazer/users/$LOGIN/shaper_mark
echo "$speedkb" > /var/stargazer/users/$LOGIN/shaper_rate

iptables -t mangle -D FORWARD -i eth0 -s $2 -j DROP
iptables -A FORWARD -i eth0 -s $2 -j ACCEPT
iptables -t nat -A POSTROUTING -s $2 -d 0/0 -o eth1 -j SNAT --to-source xx.xx.xx.xx

#individual shaper
tc class add dev eth0 parent 1: classid 1:$ID cbq rate "$limit_value"Kbit allot 1500 prio 3 bounded isolated
tc filter add dev eth0 parent 1: protocol ip prio 4 handle 800::$ID u32 match ip dst $IP flowid 1:$ID
tc filter add dev eth0 parent ffff: protocol ip prio 50 u32 match ip src $IP police rate "$limit_value"kbit burst 12k drop flowid :1

 

 

OnDisconnect:

 


#!/bin/bash

int_iface=eth0

# Login
LOGIN=$1

#user IP
IP=$2

#cash
CASH=$3

#user ID
ID=$4



mark=$(cat /var/stargazer/users/$LOGIN/shaper_mark)
rate=$(cat /var/stargazer/users/$LOGIN/shaper_rate)


if [ -n "$mark" ]
then
   
   iptables -t mangle -A FORWARD -i eth0 -s $2 -j DROP
   iptables -D FORWARD -i eth0 -s $2 -j ACCEPT
   while [ $? == 0 ]
   do
    iptables -D FORWARD -i eth0 -s $2 -j ACCEPT
   done
fi
iptables -t nat -D POSTROUTING -s $2 -d 0/0 -o eth1 -j SNAT --to-source xx.xx.xx.xx

case $limit_value in 
  32)  tt1="10";;
  64)  tt1="20";;
  128) tt1="30";;
  256) tt1="40";;
  512) tt1="50";;
 1024) tt1="60";;
esac

tc class del dev eth0 parent 1: classid 1:$ID cbq rate "$limit_value"Kbit allot 1500 prio 1 bounded isolated
tc filter del dev eth0 parent 1: protocol ip prio 4 handle 800::$ID u32 match ip dst $IP flowid 1:$ID
tc filter del dev eth0 parent ffff: protocol ip prio 50 u32 match ip src $IP police rate "$limit_value"Kbit burst 12k drop flowid :1

 

 

 

Теперь суть вопроса :

 

1. Не работает шейпер исходящего (с точки зрения клиента ) траффика.

2. Не убиваються при отсоединении пользователя классы шейпера, что делает невозможным смену скорости.

 

 

1. Идей нет.

2. Думаю @ порылась тут :

 

tc class del dev eth0 parent 1: classid 1:$ID cbq rate "$limit_value"Kbit allot 1500 prio 1 bounded isolated
tc filter del dev eth0 parent 1: protocol ip prio 4 handle 800::$ID u32 match ip dst $IP flowid 1:$ID
tc filter del dev eth0 parent ffff: protocol ip prio 50 u32 match ip src $IP police rate "$limit_value"Kbit burst 12k drop flowid :1

 

Так как сначала удляю класс, а потом фильтр. НО - если ставлю удалять сначала фильтр - система виснет наглухо при отключении N-ного клиента. Заметьте, что не первого, а второго, третьего и т.д.

 

Собственно интересует каким боком сделать шейпинг исходящего траффика ?

Ну и идеи по второму пункту.

Ссылка на сообщение
Поделиться на других сайтах

используй VPN подключеня или рррое, тогда то что в on.connect on.disconnect реализовать в up i down скриптах. и там же зделать обрезку входящева трафика на интерфейс, что смотрит на клиентов. В случае с VPN будет ррр0..N и усе!

Ссылка на сообщение
Поделиться на других сайтах

ankos, оно с одной стороны да. С другой Юзерам прийдется запускать вместо авторизатора ВПН соединение - это раз.

Вижу по крайней мере 2 минуса :

 

1. Для неопытных пользователей (а таких большинство) долго объяснять, что юзать локалку надо с выключенным ВПН.

2. Авторизатор довольно удобен для рассылки масс-сообщений.

 

Запускать 2 программы вместо 1, это целый геммор. Да и Админу прийдеться оббежать более 100 пользователей для настройки и долгих дебатов-объяснений пользователям.

 

Неужели нет никого , у кого бы нормально был реализован шейпер исходящего (от клиентов) траффика. Самое отстойное, что гугль по этому поводу молчит как партизан =( и кроме ingress вариантов я не нашел .

Ссылка на сообщение
Поделиться на других сайтах
1. Для неопытных пользователей (а таких большинство) долго объяснять, что юзать локалку надо с выключенным ВПН.

Разве?

Ссылка на сообщение
Поделиться на других сайтах

madf, Локальная сеть конечно будет доступна, а вот такие сервисы как DC++ нет , так как будут попадать под действия шейпера (скорее всего).

 

Второй вопрос в том - я так понял пользователю прийдеться :

а) Запустить авторизатор

б) Запустить Впн соединение

 

?

 

Ну и третий , чет как то мне мало представляеться бегающий админ в течении недели и настраивающий всем ВПН. Тут пару часов без инета и уже паника, а что говорить про неделю ....

 

 

И так , на будущее - я так понял входящий траффик к клиенту шейпить надо буит по eth0 , а исходящий от него по pppX ?

 

 

Если честно мне больше по душе простая идея с шейпингом траффика к клиенту по eth0, а от него по eth1 , но как тогда это реализовать без НАТ ?

Ссылка на сообщение
Поделиться на других сайтах

eth1.4 - локальный интерфейс

vpn1 - исходяший ифейс

При старте системы

 

tc qdisc add dev eth1.4 root handle 1: htb default 30000

tc class add dev eth1.4 parent 1: classid 1:1 htb rate 1000mbit burst 200k

tc qdisc add dev vpn1 root handle 1: htb default 30000

tc class add dev vpn1 parent 1: classid 1:1 htb rate 100mbit burst 500k

Скорость юзера берем с Userdata1

localhost init.d # cat /etc/stargazer/OnConnect

 

....

speed=`cat "$usercfg" | grep "Userdata1=" | cut -d"=" -f2`

if [ ! -z "$speed" ]; then

iptables -t mangle -A FORWARD -s $IP -o vpn1 -j MARK --set-mark $4

iptables -t mangle -A FORWARD -d $IP -i vpn1 -j MARK --set-mark $4

tc class add dev $iface parent 1:1 classid 1:$4 htb rate $speed burst 20k prio 2

tc filter add dev $iface parent 1: protocol ip prio 1 handle $4 fw flowid 1:$4

tc class add dev vpn1 parent 1:1 classid 1:$4 htb rate $speed burst 20k prio 2

tc filter add dev vpn1 parent 1: protocol ip prio 1 handle $4 fw flowid 1:$4

fi

.....

 

Думаю под себя перерисовать сможеш....

Ссылка на сообщение
Поделиться на других сайтах

Keen, ну тут все в принципе понятно. Для меня это идеальный вариант, вот только есть пара вопросов:

 

vpn1 - это твой интерфейс , смотрящий в нет ? тогда какими правилами фаера ты разрешаешь туда доступ юзерам ?

 

Если

iptables -A FORWARD -o vpn1 -s $yournet/24 -d 0/0 -j ACCEPT
iptables -t nat -A POSTROUTING -o vpn1 -j MASQUERADE
(или iptables -A POSTROUTING -o vpn1 -s $yournet/24 -d 0/0 -SNAT --to-source xx.xx.xx.xx) 

 

то шейпинг на vpn1 работать не будет, так как за НАТом (ну насколько я понял) .

 

Или есть какие-то другие варианты ?

Ссылка на сообщение
Поделиться на других сайтах

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

 

А также при помощи ВПН ты можеш выделить для инета одну скорость, для остальных другую скорость.

 

И при ВПН локалка должна работать! Поставь Самбу и дай каждому юзеру винсервер и вм будуь себя видеть.

 

Просто при ВПН ты наилучшим способом сможеш нарезать юзеру скорость, подилеть ее для пингов, ввв, ссш, игры, исмп т что угодно. И для каждого юзера сможеш обрезать входящий трафик.

 

Или юзай IMQ-вроде так. Только егта штука умеет резать входящий и исходящий трафик как нада. Но в настройках тяжелее!

 

Для eth0-n, с помощью tc, входящий трафик можно обрезать общий, например выделить только 10 мб или 5мб Оно так работает.

 

От так у меня организован скрипт он.конект:

#!/bin/bash

#Этот скрипт вызывается в момент, когда пользователь

#успешно прошел авторизацию на сервере. Задача скрипта - перестроить

#файрвол так, что бы пользователь получил доступ в интернет

 

# Login

LOGIN=$1

#user IP

IP=$2

#cash

CASH=$3

#user ID

ID=$4

#Selected dirs to connect

DIRS=$4

 

TC="/sbin/tc"

IPT="/usr/sbin/iptables"

userconf="/var/stargazer/users/$LOGIN/conf"

SHAP="Userdata0"

 

### Интрфейси ###

DEV0="eth0"

DEV1="eth1"

mir="xxx.xxx.xxx.xxx"

 

RATE_DOWN=`cat "$userconf" | grep "$SHAP=" | cut -d"=" -f2`

CEIL_DOWN=`cat "$userconf" | grep "$SHAP=" | cut -d"=" -f3`

RATE_UP=`cat "$userconf" | grep "$SHAP=" | cut -d"=" -f4`

CEIL_UP=`cat "$userconf" | grep "$SHAP=" | cut -d"=" -f5`

CLASS_ID=`cat "$userconf" | grep "$SHAP=" | cut -d"=" -f6`

 

$IPT -t mangle -D FORWARD -s $IP -j MARK --set-mark $CLASS_ID 2> /dev/null > /dev/null

 

$TC filter del dev $DEV0 parent 1:0 protocol ip prio 2 handle $CLASS_ID fw flowid 1:$CLASS_ID 2> /dev/null > /dev/null

$TC qdisc del dev $DEV0 parent 1:$CLASS_ID handle $CLASS_ID: sfq perturb 10 2> /dev/null > /dev/null

$TC class del dev $DEV0 parent 1:30 classid 1:$CLASS_ID htb rate $RATE_UP ceil $CEIL_UP 2> /dev/null > /dev/null

 

$TC class add dev $DEV0 parent 1:30 classid 1:$CLASS_ID htb rate $RATE_UP ceil $CEIL_UP

$TC qdisc add dev $DEV0 parent 1:$CLASS_ID handle $CLASS_ID: sfq perturb 10

$TC filter add dev $DEV0 parent 1:0 protocol ip prio 2 handle $CLASS_ID fw flowid 1:$CLASS_ID

 

$IPT -t mangle -A FORWARD -s $IP -j MARK --set-mark $CLASS_ID

 

$IPT -t filter -A INPUT -s $IP -j ACCEPT

$IPT -t filter -A FORWARD -s $IP -j ACCEPT

$IPT -t filter -A FORWARD -d $IP -j ACCEPT

$IPT -t filter -A OUTPUT -d $IP -j ACCEPT

 

$IPT -D FORWARD -i $DEV1 -s $IP -j  DROP

while [ $? -eq 0 ]

do

    $IPT -D FORWARD -i $DEV1 -s $IP -j DROP

done

 

$IPT -D FORWARD -o $DEV1 -d $IP -j  DROP

while [ $? -eq 0 ]

do

    $IPT -D FORWARD -o $DEV1 -d $IP -j DROP

done

 

$IPT -t nat -A POSTROUTING -s $IP -o $DEV0 -j SNAT --to-source $mir

 

echo "C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH" >> /var/stargazer/users/$LOGIN/connect.log

 

 

шейпер для eth1 у меня в другом скрипте который несвязан с онконнект и дисконнект. И там прописаны все правила для клиентов.

Ссылка на сообщение
Поделиться на других сайтах

ankos, умные свичи некатят. Они и так стоят, но если зарезать скорость по порту, то и локалка соответственно будет с низкой скоростью. Сервер и так стоит самба. Про ВПН и локалку - это я погорячился - признаю.

 

ВПН - не годиццо потому как уже подключено более 100 пользователей (цифра ближе к 200) и бегать к каждому ставить ВПН, потом объяснять каждому зачем это нужно .... в общем - не вариант (хотя после сегоднешних экспериментов - признаю шейпить намного удобнее ).

 

У тебя шейпер прописан статично ? Я так тоже делал, но как быть если юзеру вздумается изменить скорость ? это гемор для админа.

 

Я изначально делал шейпер в скриптах - все работало на Ура. Вот только для 30+ пользователей - норм - больше уже запары : изменение тарифа и прочее - лучше динамика. Для входящего и так все норм - хотелось бы еще и исходящий прикрутить. Тоже смотрел в поддержку IMQ, но для этого ядро вроде прийдеться пересобирать - а толком в этом не разбираюсь - делал то раза 2-3. На рабочей системе как-то не хочеться эксперементировать. За примеры спасиб - на будущее смотрю все же в сторону HTB.

 

Но вопрос с исходящим остаеться пока открытым.

Ссылка на сообщение
Поделиться на других сайтах

Я тоже сейчас задался вопросом зарезать исход, VPN не хочу юзать по тем же причинам что и у вас. Сейчас курю в сторону IFB. Пересобирать ядро и ставить самое свежее это неизбежные первые действия, т.к. этот модуль еще с недавного времени считался экспериментальным. Если что кто нароет - пишите я тоже не промолчу.

Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

×
×
  • Створити нове...