В отличии от серверной ситуации, домашний ПК не пропускает через себя трафик локальной сети. Это дает возможность значительно упростить составление скрипта.
Вместо вступления.
То что машина является конечным потребителем сети, не отбивает желание не мешать самому себе. Т.е. как правило торрент на домашней машине молотит без каких-либо ограничений, но вот посерфить в такой ситуации весьма проблематично, и т.д. Если вы читаете этот пост, у вас найдется множество своих примеров.
В данном скрипте выделены ssh, http, ftp, mail, rsync.
Скрипт специально оформлен без функций и виде BASH, это позволить разместить скрипт где нужно:
1. в /etc/init.d/shaping.sh = где ему и место
2. в /etc/ppp/ip-up.d/shaping.sh = для xDSL (ADSL,iDSL) или VPN
#!/bin/bash
inet_iface="dev ppp0"
inet_vface="dev ifb0"
$totc="/sbin/tc"
$tcfi="/sbin/tc filter add"
$tclc="/sbin/tc class add"
$tcqd="/sbin/tc qdisc add"
speed_full="6144kbit"
speed_start="600kbit"
$IP="protocol ip"
cur_cl_id=2
SP_start_full="rate $speed_start ceil $speed_full"
/sbin/tc qdisc del $inet_iface root
/sbin/tc qdisc del $inet_iface ingress
/sbin/tc qdisc del $inet_vface root
/sbin/modprobe ifb
ip link set $inet_vface up
# Перенаправить все IP пакеты, приходящие в ppp0, на ifb0
$tcqd $inet_iface handle ffff: ingress
$tcfl $inet_iface parent ffff: $IP u32 match u32 0 0 action \
mirred egress redirect $inet_vface
$tcqd $inet_vface root handle 1: htb
# начальные (корневые) классы
$tclc $inet_vface parent 1: classid 1:1 htb rate $speed_full ceil $speed_full
$tclc $inet_iface parent 1: classid 1:1 htb rate $speed_full ceil $speed_full
let " cur_cl_id+=1 "
### for ssh trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 1
#filter
#ssh stand
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$cur_cl_id
#ssh advance
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip dport 1024 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip sport 1024 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for ssh trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 1
#filter
#ssh stand
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$cur_cl_id
# ssh advance
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip dport 1024 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip sport 1024 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=1 "
### for http trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 3
#filter
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip dport 80 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip dport 443 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for http trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 3
#filter
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip sport 80 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip sport 443 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=1 "
### for ftp trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 6
#filter
$tcfl $inet_iface $IP parent 1: prio 6 u32 match ip dport 20 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 6 u32 match ip dport 21 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for ftp trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 6
#filter
$tcfl $inet_vface $IP parent 1: prio 6 u32 match ip sport 20 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 6 u32 match ip sport 21 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=1 "
### for mail trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 4
#filter
$tcfl $inet_iface $IP parent 1: prio 4 u32 match ip dport 25 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 4 u32 match ip dport 465 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for mail trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 4
#filter
# IMAP
$tcfl $inet_vface $IP parent 1: prio 4 u32 match ip sport 143 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 4 u32 match ip sport 220 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 4 u32 match ip sport 993 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=1 "
### for rsync trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 5
#filter
$tcfl $inet_iface $IP parent 1: prio 5 u32 match ip sport 873 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 5 u32 match ip dport 873 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for rsync trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 5
#filter
$tcfl $inet_vface $IP parent 1: prio 5 u32 match ip sport 873 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 5 u32 match ip dport 873 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=5 "
### for defaul trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 9
#filter
$tcfl $inet_iface $IP parent 1: prio 9 u32 match ip dst 0.0.0.0/0 flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for default trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 9
#filter
$tcfl $inet_vface $IP parent 1: prio 9 u32 match ip dst 0.0.0.0/0 flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
За дополнительной информацией следует обратиться к LARTC.org
Вместо вступления.
То что машина является конечным потребителем сети, не отбивает желание не мешать самому себе. Т.е. как правило торрент на домашней машине молотит без каких-либо ограничений, но вот посерфить в такой ситуации весьма проблематично, и т.д. Если вы читаете этот пост, у вас найдется множество своих примеров.
В данном скрипте выделены ssh, http, ftp, mail, rsync.
Скрипт специально оформлен без функций и виде BASH, это позволить разместить скрипт где нужно:
1. в /etc/init.d/shaping.sh = где ему и место
2. в /etc/ppp/ip-up.d/shaping.sh = для xDSL (ADSL,iDSL) или VPN
#!/bin/bash
inet_iface="dev ppp0"
inet_vface="dev ifb0"
$totc="/sbin/tc"
$tcfi="/sbin/tc filter add"
$tclc="/sbin/tc class add"
$tcqd="/sbin/tc qdisc add"
speed_full="6144kbit"
speed_start="600kbit"
$IP="protocol ip"
cur_cl_id=2
SP_start_full="rate $speed_start ceil $speed_full"
/sbin/tc qdisc del $inet_iface root
/sbin/tc qdisc del $inet_iface ingress
/sbin/tc qdisc del $inet_vface root
/sbin/modprobe ifb
ip link set $inet_vface up
# Перенаправить все IP пакеты, приходящие в ppp0, на ifb0
$tcqd $inet_iface handle ffff: ingress
$tcfl $inet_iface parent ffff: $IP u32 match u32 0 0 action \
mirred egress redirect $inet_vface
$tcqd $inet_vface root handle 1: htb
# начальные (корневые) классы
$tclc $inet_vface parent 1: classid 1:1 htb rate $speed_full ceil $speed_full
$tclc $inet_iface parent 1: classid 1:1 htb rate $speed_full ceil $speed_full
let " cur_cl_id+=1 "
### for ssh trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 1
#filter
#ssh stand
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$cur_cl_id
#ssh advance
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip dport 1024 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip sport 1024 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for ssh trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 1
#filter
#ssh stand
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$cur_cl_id
# ssh advance
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip dport 1024 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip sport 1024 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=1 "
### for http trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 3
#filter
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip dport 80 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 1 u32 match ip dport 443 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for http trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 3
#filter
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip sport 80 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 1 u32 match ip sport 443 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=1 "
### for ftp trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 6
#filter
$tcfl $inet_iface $IP parent 1: prio 6 u32 match ip dport 20 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 6 u32 match ip dport 21 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for ftp trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 6
#filter
$tcfl $inet_vface $IP parent 1: prio 6 u32 match ip sport 20 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 6 u32 match ip sport 21 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=1 "
### for mail trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 4
#filter
$tcfl $inet_iface $IP parent 1: prio 4 u32 match ip dport 25 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 4 u32 match ip dport 465 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for mail trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 4
#filter
# IMAP
$tcfl $inet_vface $IP parent 1: prio 4 u32 match ip sport 143 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 4 u32 match ip sport 220 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 4 u32 match ip sport 993 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=1 "
### for rsync trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 5
#filter
$tcfl $inet_iface $IP parent 1: prio 5 u32 match ip sport 873 0xffff flowid 1:$cur_cl_id
$tcfl $inet_iface $IP parent 1: prio 5 u32 match ip dport 873 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for rsync trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 5
#filter
$tcfl $inet_vface $IP parent 1: prio 5 u32 match ip sport 873 0xffff flowid 1:$cur_cl_id
$tcfl $inet_vface $IP parent 1: prio 5 u32 match ip dport 873 0xffff flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
let " cur_cl_id+=5 "
### for defaul trafic (ppp0)
# class
$tclc $inet_iface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 9
#filter
$tcfl $inet_iface $IP parent 1: prio 9 u32 match ip dst 0.0.0.0/0 flowid 1:$cur_cl_id
# очередь
$tcqd $inet_iface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
### for default trafic (ifb0)
# class
$tclc $inet_vface parent 1:1 classid 1:$cur_cl_id htb SP_start_full prio 9
#filter
$tcfl $inet_vface $IP parent 1: prio 9 u32 match ip dst 0.0.0.0/0 flowid 1:$cur_cl_id
# очередь
$tcqd $inet_vface parent 1:$cur_cl_id handle $cur_cl_id: sfq perturb 10
За дополнительной информацией следует обратиться к LARTC.org
заметка:
ОтветитьУдалить1. возможно необходимо внести ряд дополнительных переменных, которые смогут сделать код более читаемым.
заметка:
ОтветитьУдалить1. возможно имеет смысл дописать проверку необходимых ПО и ядерных модулей.