OpenBSD tulemüüri võrgu koormustest
Sissejuhatus
Tulemüüri koormustestil sobiks tähelepanu pöörata sellistele asjaoludele
- kui palju ruuditakse liiklust läbi väljalülitatud paketifiltriga
- kui palju võib tulemüürile taustal saata pakette, mida paketifilter blokeerib, et sama ajal vajalik liiklus veel läbi käiks
- kui palju liiklust tulemüür suudab sisselülitatud paketifiltriga läbi lasta (nö ühe state vs palju state liiklust, st pakettide src ja dst ip ning src ja dst port aadresse varieerides)
Koormustesti korraldus
Tulemüüri koormustesti korralduseks võiks olla üles seadistatud nt selline asjakorraldus
klient 1 klient 2 ..... klient n _____ _____ _____ | | | | | | |_____| |_____| |_____| | | | võrk tm 1 tm 2 -----|----------------|-----------------|----- | | | | __|__ | __|__ | | __|__ | | |_____| | | |_____| |_____| | tmh | | | ----|-------|----------|-----------------------|--------|------- | | | __|__ __|__ __|__ | | | | | | |_____| |_____| |_____| server 1 server 2 .... server n
kus
- tm 1 - tulemüüri klastri õlg 1
- tm 2 - tulemüüri klastri õlg 2
- tmh - tulemüüri klastri haldusarvuti (/syweb, /nfsen)
Koormustesti alguses tuleks tulemüüri paketifilter välja lülitada
# pfctl -d
ning aru saada (eeldusel, et serverid kasutavad avalikke aadresse)
- kui palju üksikuid pakette (nt udp) sekundis suudab võrk klientidest serveriteni toimetada
- kui palju liiklust suudab OpenBSD tulemüür ära ruutida kasutades vähe tcp ühendusi (nt 1000)
- kui palju uusi tcp ühendusi sekundis suudab OpenBSD tulemüür ära kannatada ruutides vastavat liiklust läbi
Seda võiks mõõta nt selliselt
- hping3 abil syn pakette saates
- pktgen abil udp pakettide saatmine
- queryperf ja teisel pool nsd nimeserver
- ab või weighttp ja teiselt poolt nginx abil (korrektsed tcp ühendused)
Seejärel käivitada võimalikult lihtne ja efektiivne paketifilter, nt mis sisaldab ühte reeglit
pass
ning tuunida nn pf.optioneid. Samal ajal jälgida
- /syweb/ graafikuid
- systat väljundit
- tcpstat abil kui palju pakette jõuab läbi tulemüüri serverisse
Lisaks käivitada rdr-to reegliga paketifilter.
Liikluse genereerimine
Nö tavalise arvuti ja 1G võrguliidesega suudab Linuxi hping3 --flood suvandi abil genereerida ca 58 k paketti sekundis tcp syn pakette (suurusega 42 baiti, kokku tekitab see liikluse 20 Mbit/s). Genereerimiseks sobib konkreetselt öelda nt
# hping3 -q -i u10 -S -p 443 10.184.41.180
ning sama arvuti teises aknas jälgida tcpstat programmiga reaalset väljundit
# tcpstat -i eth0 -o "Time:%S\tn=%n\tavg=%a\tstddev=%d\tpps=%p\n" -f "tcp and host 10.184.41.180" 1
või
# tcpstat -i eth0 -o "Time:%S\tn=%n\tavg=%a\tstddev=%d\tbps=%B\n" -f "tcp and host 10.184.41.180" 1
- Tundub, et 1 G PCI võrgukaart ja nö 2009 aasta arvuti ning Debian v. 6 või 7 operatsioonisüsteem suudab tekitada kuni 100k paketti sekundis ilma eriliselt midagi modifitseerimata.
- Tundub, et 2010 aasta ca 200 eurose switchi portidest käib läbi kuni 130k paketti sekundis.
- Tundub, et 2009 aasta arvuti 1 G liides suudab võtta vastu ca 130k paketti sekundis.
Liiklust genereerivas arvutis paistab olevat os load 1-2 (kahe core arvutis) kusjuures jaguneb sy ja si vahel
top - 17:08:00 up 17 days, 5:18, 5 users, load average: 1.00, 1.03, 0.81 %Cpu0 : 0.3 us, 1.0 sy, 2.3 ni, 96.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 : 10.6 us, 40.4 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 49.0 si, 0.0 st KiB Mem: 1994696 total, 1633992 used, 360704 free, 15308 buffers KiB Swap: 4194300 total, 665208 used, 3529092 free, 1277768 cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 6843 root 20 0 16724 872 676 R 99.8 0.0 5:08.61 hping3
Liiklust vastu võtvas arvutis tekib si (software interrupt) koormus, näiteks kaks arvutit teevad hping3 abil flood'i
# timeout 50 hping3 -q -p 80 --flood -S 192.168.10.119
ja tulemuseks on
Tasks: 131 total, 4 running, 127 sleeping, 0 stopped, 0 zombie Cpu0 : 0.0%us, 0.0%sy, 0.0%ni, 79.8%id, 0.0%wa, 0.0%hi, 20.2%si, 0.0%st Cpu1 : 0.0%us, 1.2%sy, 0.0%ni, 90.6%id, 0.0%wa, 0.0%hi, 8.2%si, 0.0%st Cpu2 : 0.0%us, 0.0%sy, 0.0%ni, 58.8%id, 0.0%wa, 0.0%hi, 41.2%si, 0.0%st Cpu3 : 0.0%us, 0.0%sy, 0.0%ni, 89.1%id, 0.0%wa, 0.0%hi, 10.9%si, 0.0%st Mem: 3849616k total, 961420k used, 2888196k free, 101836k buffers Swap: 1048568k total, 0k used, 1048568k free, 726500k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10 root 20 0 0 0 0 R 42 0.0 2:10.96 ksoftirqd/2 4 root 20 0 0 0 0 S 17 0.0 4:31.57 ksoftirqd/0 13 root 20 0 0 0 0 S 17 0.0 2:45.77 ksoftirqd/3 7 root 20 0 0 0 0 S 5 0.0 4:20.70 ksoftirqd/1
ja kui pordil töötab teenus, saab ip_conntrack täis
# cat /proc/net/ip_conntrack | wc -l 65381
OpenBSD käitumine võrgukoormuse tingimustes
- ühe hping3 tulemusena tekib OpenBSD peale ca 300-400k state'i
Misc
Linux kirjutab suure pakketide saabumise puhul dmesgi
[170625.309661] nf_conntrack: table full, dropping packet.
aitab (või iptables moodulite maha laadimine)
# sysctl -w net.netfilter.nf_conntrack_max=131072
Kui pordil teenus töötab ning ning on sisse lülitatud tcp_syncookies
sysctl -w net.ipv4.tcp_syncookies=1
öeldakse dmesgis
[ 806.525077] TCPv6: Possible SYN flooding on port 80. Dropping request.
NginX test
Kahes arvutist pöördutakse
# ab -n 800000 -c 700 http://192.168.10.119/
Server teenindab
Active connections: 381 server accepts handled requests 4324070 4324070 4323758 Reading: 380 Writing: 1 Waiting: 0
ja võrgus on näha 72 k sisenevat paketti sekundis.
Kliendud saavad kokku vastuseks ca 18 k päringut sekundis.
ab juures lisaks -k võtme kasutamisel jaotatakse -n abil näidatus arv päringuid -c järel näidatud arvu tcp ühenduste vahel, seda saab kergesti jälgida vaadates teises aknas
# tcpdump -nli eth0 'tcp[13] & 2 != 0' and dst 192.168.10.119 and port 80 1>/dev/null
Siege
OpenBSD ruudib tcp ühendusi
Neljast arvutist pöördutakse läbi OpenBSD ruuteri kahe teenuse poole
# /root/bin/weighttp -n 40000000 -c 100 -t 4 http://10.184.41.179/ # /root/bin/weighttp -n 40000000 -c 100 -t 4 http://10.184.41.185/
Tulemusena teenindadakse veel ilma oluliste vigadeta, mida näitaks
# netstat -I em0 -w 1
http päringuid, seejuures tulemüüri välisel seadmel on 290 kpps. Kuna antud juhul ühele päringule vastab üks tcp ühendus ning sellega liigub serverisse kuus ip paketti, siis tähendab, et tulemüür suudab teenindada ca 50 k tcp ühendust sekundis.
Seejuures tulemüüris ei ole olulist load'i (17k interrupti)
OpenBSD ruudib ja filtreerib tcp ühendusi
Korrates sama katset, aga sisselülitatud paketifiltriga suudab tulemüür tegeleda ca 25 k uue ühendusega sekundis
# pfctl -Fi; sleep 10; pfctl -si | grep -A 4 "State Table" pf: statistics cleared State Table Total Rate current entries 466621 searches 4239544 423954.4/s inserts 497542 49754.2/s removals 502588 50258.8/s
kus
- kuna ühele ühendusele vastab kaks olekut, siis tuleb inserts väärtus jagada kahega
Seejuures on interrupt load veidi kõrgem. Kuna pakette saabub vähem, siis netstat vigu ei näita.