-
Notifications
You must be signed in to change notification settings - Fork 0
/
htb_script.sh
214 lines (168 loc) · 6.65 KB
/
htb_script.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#!/bin/bash
# kbps: Kilobytes per second
# mbps: Megabytes per second
# kbit: Kilobits per second
# mbit: Megabits per second
# bps: Bytes per second
# Amounts of data can be specified in:
# kb or k: Kilobytes
# mb or m: Megabytes
# mbit: Megabits
# kbit: Kilobits
TC=tc
IP=/usr/libexec/ip
IF=br-lan
# Interface
U32="$TC filter add dev $IF protocol ip parent 1:0 prio 1 u32"
#ustawienie innej nazwy interfejsu
set_interface()
{
IF=$1
echo $IF
}
remove_download()
{
#funkcja do usuwania qdiscu root dla interfejsu a tym samym usuniecia wszystkich zasad
tc qdisc del dev $IF root
}
remove_upload()
{
#funkcja do usuwania ifb root tym samym usuwajaca wszystkie zasady wysylania
tc qdisc del dev $IF ingress
tc qdisc del dev $ifb_id root
}
htb_init ()
{
#funkcja inicjalizujaca
$TC qdisc add dev $IF root handle 1: htb default 1
}
set_download()
{
local OPTIND=1
local arg src_ip dst_ip s_port d_port d_rate d_delay d_loss
#deklaracja lokalnych zmiennych: zrodlowy adres IP, docelowy adres IP, zrodlowy port, docelowy port, predkosc pobierania, opoznienie ms, utrata pakietow %
src_ip=${src_ip:-0.0.0.0/0}
dst_ip=${dst_ip:-0.0.0.0/0}
#domyslne wartosci adresow zrodlowych i docelowych uzyte w filtrze oznaczaja, ze przepuszczane sa wszystkie adresy zrodlowe i docelowe
while getopts 's:d:p:o:r:l:m:' arg
do
case ${arg} in
s) src_ip=${OPTARG};;
d) dst_ip=${OPTARG};;
p) s_port=${OPTARG};;
o) d_port=${OPTARG};;
r) d_rate=${OPTARG};;
l) d_delay=${OPTARG};;
m) d_loss=${OPTARG};;
esac
done
shift $((OPTIND -1))
read q_num < q_num.txt
#q_num to zmienna słuzaca do nadawania klasom ID, przechowywana w osobnym pliku, zeby uniknac konfliktu nazw
checkroot=$( tc qdisc show dev $IF | grep "htb 1:" )
#warunek sprawdzajacy czy istnieje qdisc root, jesli nie, tworzy się go
if [ -z "$checkroot" ]
then
$TC qdisc add dev $IF root handle 1: htb default 30
fi
q_num=$((q_num+1))
echo "New classid for download: $q_num "
echo "Download rate is: ${d_rate}"
#dodanie qdiscu o okreslonych parametrach rate i ceil
$TC class add dev $IF parent 1: classid 1:${q_num} htb rate ${d_rate} ceil ${d_rate}
#warunki do uwzględniania opoznienia i utraty pakietow
if [[ ! -z $d_delay ]] && [[ ! -z $d_loss ]]
then
$TC qdisc add dev $IF parent 1:$q_num handle $q_num: netem delay $d_loss delay $d_delay
elif [[ ! -z $d_delay ]]
then
$TC qdisc add dev $IF parent 1:$q_num handle $q_num: netem loss $d_delay
elif [[ ! -z $d_loss ]]
then
$TC qdisc add dev $IF parent 1:$q_num handle $q_num: netem loss $d_loss
fi
#warunki uwzgledniajace ustawione porty i dodające filtry
if [[ ! -z $d_port ]] && [[ ! -z $s_port ]]
then
$U32 match ip src $src_ip match ip dst $dst_ip match ip dport $d_port 0xffff match ip sport $s_port 0xffff flowid 1:$q_num
elif [[ ! -z $d_port ]]
then
$U32 match ip src $src_ip match ip dst $dst_ip match ip dport $d_port 0xffff flowid 1:$q_num
elif [[ ! -z $s_port ]]
then
$U32 match ip src $src_ip match ip dst $dst_ip match ip sport $d_port 0xffff flowid 1:$q_num
else
$U32 match ip src $src_ip match ip dst $dst_ip flowid 1:$q_num
#jesli zaden port nie jest ustawiony w filtrze uwzgledniane sa tylko adresy IP
fi
#zapisanie zmiennej q_num
echo $q_num > q_num.txt
}
set_upload()
{
local OPTIND=1
local arg src_ip dst_ip s_port d_port u_rate u_delay u_loss
#deklaracja lokalnych zmiennych: zrodlowy adres IP, docelowy adres IP, zrodlowy port, docelowy port, predkosc wysylania, opoznienie ms, utrata pakietow %
src_ip=${src_ip:-0.0.0.0/0}
dst_ip=${dst_ip:-0.0.0.0/0}
#domyslne wartosci adresow zrodlowych i docelowych uzyte w filtrze oznaczaja, ze przepuszczane sa wszystkie adresy zrodlowe i docelowe
while getopts 's:d:p:o:r:l:m:' arg
do
case ${arg} in
s) src_ip=${OPTARG};;
d) dst_ip=${OPTARG};;
p) s_port=${OPTARG};;
o) d_port=${OPTARG};;
r) u_rate=${OPTARG};;
l) u_delay=${OPTARG};;
m) u_loss=${OPTARG};;
esac
done
shift $((OPTIND -1))
read q_num < q_num.txt
#q_num to zmienna słuzaca do nadawania klasom ID, przechowywana w osobnym pliku, zeby uniknac konfliktu nazw
q_num=$((q_num+1))
echo "New classid for upload is: $q_num"
echo "Upload rate is: ${u_rate}"
ifb_id="ifb123"
echo $ifb_id
U322="$TC filter add dev $ifb_id protocol ip parent 1a1a: prio 1 u32"
modprobe ifb
$IP link add $ifb_id type ifb
$IP link set dev $ifb_id up
#tworzenie obiektu ifb jako nowego dev do mirrorowania ruchu
$TC qdisc add dev $IF ingress
$TC filter add dev $IF parent ffff: protocol ip u32 match u32 0 0 flowid 1a1a: action mirred egress redirect dev ${ifb_id}
#stworzenie domyslnego qdiscu za pomoca wirtualnego interfejsu ifb
$TC qdisc add dev ${ifb_id} root handle 1a1a: htb default 1
$TC class add dev ${ifb_id} parent 1a1a: classid 1a1a:1 htb rate 32000000.0kbit
#dodanie qdiscu o okreslonych parametrach rate i ceil
$TC class add dev ${ifb_id} parent 1a1a: classid 1a1a:${q_num} htb rate ${u_rate} ceil ${u_rate}
#warunki do uwzględniania opoznienia i utraty pakietow
if [[ ! -z $u_delay ]] && [[ ! -z $u_loss ]]
then
$TC qdisc add dev $ifb_id parent 1:$q_num handle $q_num: netem loss $u_loss delay $u_delay
elif [[ ! -z $u_delay ]]
then
$TC qdisc add dev $ifb_id parent 1:$q_num handle $q_num: netem delay $u_delay
elif [[ ! -z $u_loss ]]
then
$TC qdisc add dev $ifb_id parent 1:$q_num handle $q_num: netem loss $u_loss
fi
#warunki uwzgledniajace ustawione porty i dodające filtry
if [[ ! -z $d_port ]] && [[ ! -z $s_port ]]
then
$U322 match ip src $src_ip match ip dst $dst_ip match ip dport $d_port 0xffff match ip sport $s_port 0xffff flowid 1a1a:$q_num
elif [[ ! -z $d_port ]]
then
$U322 match ip src $src_ip match ip dst $dst_ip match ip dport $d_port 0xffff flowid 1a1a:$q_num
elif [[ ! -z $s_port ]]
then
$U322 match ip src $src_ip match ip dst $dst_ip match ip sport $d_port 0xffff flowid 1a1a:$q_num
else
$U322 match ip src $src_ip match ip dst $dst_ip flowid 1a1a:$q_num
#jesli zaden port nie jest ustawiony w filtrze uwzgledniane sa tylko adresy IP
fi
#zapisanie zmiennej q_num
echo $q_num > q_num.txt
}