Hitro usmerjanje in NAT v Linuxu

Ker se naslovi IPv4 izčrpavajo, se številni telekomunikacijski operaterji soočajo s potrebo, da svojim strankam zagotovijo dostop do omrežja s prevajanjem naslovov. V tem članku vam bom povedal, kako lahko zagotovite zmogljivost NAT Carrier Grade na standardnih strežnikih.

Malo zgodovine

Tema izčrpanosti naslovnega prostora IPv4 ni več nova. V nekem trenutku so se v RIPE pojavile čakalne vrste, nato pa borze, na katerih blokih naslovov se trguje in sklepajo posli za njihov zakup. Postopoma so telekomunikacijski operaterji začeli zagotavljati storitve dostopa do interneta s prevajanjem naslovov in vrat. Nekaterim ni uspelo pridobiti dovolj naslovov, da bi vsakemu naročniku izdali »bel« naslov, drugi pa so začeli varčevati z zavračanjem nakupa naslovov na sekundarnem trgu. Proizvajalci omrežne opreme so to idejo podprli, ker ta funkcionalnost običajno zahteva dodatne razširitvene module ali licence. Na primer, v Juniperjevi liniji usmerjevalnikov MX (razen najnovejših MX104 in MX204) lahko izvajate NAPT na ločeni servisni kartici MS-MIC, Cisco ASR1k zahteva licenco CGN, Cisco ASR9k zahteva ločen modul A9K-ISM-100 in mu licenco A9K-CGN -LIC. Na splošno užitek stane veliko denarja.

IPTables

Naloga izvajanja NAT ne zahteva posebnih računalniških virov, lahko jo rešijo procesorji splošnega namena, ki so nameščeni na primer v katerem koli domačem usmerjevalniku. V obsegu telekomunikacijskega operaterja je to težavo mogoče rešiti z uporabo blagovnih strežnikov, ki poganjajo FreeBSD (ipfw/pf) ali GNU/Linux (iptables). FreeBSD ne bomo upoštevali, ker... Tega OS sem nehal uporabljati že dolgo nazaj, zato bomo ostali pri GNU/Linuxu.

Omogočanje prevajanja naslovov sploh ni težko. Najprej morate registrirati pravilo v iptables v tabeli nat:

iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -j SNAT --to <pool_start_addr>-<pool_end_addr> --persistent

Operacijski sistem bo naložil modul nf_conntrack, ki bo spremljal vse aktivne povezave in izvedel potrebne pretvorbe. Tukaj je več tankosti. Prvič, ker govorimo o NAT v merilu telekomunikacijskega operaterja, je treba prilagoditi časovne omejitve, saj bo s privzetimi vrednostmi velikost prevajalske tabele hitro narasla do katastrofalnih vrednosti. Spodaj je primer nastavitev, ki sem jih uporabil na svojih strežnikih:

net.ipv4.ip_forward = 1
net.ipv4.ip_local_port_range = 8192 65535

net.netfilter.nf_conntrack_generic_timeout = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 45
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 60
net.netfilter.nf_conntrack_icmpv6_timeout = 30
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.netfilter.nf_conntrack_checksum=0

In drugič, ker privzeta velikost prevajalske tabele ni zasnovana za delo v pogojih telekomunikacijskega operaterja, jo je treba povečati:

net.netfilter.nf_conntrack_max = 3145728

Prav tako je treba povečati število veder za zgoščeno tabelo, ki shranjuje vse oddaje (to je možnost v modulu nf_conntrack):

options nf_conntrack hashsize=1572864

Po teh preprostih manipulacijah dobimo popolnoma delujoč dizajn, ki lahko prevede veliko število naslovov strank v skupino zunanjih. Vendar pa učinkovitost te rešitve pušča veliko želenega. V svojih prvih poskusih uporabe GNU/Linux za NAT (približno leta 2013) mi je uspelo doseči zmogljivost okoli 7 Gbit/s pri 0.8 Mpps na strežnik (Xeon E5-1650v2). Od takrat je bilo v omrežnem skladu jedra GNU/Linux narejenih veliko različnih optimizacij, zmogljivost enega strežnika na isti strojni opremi se je povečala na skoraj 18-19 Gbit/s pri 1.8-1.9 Mpps (to je bilo največje vrednosti), vendar je povpraševanje po količini prometa, ki ga obdeluje en strežnik, raslo veliko hitreje. Posledično so bile razvite sheme za uravnoteženje obremenitev različnih strežnikov, vendar je vse to povečalo kompleksnost nastavitve, vzdrževanja in ohranjanja kakovosti ponujenih storitev.

NFTtabele

Dandanes je moden trend v programski opremi »prestavljanja vrečk« uporaba DPDK in XDP. Na to temo je bilo napisanih veliko člankov, veliko različnih govorov, pojavljajo se komercialni izdelki (na primer SKAT iz VasExperts). Toda glede na omejene programske vire telekomunikacijskih operaterjev je precej problematično samostojno ustvariti kakršenkoli »izdelek«, ki temelji na teh okvirih. V prihodnosti bo tako rešitev veliko težje upravljati, predvsem pa bo treba razviti diagnostična orodja. Na primer, standardni tcpdump z DPDK ne bo deloval kar tako in ne bo "videl" paketov, poslanih nazaj v žice z uporabo XDP. Med vsemi govoricami o novih tehnologijah za pošiljanje posredovanja paketov v uporabniški prostor so ostali neopaženi poročila и Člen Pablo Neira Ayuso, vzdrževalec iptables, o razvoju razbremenitve toka v nftables. Oglejmo si podrobneje ta mehanizem.

Glavna ideja je, da če je usmerjevalnik posredoval pakete iz ene seje v obe smeri toka (seja TCP je prešla v stanje ESTABLISHED), potem ni potrebe po posredovanju naslednjih paketov te seje skozi vsa pravila požarnega zidu, ker vsa ta preverjanja se bodo vseeno končala s prenosom paketa naprej v usmerjanje. Pravzaprav nam ni treba izbrati poti - že vemo, kateremu vmesniku in kateremu gostitelju moramo poslati pakete znotraj te seje. Vse, kar ostane, je shraniti te informacije in jih uporabiti za usmerjanje v zgodnji fazi obdelave paketov. Pri izvajanju NAT je potrebno dodatno shraniti informacije o spremembah naslovov in vrat, prevedenih z modulom nf_conntrack. Ja, seveda, v tem primeru razni policisti in druga informacijska in statistična pravila v iptables prenehajo delovati, vendar v okviru naloge ločenega stalnega NAT ali na primer meje to ni tako pomembno, ker storitve so porazdeljeni po napravah.

Konfiguracija

Za uporabo te funkcije potrebujemo:

  • Uporabite sveže jedro. Kljub temu, da se je sama funkcionalnost pojavila v jedru 4.16, je bila precej dolgo časa zelo "surova" in je redno povzročala paniko v jedru. Vse se je stabiliziralo okoli decembra 2019, ko sta bili izdani jedri LTS 4.19.90 in 5.4.5.
  • Prepišite pravila iptables v obliki zapisa nftables z uporabo dokaj nove različice nftables. Deluje natančno v različici 0.9.0

Če je s prvo točko načeloma vse jasno, glavna stvar je, da ne pozabite vključiti modula v konfiguracijo med montažo (CONFIG_NFT_FLOW_OFFLOAD=m), potem druga točka zahteva razlago. pravila nftables so opisana povsem drugače kot v iptables. Dokumentacija razkriva skoraj vse točke, obstajajo tudi posebne pretvorniki pravila iz iptables v nftables. Zato bom podal samo primer nastavitve NAT in razbremenitve toka. Na primer majhna legenda: , - to so omrežni vmesniki, skozi katere poteka promet, v resnici jih je lahko več kot dva. , — začetni in končni naslov obsega „belih“ naslovov.

Konfiguracija NAT je zelo preprosta:

#! /usr/sbin/nft -f

table nat {
        chain postrouting {
                type nat hook postrouting priority 100;
                oif <o_if> snat to <pool_addr_start>-<pool_addr_end> persistent
        }
}

Z razbremenitvijo toka je malo bolj zapleteno, a povsem razumljivo:

#! /usr/sbin/nft -f

table inet filter {
        flowtable fastnat {
                hook ingress priority 0
                devices = { <i_if>, <o_if> }
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
                ip protocol { tcp , udp } flow offload @fastnat;
        }
}

To je pravzaprav celotna postavitev. Zdaj bo ves promet TCP/UDP padel v tabelo fastnat in obdelan veliko hitreje.

Ugotovitve

Da bo jasno, kako "veliko hitreje" je to, bom priložil posnetek zaslona obremenitve na dveh resničnih strežnikih, z enako strojno opremo (Xeon E5-1650v2), enako konfiguriranim, ki uporabljata isto jedro Linuxa, vendar izvajata NAT v iptables (NAT4) in v nftables (NAT5).

Hitro usmerjanje in NAT v Linuxu

Na posnetku zaslona ni grafa paketov na sekundo, vendar je v profilu obremenitve teh strežnikov povprečna velikost paketa okoli 800 bajtov, tako da vrednosti dosežejo do 1.5Mpps. Kot lahko vidite, ima strežnik z nftables ogromno zalogo zmogljivosti. Trenutno ta strežnik obdeluje do 30Gbit/s pri 3Mpps in je očitno sposoben izpolniti omejitev fizičnega omrežja 40Gbps, medtem ko ima proste vire CPE.

Upam, da bo to gradivo koristno omrežnim inženirjem, ki poskušajo izboljšati zmogljivost svojih strežnikov.

Vir: www.habr.com

Dodaj komentar