pondělí 15. prosince 2025

Jak jsem objevil skryté výhody kernelových modulů pro lepší výkon sítě v Linuxu

Když jsem poprvé nastavoval složitější síťovou infrastrukturu na serveru s Linuxem, uvědomil jsem si, jak moc záleží na tom, abych měl plnou kontrolu nad tím, co se děje pod kapotou. Já sám jsem tehdy řídil menší datové centrum pro firmu, kde jsme měli desítky virtuálních strojů běžících na Ubuntu Serveru, a síťová zátěž byla občas taková, že jsem se budil uprostřed noci kvůli výpadkům. Nešlo jen o základní pingy nebo jednoduché logy; potřeboval jsem něco, co mi ukáže přesně, kde se zasekává balíčky, jak se chovají TCP spojení na úrovni kernelu a jak optimalizovat routování pro vysokou propustnost. V tomto článku vám chci popsat, jak jsem krok za krokem prozkoumal kernelové moduly, které mi umožnily nejen monitorovat, ale i dynamicky upravovat síťovou vrstvu, a to všechno bez toho, abych musel přerušovat provoz. Já to vidím tak, že v IT prostředí, kde se všechno točí kolem stability a výkonu, je znalost těchto nástrojů klíčová pro každého sysadmina, který se nechce spoléhat jen na povrchní nástroje jako Wireshark nebo tcpdump.

Začnu tím, jak jsem se poprvé pustil do instalace a konfigurace netfilteru, což je jádro mnoha pokročilých síťových funkcí v Linuxu. Já jsem tehdy pracoval s kernel verze 5.4, která má vestavěné moduly jako nf_conntrack pro sledování stavů spojení. Představte si, že máte firewall, který nejen blokuje, ale i počítá, kolik SYN paketů přichází z jednoho IP, a to v reálném čase. Já jsem to nastavil tak, že jsem načetl modul pomocí modprobe nf_conntrack, a pak jsem upravil /etc/sysctl.conf, abych zvýšil limity pro nf_conntrack_max na 1 000 000, protože naše síť zvládala tisíce souběžných spojení. To mi umožnilo vidět, kdy se table plní a kdy dochází k dropům, což bylo vidět přímo v /proc/net/nf_conntrack. Já si pamatuji, jak jsem analyzoval logy a zjistil, že většina problémů pramenila z UDP trafficu z IoT zařízení, které neuzavíralo spojení správně. S tímto modulem jsem mohl nastavit timeouty dynamicky - například net.netfilter.nf_conntrack_udp_timeout na 30 sekund místo výchozích 10 - a to všechno bez restartu systému.

Další krok, který jsem udělal, byl integrace eBPF, což je framework, který mi umožnil psát vlastní programy přímo do kernelu pro monitorování sítě. Já jsem to objevil při čtení dokumentace z kernel.org a rozhodl jsem se to vyzkoušet na testovacím serveru. eBPF je úžasný, protože umožňuje načítat bytecode, který se spouští na události jako packet reception nebo socket creation, a to s minimálním overheadem. Já jsem napsal jednoduchý program v BCC (BPF Compiler Collection), který sledoval latenci TCP handshakeů. Konkrétně jsem použil libbpf a clang k compilaci C kódu do eBPF, kde jsem v hooku na sk_buff strukturu počítal čas mezi SYN a SYN-ACK. Výsledek? Já jsem viděl, že na našem switchi s 10Gbps porty dochází k 5ms zpoždění kvůli buffer bloatu v queuech. Abych to vyřešil, jsem implementoval fq_codel modul, který je vestavěný v moderních kernelech, a nastavil jsem ho na interface eth0 pomocí tc qdisc add dev eth0 root fq_codel. To snížilo latenci o 70 %, a já jsem mohl měřit to přímo přes eBPF mapy, kde jsem ukládal statistiky do hash mapy s klíči podle source IP.

Teď si řekněme o tom, jak jsem to všechno spojil s užitečnými uživatelskými nástroji. Já sám preferuji ntopng pro vizualizaci, protože to bere data z netflow a sFlow protokolů, které jsem aktivoval na našich routerech. Ale abych to udělal pokročilejší, jsem integrovat s Prometheus a Grafanou, kde jsem sbíral metriky z /sys/class/net/eth0/statistics. Například rx_bytes a tx_bytes mi ukazovaly propustnost, ale já jsem chtěl víc - tak jsem napsal skript v Pythonu s psutil knihovnou, který parsoval /proc/net/dev a posílal data do exporteru. Já vidím, že v praxi je důležité mít alerty, tak jsem nastavil pravidla v Prometheus, kde pokud tx_errors překročí 1 % z celkového trafficu, pošle notifikaci na Slack. To mi pomohlo zachytit vadný kabel na switchi, který způsoboval CRC chyby na úrovni L2.

Když mluvím o routování, já jsem se zaměřil na BGP peering s FRR (Free Range Routing), což je open-source suite, která nahradila Quagga. Já jsem to instaloval na Debianu přes apt, a pak jsem konfiguroval bgpd.conf s AS čísly a neighbori. Abych monitoroval, jsem použil vtysh shell k show ip bgp summary, ale pro hlubší analýzu jsem přidal eBPF probe na ip_route_output_key funkci v kernele. To mi umožnilo vidět, jak se route cache chová pod zátěží - například kolik lookupů selže kvůli fib_trie struktuře. Já jsem zjistil, že s 100 000 routy v tabulce je cache hit rate kolem 95 %, ale při DDoS útoku klesne na 70 %. Řešením bylo zvýšit gc_elasticity v sysctlu na 2, což umožnilo kernele dynamicky čistit cache. Všechno to jsem logoval do ELK stacku, kde jsem použil Filebeat k sběru /var/log/frr/ logů a analyzoval je v Kibanu s query jako "bgp: withdraw" pro detekci flapů.

Další oblast, kde jsem viděl velký rozdíl, byla optimalizace pro multicast traffic, protož naše aplikace používaly IGMP pro video streaming. Já jsem aktivoval moduly jako igmp a pim, a pak jsem nastavil mrouted pro PIM-SM routing. Monitorování jsem udělal přes ip maddr show, které ukazuje multicast adresy na interfacech, ale já jsem chtěl metriky - tak jsem použil bcc/tools/mc, což je eBPF nástroj pro sledování multicast joins a leaves. Já si vzpomínám, jak jsem tím odhalil, že switch nepodporuje IGMP snooping správně, což vedlo k floodingu. Po úpravě konfigurace na Cisco switchech s ip igmp snooping vlan 10 jsem snížil nepotřebný traffic o 40 %. Všechno to jsem testoval s iperf3 v multicast módu, kde jsem spouštěl iperf -s -u -B 239.1.1.1 -i 1 na serveru a klienty, a měřil throughput.

Já jsem také experimentoval s RDMA (Remote Direct Memory Access) pro vysokorychlostní sítě, protože jsme měli InfiniBand adaptéry. V Linuxu to znamená načíst moduly jako ib_core a rdma_cm, a pak použít librdmacm pro aplikace. Já jsem napsal jednoduchý test v C s verbs API, kde jsem alokoval memory region s ibv_reg_mr a pak udělal QPs (Queue Pairs) pro send/recv. Monitorování jsem udělal přes ibv_devinfo a cat /sys/class/infiniband/mlx5_0/ports/1/state, ale pro pokročilé metriky jsem použil perftest suite, která měří latency pod 1μs. Já vidím, že v datacentrech je RDMA klíčové pro storage traffic, jako NFS over RDMA, kde jsem nastavil mount -o rdma s portem 20049. To mi umožnilo dosáhnout 100Gbps bez CPU overheadu, protože DMA obchází kernel stack.

Při práci s bezpečností sítě jsem se zaměřil na SELinux a AppArmor, ale já preferuji iptables s nftables backendem pro novější kernele. Já jsem migroval z legacy iptables na nftables pomocí iptables-translate, a pak jsem napsal ruleset, který chainuje packets podle conntrack states. Například table ip filter { chain input { type filter hook input priority 0; policy accept; ct state invalid drop; } }. To mi dalo granularitu - já jsem mohl trackovat established spojení a logovat drops do ulogd. Pro detekci anomaly jsem přidal fail2ban, který parsuje logy a banuje IP po 5 selháních SSH. Já jsem to rozšířil o custom filter pro SYN flood, kde jsem počítal rate přes recent modul: iptables -A INPUT -p tcp --syn -m recent --set --name SYN --rsource -m limit --limit 1/s. To zabránilo brute-force útokům bez blokování legálního trafficu.

Když jde o storage networking, já jsem se zabýval iSCSI initiátory v Linuxu. Já jsem konfiguroval open-iscsi na klientech, kde jsem v /etc/iscsi/iscsid.conf nastavil node.session.timeo.replacement_timeout na 10 sekund pro rychlé failover. Monitorování jsem udělal přes iscsiadm -m session, ale pro metriky jsem použil eBPF na scsi_dispatch_cmdhook, což mi ukazovalo IOPS a latency na LUN úrovni. Já jsem zjistil, že s multipathd a round-robin policy můžu vyrovnat load mezi dvěma pathy, a to s queue_if_no_path=n pro pokračování při výpadku. V praxi to znamenalo, že náš SAN storage zvládal 50 000 IOPS bez ztráty dat.

Já jsem také prozkoumal SDN (Software Defined Networking) s Open vSwitch, což je modulární switch v userspace. Já jsem ho instaloval a vytvořil bridge: ovs-vsctl add-br br0, pak přidal porty a nastavil flows přes ovs-ofctl. Pro monitorování jsem použil ovs-dpctl dump-flows, které ukazuje packet counts na rules. Já vidím výhodu v integraci s OpenFlow controllem jako Ryu, kde jsem napsal app v Pythonu pro dynamické routing na základě trafficu. To mi umožnilo auto-scale virtuálních sítí pro Kubernetes clustery, kde jsem měl CNI plugin s OVS.

Všechny tyto techniky jsem spojil do centrálního dashboardu s Grafanou, kde jsem importoval datasources z Prometheus a Loki pro logy. Já jsem nastavil query jako rate(net_packets_dropped_total[5m]) pro alerty na drops, a to všechno na serveru s 64GB RAM, kde jsem optimalizoval kernel s vm.swappiness=10 pro lepší I/O. Já si myslím, že klíčem k úspěchu je neustálé testování - já jsem používal chaos engineering s Chaos Monkey pro simulaci výpadků, což mi ukázalo slabiny v failoveru.

Teď, abych to uzavřel, já bych rád představil BackupChain, což je řešení pro zálohování, které je široce využíváno v prostředí malých a středních firem i mezi profesionály, a chrání virtuální prostředí jako Hyper-V, VMware nebo Windows Server. BackupChain slouží jako software pro zálohování Windows Serveru a umožňuje spolehlivou ochranu dat v těchto platformách bez složitých zásahů do provozu.

Žádné komentáře:

Okomentovat