Титла: Шейпър за изтeгляне (download) и качване (upload)
Публикувано от: mystical в May 29, 2013, 22:55
Здравейте! Видях една интересна статия за линукс шейпър, която се намира на този адрес http://itservice-bg.net/?p=1596 ($2) и от няколко дена си блъскам главата с нея, но не мога да схвана логиката в цялата работа. Първо искам да покажа една част от кога: ### tc qdisc add dev eth0 root handle 1: htb default 1 tc qdisc add dev eth1 root handle 1: htb default 1
iptables -t mangle -A POSTROUTING -d 192.168.0.2 -j CLASSIFY --set-class 1:100 iptables -t mangle -A POSTROUTING -s 192.168.0.2 -j CLASSIFY --set-class 1:101 tc class add dev eth0 parent 1: classid 1:100 htb rate 10Mbit tc qdisc add dev eth0 parent 1:100 handle 100: sfq perturb 10 tc class add dev eth1 parent 1: classid 1:101 htb rate 10Mbit tc qdisc add dev eth1 parent 1:101 handle 101: sfq perturb 10 ###
Как си обеснявам нещата и къде греша. WAN=eth0 LAN=eth1 Upload tc class add dev eth0 parent 1: classid 1:100 htb rate 10Mbit tc qdisc add dev eth0 parent 1:100 handle 100: sfq perturb 10
Download tc class add dev eth1 parent 1: classid 1:101 htb rate 10Mbit tc qdisc add dev eth1 parent 1:101 handle 101: sfq perturb 10
iptables -t mangle -A POSTROUTING -d 192.168.0.2 -j CLASSIFY --set-class 1:100 Защо изходящия трафик от клиента се маркира на WAN, а не на eth1? Как става това, при положение, че -d означава "адрес на получателя" и това би трябвало да са пакети, които вече се връщат към клиента? iptables -t mangle -A POSTROUTING -s 192.168.0.2 -j CLASSIFY --set-class 1:101 Съответно, защо входящия трафик на клиента се маркира на LAN и как става това? -s - "адрес на източника", не трябва ли това да са пакетите, които клиента изпраща (upload)? Ще има ли ефек от цялата работа, при положение, че пакетът вече е преминал през WAN и се е консумирал реален трафик, а в последствие (на eth1) се е образувала опашка, която изкуствено се забавя да достигне клиента. Пробвах с обърнат WAN и LAN тогава не работи.
Титла: Re: Шейпър за изтeгляне (download) и качване (upload)
Публикувано от: sudo в May 30, 2013, 15:08
По принцип си прав че "iptables .... -s $PRIVATE_NET ..." е изходящия трафик (при няколко условия) а "iptables .... -d $PRIVATE_NET ..." e входящия трафик, но ти защо реши че WAN=eth0 a LAN=eth1 ? Ще има ли ефект от цялата работа, при положение, че пакетът вече е преминал през WAN и се е консумирал реален трафик, а в последствие (на eth1) се е образувала опашка, която изкуствено се забавя да достигне клиента. Трафик шейпъра в Линукс "tc" работи на база egress ( man tc ... Shaping occurs on egress...) т.е. на български, работи в/у изходящ трафик, няма значение накъде ще го праща: прави опашка в/у интерфейса от където ще замине трафика и така реално го контролира.
Титла: Re: Шейпър за изтeгляне (download) и качване (upload)
Публикувано от: samiboy в May 30, 2013, 22:37
Аз съм автора на поста и тъй като не рабирам точно въпроса ще копна целия скрипт който се състой от два файла. Изпълним: /etc/init.d/netscript GeSHi (Bash): #!/bin/bash clear LOG=/var/log/router.log DB=/etc/ipclient DEV1=eth0 DEV2=eth1 SPEED1_IN=50Mbit SPEED1_OUT=30Mbit SPEED2_IN=70Mbit SPEED2_OUT=45Mbit BURST=2Mbit TUN="1 2 3 4"; echo "check duplicate LAN ip address" DUPLICATE=$(cat $DB | awk '{ print $1 }' | cut -d"#" -f2 | sort | uniq -d) for i in ${DUPLICATE}; do if [ "$DUPLICATE" = "$DUPLICATE" ]; then echo "Duplicate IP address: ${i} Script will not run" exit 1 fi done; echo "flush GLOBAL FIREWALL rules" iptables -F iptables -F -t nat iptables -F -t mangle iptables -X iptables -X -t nat iptables -X -t mangle iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT echo "start NAT clients rules" ADDR=$(grep -v \# $DB | grep speed | awk '{ print $1 }') for IP in $ADDR; do WAN=$(grep -v \# $DB | grep -w $IP | awk '{ print $2 }') iptables -t nat -A POSTROUTING -s $IP -o $DEV2 -j SNAT --to $WAN iptables -t nat -A PREROUTING -d $WAN -i $DEV2 -j DNAT --to $IP done; echo "start table T1 clients rules" ADDR=$(grep -v \# $DB | grep T1 | awk '{ print $1 }') for IP in $ADDR; do iptables -A PREROUTING -t mangle -s $IP -j MARK --set-mark 101 done; echo "start GLOBAL TRAFFIC SHAPER rules" tc qdisc del dev $DEV1 root 2>/dev/null tc qdisc add dev $DEV1 root handle 1: htb r2q 625 default 65 tc class add dev $DEV1 parent 1: classid 1:1 htb rate 1000Mbit tc qdisc del dev $DEV2 root 2>/dev/null tc qdisc add dev $DEV2 root handle 1: htb r2q 625 default 65 tc class add dev $DEV2 parent 1: classid 1:1 htb rate 1000Mbit echo "start TRAFFIC SHAPER IP speed1" ADDR=$(grep -v \# $DB | grep speed1 | awk '{ print $1 }') for IP in $ADDR; do MARK=$(cat $DB | grep -w -n $IP | cut -d":" -f1) UP=$(($MARK + 1000)) DOWN=$(($MARK + 3000)) iptables -t mangle -A POSTROUTING -d $IP -j CLASSIFY --set-class 1:$UP tc class add dev $DEV1 parent 1:1 classid 1:$UP htb rate $SPEED1_IN tc qdisc add dev $DEV1 parent 1:$UP handle $UP: sfq iptables -t mangle -A POSTROUTING -s $IP -j CLASSIFY --set-class 1:$DOWN tc class add dev $DEV2 parent 1:1 classid 1:$DOWN htb rate $SPEED1_OUT tc qdisc add dev $DEV2 parent 1:$DOWN handle $DOWN: sfq done; echo "start TRAFFIC SHAPER IP speed2" ADDR=$(grep -v \# $DB | grep speed2 | awk '{ print $1 }') for IP in $ADDR; do MARK=$(cat $DB | grep -w -n $IP | cut -d":" -f1) UP=$(($MARK + 1000)) DOWN=$(($MARK + 3000)) iptables -t mangle -A POSTROUTING -d $IP -j CLASSIFY --set-class 1:$UP tc class add dev $DEV1 parent 1:1 classid 1:$UP htb rate $SPEED2_IN tc qdisc add dev $DEV1 parent 1:$UP handle $UP: sfq iptables -t mangle -A POSTROUTING -s $IP -j CLASSIFY --set-class 1:$DOWN tc class add dev $DEV2 parent 1:1 classid 1:$DOWN htb rate $SPEED2_OUT tc qdisc add dev $DEV2 parent 1:$DOWN handle $DOWN: sfq done; echo "start TRAFFIC SHAPER tunnels" for i in $TUN; do iptables -t mangle -A POSTROUTING -o tun$i -j CLASSIFY --set-class 1:600$i tc qdisc del dev tun$i root 2>/dev/null tc qdisc add dev tun$i root handle 1: htb r2q 625 default 65 tc class add dev tun$i parent 1: classid 1:600$i htb rate $SPEED1_IN tc qdisc add dev tun$i parent 1:600$i handle 600$i: sfq tc qdisc del dev tun$i handle ffff: ingress 2>/dev/null tc qdisc add dev tun$i handle ffff: ingress tc filter add dev tun$i parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 \ police rate $SPEED1_OUT burst $BURST drop flowid :1 iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o tun$i -j TCPMSS --clamp-mss-to-pmtu done; echo "start LOGING" SP1=$(grep -v \# $DB | grep speed1 | wc -l) SP2=$(grep -v \# $DB | grep speed2 | wc -l) T1=$(grep -v \# $DB | grep T1 | wc -l) ALL=$(grep -v \# $DB | wc -l) echo "$(date +'%F %T')" netscript Sp1:$SP1 Sp2:$SP2 T1:$T1 All:$ALL Conn:"$(conntrack -C)" >> $LOG echo Sp1:$SP1 Sp2:$SP2 T1:$T1 All:$ALL
конфигурационен: /etc/ipclient 10.123.7.24 93.155.130.65 speed1 10.127.10.8 93.155.130.66 speed1 10.124.3.2 93.155.130.67 speed1 10.129.13.8 93.155.130.68 speed1 10.129.3.7 93.155.130.69 speed2 10.123.11.2 93.155.130.70 speed2
eth0 е LAN а eth1 е WAN
Титла: Re: Шейпър за изтeгляне (download) и качване (upload)
Публикувано от: mystical в May 30, 2013, 23:58
Трафик шейпъра в Линукс "tc" работи на база egress ( man tc ... Shaping occurs on egress...) т.е. на български, работи в/у изходящ трафик, няма значение накъде ще го праща: прави опашка в/у интерфейса от където ще замине трафика и така реално го контролира.
sudo, благодаря ти за пояснението. Аз съм автора на поста и тъй като не разбирам точно въпроса ще копна целия скрипт който се състой от два файла.
samiboy, благодаря ти за чудесните статии. Радвам се, че има хора, които обичат да споделят опита си. От доста години използвам линукс, но повърхностно и вече реших да навляза малко по-навътре в нещата. Това е първата ми среща с iproute2 и по конкретно tc. В момента всичко ми изглежда объркано, но се надявам с времето всичко да си дойде на мястото. В момента чета за tc и все още не мога да преценя, кой е по-добрия метод за да направиш работещ и грамотен шейпър. Разбрах само, че повечето избягват " tc filter", но незнам защо и предпочитат "iptables ... --set-mark". Също видях, че има вариант за приоритизиране на пакетите с TOS "iptables -t mangle -A CHKTOS -p icmp -j TOS --set-tos Minimize-Delay". Има много варианти, но незнам кой е по-добрия и защо да избера точно него, а не някой от станалите. Ако някой сподели опита си ще се радвам.
Титла: Re: Шейпър за изтeгляне (download) и качване (upload)
Публикувано от: samiboy в May 31, 2013, 13:05
В този вариант на shaper няма никакви приоритизации. Може да се добави prio 0 за по голямата тарифа и prio 7 за по малката с цел да може да се гарантира по някакъв начин трафика на хората които плащат повече. Когато клиентите минаха бройката 500 и 400mb/s трафик shaper-a не се чупи но CPU-то (Quad Core) започва да влиза в 60-70% load. Просто правилата стават много (около 4000) и това е границата на непрофесионалните решения. Между другото скрипта на vladsun е съвършенно различен и работи в пъти по добре защото съкращава правилата (намалява с около 30% load на CPU) но този скрипт изчезна и няма намиране. Същата тази машина в момента е с около 700 клиента и е с това решение на MIkroTik GeSHi (Bash): /ip firewall mangle add action=mark-connection chain=forward comment=50Mbits new-connection-mark=50M src-address-list=50M add action=mark-packet chain=forward connection-mark=50M new-packet-mark=50M passthrough=no add action=mark-connection chain=forward comment=70Mbits new-connection-mark=70M src-address-list=70M add action=mark-packet chain=forward connection-mark=70M new-packet-mark=70M passthrough=no /queue type add kind=pcq name=PCQ_down_50M pcq-classifier=dst-address pcq-rate=50M add kind=pcq name=PCQ_up_50M pcq-classifier=src-address pcq-rate=50M add kind=pcq name=PCQ_down_70M pcq-classifier=dst-address pcq-rate=70M add kind=pcq name=PCQ_up_70M pcq-classifier=src-address pcq-rate=70M /queue tree add name=Download parent=ether1 priority=1 add name=down_50M packet-mark=50M parent=Download queue=PCQ_down_50M add name=Upload parent=ether2 priority=1 add name=50M packet-mark=50M parent=Upload queue=PCQ_up_50M add name=down_70M packet-mark=70M parent=Download queue=PCQ_down_70M add name=70M packet-mark=70M parent=Upload queue=PCQ_up_70M /ip firewall address-list add address=10.123.3.10 list=50M add address=10.123.1.18 list=50M add address=10.127.6.11 list=50M add address=10.123.2.22 list=70M add address=10.123.8.22 list=70M
Това решение е уникално защото с 10-тина правила въртим трафик на address-list-а от 700 клиента. load на CPU в случая е 25~30% при 70 000~100 000 connections и 100 000~120 000 pps при 350~400mbits трафик. Ролята на iptables в комбинация с shaper в Linux освен, че маркира пакета следи за състоянието на връзката а filter в tc не прави това. Поради тази причина стрелката в speedtest кове с iptables и шари с filter в tc. Приотизирането на трафика все още е спор дали е правилен ход или не защото на теория си мислиш едно но на практика излиза съвсем друго. Най елементарния пример е, че ограничаваш едни клиенти за един ресурс които в 99% процента от случайте е свободен. Аз например единствената приоритизация която признавам е VOIP за другото няма никакъв смисъл !!! Моят съвет е да си избереш една network OS от рода на vyatta, mikrotik, pfsence да и прочетеш документацията и да си свършиш работа.
Титла: Re: Шейпър за изтeгляне (download) и качване (upload)
Публикувано от: mystical в May 31, 2013, 19:43
Благодаря за информацията. Между другото скрипта на vladsun е съвършенно различен и работи в пъти по добре защото съкращава правилата (намалява с около 30% load на CPU) но този скрипт изчезна и няма намиране.
Видях, че има сатия писана от vladsun във форума " Използване на IPSET, IPTABLES и IPMARK ($2) и Оптимизация на iptables и tc правила ($2) " , но незнам дали става въпрос за същото или има и нещо по-ново. Даже да става въпрос за същото, в момента ми е мъгливо с tc, а за нещата които са писани там, ще ми трябва още време. Приотизирането на трафика все още е спор дали е правилен ход или не защото на теория си мислиш едно но на практика излиза съвсем друго. Най елементарния пример е, че ограничаваш едни клиенти за един ресурс които в 99% процента от случайте е свободен. Аз например единствената приоритизация която признавам е VOIP за другото няма никакъв смисъл !!!
Напълно съм съгласен. Можеби проблема идва от това, че ако си малък доставчик или доставчик от малък град, чисто финансово не можеш да си позволиш, да оставиш клиентите да ползват скорости без шейпър. Понеже цените на трафика са страшно високи все още, ако не си в голям град. Иначе кой доставчик иска да налива пари за оборудване, и да се занимава с безсмислени неща, вместо клиентите да са доволни и да идват други понеже могат да позват интернет на воля. Моят съвет е да си избереш една network OS от рода на vyatta, mikrotik, pfsence да и прочетеш документацията и да си свършиш работа.
Като идея е добре, но от доста години ползвам debian и там ми е по-конфортно.
Титла: Re: Шейпър за изтeгляне (download) и качване (upload)
Публикувано от: mystical в Jun 30, 2013, 00:11
След дълго четене и ровене в интернет, реших, че варианта, който е описал VladSun е добър избор (линковете към неговите статии може да намерите в предишния пост), а именно използване на IPMARK. IPMARK не идва като част от iptables, поради което трябва да се инсталира допълнително. За да тествам как работи IPMARK написах едно малко скрипче на Python, но възникнаха някои въпроси по време на този процес. За тези, които искат да използват IPMARK и се борят, да разберат на какъв принцип работи всичко, искам да обясня на кратко какво съм разбрал. Система: Debian 3.2.46-1 x86_64 Инсталиране на IPMARK (copy-paste): -------------------------------------------------------------------------------- aptitude update aptitude install module-assistant xtables-addons-source xtables-addons-common m-a prepare m-a auto-install xtables-addons-source depmod -a -------------------------------------------------------------------------------- Източник: Установка модуля IPMARK для iptables в Debian Squeeze и shaper tc без нагрузки на процессор - See more at: http://linuxsnippets.net/ru/node/268#sthash.TbbGwjXr.dpuf ($2) Исталиране на необходим модул за Python: apt-get install python-ipcalc Ето и тестовия скрипт: GeSHi (Python): #!/usr/bin/env python import ipcalc IFACE_INTERNAL = "eth0" IFACE_EXTERNAL = "eth1" DOWN_SPEED = "8Mbit" UP_SPEED = "4Mbit" ip = "10.111.1.2" mask = 24 net = ipcalc.Network(ip, mask) ip_version = net.version() if ip_version == 4: ip = ipcalc.IP(ip) ipmark_hex = ip.hex()[4:8] # Upload Speed Rule ipmark_up = 'iptables -t mangle -A FORWARD -s ' + "10.111.1.0/24" + ' -j IPMARK --addr=src --and-mask=0xffff --or-mask=0x10000' tc_up = [] tc_up += ['tc qdisc add dev ' + IFACE_EXTERNAL + ' root handle 1: htb'] tc_up += ['tc filter add dev ' + IFACE_EXTERNAL + ' parent 1:0 protocol ip prio 1 fw'] tc_up += ['tc class add dev ' + IFACE_EXTERNAL + ' parent 1: classid 1:' + ipmark_hex + ' htb rate ' + UP_SPEED] tc_up += ['tc qdisc add dev ' + IFACE_EXTERNAL + ' parent 1:' + ipmark_hex + ' handle ' + ipmark_hex + ' sfq perturb 10'] # Download Speed Rule ipmark_down = 'iptables -t mangle -A FORWARD -d ' + "10.111.1.0/24" + ' -j IPMARK --addr=dst --and-mask=0xffff --or-mask=0x10000' tc_down = [] tc_down += ['tc qdisc add dev ' + IFACE_INTERNAL + ' root handle 1: htb'] tc_down += ['tc filter add dev ' + IFACE_INTERNAL + ' parent 1:0 protocol ip prio 1 fw'] tc_down += ['tc class add dev ' + IFACE_INTERNAL + ' parent 1: classid 1:' + ipmark_hex + ' htb rate ' + DOWN_SPEED] tc_down += ['tc qdisc add dev ' + IFACE_INTERNAL + ' parent 1:' + ipmark_hex + ' handle ' + ipmark_hex + ' sfq perturb 10'] print '===========' print 'hex.......:', ip.hex() print '===========' print 'IPMARK Rule UP:', ipmark_up print 'TC Rules UP:', tc_up print '===========' print 'IPMARK Rule DOWN:', ipmark_down print 'TC Rules DOWN:', tc_up print '==========='
Изхода от скрипта е: =========== hex.......: 0a6f0102 =========== IPMARK Rule UP: iptables -t mangle -A FORWARD -s 10.111.1.0/24 -j IPMARK --addr=src --and-mask=0xffff --or-mask=0x10000 TC Rules UP: ['tc qdisc add dev eth1 root handle 1: htb', 'tc filter add dev eth1 parent 1:0 protocol ip prio 1 fw', 'tc class add dev eth1 parent 1: classid 1:0102 htb rate 4Mbit', 'tc qdisc add dev eth1 parent 1:0102 handle 0102 sfq perturb 10'] =========== IPMARK Rule DOWN: iptables -t mangle -A FORWARD -d 10.111.1.0/24 -j IPMARK --addr=dst --and-mask=0xffff --or-mask=0x10000 TC Rules DOWN: ['tc qdisc add dev eth0 root handle 1: htb', 'tc filter add dev eth0 parent 1:0 protocol ip prio 1 fw', 'tc class add dev eth0 parent 1: classid 1:0102 htb rate 8Mbit', 'tc qdisc add dev eth0 parent 1:0102 handle 0102 sfq perturb 10'] ===========
Искам да уточня, че скрипта не изпълнява командите, а само събира стойностите и ги извежда в удобен вариант за copy-paste. Какво прави скрипта? Имаме едно тестово IP - 10.111.1.2, за което предварително сме дигнали рутиране. На 19-ти ред от скрипта взимаме това IP и го превръщаме в hex (hex.......: 0a6f0102) след което от тази стойност взимаме и използваме само последните 4 символа (0102). Това ми стана ясно от статията, която посочих по-горе, но от това което е обяснил VladSun за траснирането не можах да разбера нищо. Ако някой може да обясни разликата между този начин на прихващане на пакетите и този на VladSun, ще е полезно. В коя верига е по-добре да се прихванат пакетите - PREROUTING, POSTROUTING или FORWRD и защо? Също не ми стана ясно, защо добавяме "tc qdisc add dev eth1 parent 1:0102 handle 0102 sfq perturb 10" при положение, че шейпъра работи и без това правило, каква е идеята. Благодаря!
Титла: Re: Шейпър за изтeгляне (download) и качване (upload)
Публикувано от: mystical в Apr 15, 2015, 08:09
Видях интересна програма (и преди я бях видял, но не обърнах внимание), която генерира u32 хеш филтри http://vcalinus.gemenii.ro/ ($2)
Някой да я е пробвал?
Титла: Re: Шейпър за изтeгляне (download) и качване (upload)
Публикувано от: edmon в Apr 15, 2015, 08:59
Хората предпочитат IPMARK щото не могат да разберат как работи hash функцията на tc filter. Ето сега една моя измишльотина. #!/bin/bash tc="/sbin/tc" #tc="/bin/echo /sbin/tc"
$tc qdisc del dev eth1 root $tc qdisc del dev eth0 root
$tc qdisc add dev eth1 root handle 1: htb default 90 $tc class add dev eth1 parent 1:0 classid 1:1 htb rate 1000mbit
$tc qdisc add dev eth0 root handle 1: htb default 90 $tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1000mbit
$tc filter add dev eth1 parent 1:0 prio 10 protocol ip u32 $tc filter add dev eth1 parent 1:0 protocol ip prio 10 handle 8: u32 divisor 8
for i in {1..7}; do $tc filter add dev eth1 parent 1:0 prio 10 handle ${i}: protocol ip u32 divisor 256 done
$tc filter add dev eth1 parent 1:0 protocol ip prio 10 u32 ht 800:: match ip dst 101.101.172.0/24 hashkey mask 0x000000ff at 16 link 7:
for i in {1..7}; do
$tc filter add dev eth1 parent 1:0 protocol ip prio 10 \ u32 ht 8:$[i]: \ match ip dst 192.168.${i}.0/24 \ hashkey mask 0x000000ff at 16 \ link $i:
done
$tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 ht 800:: \ match ip dst 192.168.0.0/21 \ hashkey mask 0x00000700 at 16 link 8:
# class 1: 1000 --- parent for clients' classes: $tc class add dev eth1 parent 1:1 classid 1:1000 htb rate 220mbit quantum 1500 $tc qdisc add dev eth1 parent 1:1000 handle 1000 sfq perturb 10
$tc class add dev eth1 parent 1:1 classid 1:3000 htb rate 200mbit quantum 1500 $tc qdisc add dev eth1 parent 1:3000 handle 3000 sfq perturb 10
# # particular client: for i in {1..7} do for y in {2..254} do hy=$(printf "%x\n" $y) l=1000 k=3000 m=$((m+1)) z=$(($l+$m)) x=$(($k+$m)) #echo $z $tc class add dev eth1 parent 1:1000 classid 1:${z} htb rate 100kbit ceil 25mbit burst 1600kb cburst 1600kb $tc qdisc add dev eth1 parent 1:${z} handle ${z}: sfq perturb 10 $tc filter add dev eth1 protocol ip parent 1:0 prio 100 u32 ht ${i}:${hy}: match ip tos 0x00 0xff match ip dst 192.168.${i}.${y} flowid 1:${z}
$tc class add dev eth1 parent 1:3000 classid 1:${x} htb rate 28kbit ceil 20mbit burst 1600kb cburst 1600kb $tc qdisc add dev eth1 parent 1:${x} handle ${x}: sfq perturb 10 $tc filter add dev eth1 protocol ip parent 1:0 prio 100 u32 ht ${i}:${hy}: match ip tos 0x20 0xff match ip dst 192.168.${i}.${y} flowid 1:${x}
$tc class add dev eth0 parent 1:232 classid 1:${z} htb rate 1mbit ceil 18mbit $tc qdisc add dev eth0 parent 1:${z} handle ${z}: sfq perturb 10 $tc filter add dev eth0 protocol ip parent 1:0 prio 100 handle ${m} fw flowid 1:${z}
echo -ne i ${i} y ${y} z ${z} x ${x} z ${z} hy ${hy} m ${m} \\r
done
done
for y in 7 12 13 {19..27} {33..64} do hy=$(printf "%x\n" $y) l=5000 k=7000 m=$((m+1)) z=$(($l+$m)) x=$(($k+$m))
$tc class add dev eth1 parent 1:1000 classid 1:${z} htb rate 215kbit ceil 25mbit burst 1600kb cburst 1600kb $tc qdisc add dev eth1 parent 1:${z} handle ${z}: sfq perturb 10 $tc filter add dev eth1 protocol ip parent 1:0 prio 100 u32 ht 7:${hy}: match ip tos 0x00 0xff match ip dst 101.101.172.${y} flowid 1:${z}
$tc class add dev eth1 parent 1:3000 classid 1:${x} htb rate 48kbit ceil 20mbit burst 1600kb cburst 1600kb $tc qdisc add dev eth1 parent 1:${x} handle ${x}: sfq perturb 10 $tc filter add dev eth1 protocol ip parent 1:0 prio 100 u32 ht 7:${hy}: match ip tos 0x20 0xff match ip dst 101.101.172.${y} flowid 1:${x}
$tc class add dev eth0 parent 1:232 classid 1:${z} htb rate 1mbit ceil 18mbit $tc qdisc add dev eth0 parent 1:${z} handle ${z}: sfq perturb 10 $tc filter add dev eth0 protocol ip parent 1:0 prio 99 u32 match ip src 91.201.172.${y} flowid 1:${z}
done
Имаше и някви правила за uplad обаче там нещата са грозни и трябва да се слагат марки за всики потоци към ип от лана и после да се слагат правила с fwmark :) Има по два родителски класа, защото интернет идва по БГ и ИНТ, като на интерфейсите с аиптейбълс са маркирани с ТОС. :)
|