PLNOG 13: Gaweł Mikołajczyk: Data Center Security in 2014
PLNOG 8: Lucjan Kisiel, Marcin Matyla - Router brzegowy z wydolnością 3 Gb ruchu za 5 tys.
1. Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
Autorzy:
Lucjan Kisiel i Marcin Matyla
Korbank S.A. Wrocław
email: noc@k.pl
2. Plan
1. Hardware
1.1. Hardware wycena
2. System operacyjny
2.1 Dobór kart sieciowych
2.2 Firewall
3. Tuning systemu
3.1. Zwiększenie buforów
3.2. Inne parametry
4. Statystyki
4.1. Statystyki ruchu
4.2. Top w szczycie
4.3. Przydatne polecenia
5. Podsumowanie
Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
3. 1. Hardware
● Płyta główna Intel S5520HC
1200 zł
– 5 slotów PCI-Express
– Intelligent Platform Management
Interface 2.0 z Serial over LAN
● Procesor Intel Xeon X5650 2.67GHz
12M Cache, 6.40 GT/s QPI,
6 Cores, 12 Threads
3100 zł
● # top -PSH
● CPU 0: 0.0% user, 0.0% nice, 24.8% system, 15.4% interrupt, 59.8% idle
CPU 1: 0.4% user, 0.0% nice, 4.1% system, 17.7% interrupt, 77.8% idle
CPU 2: 0.0% user, 0.0% nice, 1.1% system, 21.1% interrupt, 77.8% idle
CPU 3: 0.0% user, 0.0% nice, 1.5% system, 13.5% interrupt, 85.0% idle
CPU 4: 0.0% user, 0.0% nice, 10.5% system, 0.0% interrupt, 89.5% idle
CPU 5: 0.0% user, 0.0% nice, 10.2% system, 0.0% interrupt, 89.8% idle
CPU 6: 0.0% user, 0.0% nice, 10.2% system, 0.0% interrupt, 89.8% idle
CPU 7: 0.0% user, 0.0% nice, 7.5% system, 0.0% interrupt, 92.5% idle
CPU 8: 0.0% user, 0.0% nice, 21.4% system, 0.0% interrupt, 78.6% idle
CPU 9: 0.0% user, 0.0% nice, 30.1% system, 0.0% interrupt, 69.9% idle
CPU 10: 0.0% user, 0.0% nice, 5.3% system, 0.0% interrupt, 94.7% idle
CPU 11: 0.0% user, 0.0% nice, 21.0% system, 0.0% interrupt, 79.0% idle
Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
4. Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
1.1 Hardware wycena:
● Płyta główna Intel S5520HC
1200 zł
● Procesor Intel Xeon X5650 2.67GHz
12M Cache, 6.40 GT/s QPI, 6 Cores,12 Threads
3100 zł
● DDR3 2x 2GB Kingstone
100 zł
● WD AV-GP 160GB VS 3.5" 16MB SATAII
300 zł
● Zasilacz + Obudowa
300 zł + 400 zł
● Karty 5x INTEL Gigabit CT Desktop
5x 100 zł
CAŁOŚĆ 5900 zł. NETTO
5. 2. System operacyjny
FreeBSD 8.2
Problemy z soft updates
Jan 19 09:13:41 fox syslogd: kernel boot file is /boot/kernel/kernel
Jan 19 09:13:41 fox kernel: dev = ad0s1f, block = 1, fs = /usr
Jan 19 09:13:41 fox kernel: panic: ffs_blkfree: freeing free block
Jan 19 09:13:41 fox kernel: cpuid = 0
Jan 19 09:13:41 fox kernel: Uptime: 44m25s
Jan 19 09:13:41 fox kernel: Cannot dump. No dump device defined.
Jan 19 09:13:41 fox kernel: Automatic reboot in 15 seconds – press a key on the console to abort
Jan 19 09:13:41 fox kernel: Rebooting…
„Freeing free block podczas pracy systemu i dysku, to bug samego
systemu, z którym już od kilku lat borykają się autorzy dystrybucji
FreeBSD.”
Rozwiązaniem jest wyłączenie softupdates dla danego systemu plików
(przy instalacji lub potem poleceniem „tunefs”)
●
Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
7. 2.2. Firewall
Jako firewalla używamy mechanizmu IPFW
- allow na kartach WAN na początku!
- skipy klas IP w ipfw (gdy dużo reguł)
Problem z zawieszaniem się IPFW podczas
czyszczenia regół i jego obejście
/sbin/sysctl net.inet.ip.fw.one_pass=1
fwcmd="/sbin/ipfw -q"
${fwcmd} -f flush
${fwcmd} -f pipe flush
${fwcmd} -f table 0 flush
${fwcmd} -f table 1 flush
${fwcmd} -f table 2 flush
. /etc/firewall/rules.new
echo "nowe regoly... done"
/sbin/sysctl net.inet.ip.fw.one_pass=0
Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
00053 293453767 205438169422 allow ip from any to any via vlan48
00054 317542234 206678601842 allow ip from any to any via vlan1681
00055 24603860 20143882653 allow ip from any to any via vlan575
00056 119136520 97131970719 allow ip from any to any via vlan300
00500 195110 37433082 skipto 1300 ip from 10.7.1.0/24 to any
00500 500645 615970388 skipto 1300 ip from any to 10.7.1.0/24
00501 279798 22924187 skipto 1600 ip from 10.7.144.0/24 to any
00501 848766 875772492 skipto 1600 ip from any to 10.7.144.0/24
00502 181931 19445103 skipto 1900 ip from 10.7.177.0/24 to any
00502 445762 529416128 skipto 1900 ip from any to 10.7.177.0/24
23001 235598 277887231 pipe 1 ip from any to any
23001 188006 245656561 skipto 60000 ip from any to any
23002 535871 575831887 pipe 2 ip from any to any
23002 534188 574437776 skipto 60000 ip from any to an
#ipfw pipe show 2
00002: 4.096 Mbit/s 0 ms burst 0
q131074 50 sl. 0 flows (1 buckets) sched 65538 weight 0 lmax 0 pri 0 droptail
sched 65538 type FIFO flags 0x1 2048 buckets 4 active
mask: 0x00 0x00000000/0x0000 -> 0xffffffff/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytesPkt/Byte
Drp
11 ip 0.0.0.0/0 10.7.144.4/0 529 511035 0 0 0
12 ip 0.0.0.0/0 10.7.144.3/0 1062 239965 0 0 0
14 ip 0.0.0.0/0 10.7.177.1/0 265 45764 0 0 0
254 ip 0.0.0.0/0 10.7.177.241/0 2 242 0 0 0
8. 3. Tuning systemu
Polega na zmianie parametrów jądra odpowiedzialnych (tu) za obsługę sieci. Chodzi tu o:
- liczbę buforów i ich wielkość na obsługe połączeń
- wielkość tablic haszujących do pamietania połączeń
- włączeniu przyśpieszenia firewalla
- zmniejszenie „keepalive'ów” dla dynamicznych reguł
Jest on sensowny gdy obciążenie powoduje kończenie się zasobów. Zawsze można
kupować mocniejszy sprzęt, ale po co gdy można jeszcze trochę z niego wycisnąć. W
naszym przypadku nie da się kupić już mocniejszego bo ten jest najmocniejszy więc
softwarowo należy wycisnąć ile się da.
Skuteczność takiego tuningu to kilkanaście a nawet kilkadziesiąt procent w CPU.
Realizuje się go we FreeBSD przez program sysctl. Za jego pomocą można odczytywać
jaki zmieniać wiele parametrów w locie podczas pracy systemu. Część z nich można tylko
ustawić podaczas startu systemu i wtedy ustawia się je w /boot/loader.conf.
Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
9. Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
3.1. Zwiększenie buforów (przy 4GB RAM):
kern.ipc.nmbclusters = 262144 - określa maksymalną liczbę klastrów mbuf, które mogą być
używane przez stos sieciowy w dowolnym momencie
net.inet.tcp.recvspace = 262144 - maksymalny rozmiar przychodzącego pakietu
net.inet.tcp.sendspace = 262144 - maksymalny rozmiar wychodzącego pakietu
kern.ipc.maxsockbuf = 16777216 - maksymalny rozmiar bufora socketa
net.inet.ip.fw.dyn_ack_lifetime = 30 – czas życia dynamicznej reguły dla ACK
net.inet.ip.fw.dyn_syn_lifetime = 10 – czas życia dynamicznej reguły dla SYN
net.inet.ip.fw.dyn_max = 262144 – maksymalna liczba dynamicznych reguł dummynetu
net.inet.ip.dummynet.hash_size = 2048 – określa wielkość tab. hasz. do dummynetu
Poniższe ustawiane w /boot/loader.conf :
net.inet.tcp.syncache.hashsize=2048 – określa wielkość tab. hasz. syncache
net.inet.tcp.syncache.bucketlimit=100 – określa wielkość per-bucket
net.inet.tcp.tcbhashsize=4096 - określa wielkość tab. haszującej TCP control-block
10. Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
3.2. Inne parametry:
net.link.ether.ipfw = 0 – wyłączenie sprawdzanie reguł II warstwy w ipfw
kern.polling.enable = 0 – wyłączenie poolingu
net.inet.ip.fastforwarding = 1 – włączenie szybkiego forwardowania
net.inet.ip.dummynet.io_fast = 1 - włączenie przyspieszenia dummynetu
net.inet.tcp.delayed_ack = 0 - nakazuje systemowi, aby próbował załączać potwierdzenia TCP ACK
do pakietu danych, zamiast wysyłać dodatkowe pakiety w celu zasygnalizowania końca połączenia.
net.inet.ip.portrange.first = 10000 – rozszeszenie zakresu portów połączeń wyjściowych
net.inet.ip.portrange.last = 65535 – rozszeszenie zakresu portów połączeń wyjściowych
net.inet.ip.portrange.randomized = 0 – używaj naturalnych numerów portów zamiast losowych
11. Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
4. Statystyki:
a) 7 kart sieciowych 1Gb
b) 104 interfejsy vlan:
root@Korbotron82|pts/2|23:30:53|/home/loocek # ifconfig | grep vlan | grep ' metric 0 mtu 1500' | nl | tail -5
100 vlan992: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
101 vlan150: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
102 vlan2597: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
103 vlan304: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
104 vlan1681: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
root@Korbotron82|pts/2|23:30:59|/home/loocek #
c) 325 adresów IP:
root@Korbotron82|pts/2|23:34:12|/home/loocek # ifconfig | grep -w inet | nl | tail -5
321 inet 10.21.1.1 netmask 0xfffffff8 broadcast 10.21.1.7
322 inet 193.239.58.109 netmask 0xfffffffc broadcast 193.239.58.111
323 inet 172.16.2.2 --> 172.16.2.1 netmask 0xffffff00
324 inet 212.127.90.117 --> 212.127.90.118 netmask 0xffffffff
325 inet 193.111.38.226 netmask 0xfffffffc broadcast 193.111.38.227
root@Korbotron82|pts/2|23:34:20|/home/loocek #
d) 500 reguł taryfikujących w ipfw, z 50 reguł filtrującychw pf-ie
e) ok. 450 000! połączeń typu UNICAST w szczycie!
f) 14 sesji BGP (w tym 2 full-feedy, dwie Polski i in.)
g) dodatkowo NAT na 100Mb (w pf-ie), z logowaniem połączeń na softflowd
12. 4.1. Statystyki z ruchu (Cacti)
Utylizacja (Mb/s)
Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
18. 4.3. Przydatne polecenia:
- vmstat -z – ważne polecenie, liczniki alokacji pamięci przez: buckety,
tablice haszujące, sockety i in.
- netstat -m – liczniki zużycia tych newralgicznych mbufów
- netstat -s – liczniki dla róznych protokołów: tcp, udp, icmp, ip, ip6, arp
- top -PSH – wiadomo, obciążenie systemu online
- bmon – niezawodzący progami do wielkości ruchu na interfejsach (w Bajtach)
Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
19. Router brzegowy
z wydolnością 3 Gb ruchu za 5 tys.
5. Podsumowanie
Przedstawiliśmy kompletne rozwiązanie wysoko wydajnego routera. Podaliśmy sprzęt oraz sposób
tuningu do osiągnięcia wysokiej wydajności. Zwróciliśmy uwagę na kruczki (problemy), które
istnieją i jak sobie z nimi poradzić. Wskazaliśmy narzędzia do diagnostyki obciążenia. Stosując się
do wszystkich naszych wskazówek dostanie się wydajny router za nieduże pieniądze.
Na koniec przy okazji zapraszamy wszystkich do współpracy. Gdyby ktoś chciał u siebie taki
router zainstalować to pomożemy, doradzimy a może nawet zrealizujemy.
Dziękujemy za uwagę!
Autorzy:
Lucjan Kisiel i Marcin Matyla
Korbank S.A. Wrocław
email: noc@k.pl