OpenBSD tulemüüri võrgu koormustest

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

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.

Kasulikud lisamaterjalid