Brzo usmjeravanje i NAT u Linuxu

Kako se IPv4 adrese iscrpljuju, mnogi se telekom operateri suočavaju s potrebom da svojim klijentima omoguće pristup mreži korištenjem prevođenja adresa. U ovom ću vam članku reći kako možete postići performanse Carrier Grade NAT na standardnim poslužiteljima.

Malo povijesti

Tema iscrpljenosti IPv4 adresnog prostora više nije nova. U jednom trenutku pojavile su se liste čekanja u RIPE-u, zatim su se pojavile burze na kojima se trguje blokovima adresa i sklapaju poslovi o njihovom najmu. Postupno su telekom operateri počeli pružati usluge pristupa internetu koristeći prijevod adresa i portova. Neki nisu uspjeli nabaviti dovoljno adresa da izdaju "bijelu" adresu svakom pretplatniku, dok su drugi počeli štedjeti odbijajući kupnju adresa na sekundarnom tržištu. Proizvođači mrežne opreme podržali su ovu ideju, jer ova funkcionalnost obično zahtijeva dodatne module proširenja ili licence. Na primjer, u Juniperovoj liniji MX usmjerivača (osim za najnovije MX104 i MX204), NAPT možete izvesti na zasebnoj MS-MIC servisnoj kartici, Cisco ASR1k zahtijeva CGN licencu, Cisco ASR9k zahtijeva zasebni A9K-ISM-100 modul i licencu A9K-CGN -LIC za njega. Općenito, zadovoljstvo košta puno novca.

iptables

Zadatak izvođenja NAT-a ne zahtijeva specijalizirane računalne resurse, može se riješiti procesorima opće namjene, koji su instalirani, na primjer, u bilo kojem kućnom usmjerivaču. Na razini telekom operatera, ovaj se problem može riješiti korištenjem robnih poslužitelja koji pokreću FreeBSD (ipfw/pf) ili GNU/Linux (iptables). Nećemo uzeti u obzir FreeBSD jer... Odavno sam prestao koristiti ovaj OS, pa ćemo se držati GNU/Linuxa.

Omogućivanje prijevoda adresa nije nimalo teško. Prvo trebate registrirati pravilo u iptables u nat tablici:

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

Operativni sustav će učitati modul nf_conntrack koji će nadzirati sve aktivne veze i izvršiti potrebne konverzije. Ovdje postoji nekoliko suptilnosti. Prvo, budući da govorimo o NAT-u na razini telekom operatera, potrebno je prilagoditi timeoute, jer će sa zadanim vrijednostima veličina tablice prevođenja brzo narasti do katastrofalnih vrijednosti. Ispod je primjer postavki koje sam koristio na svojim poslužiteljima:

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

I drugo, budući da zadana veličina tablice prijevoda nije dizajnirana za rad u uvjetima telekom operatera, potrebno ju je povećati:

net.netfilter.nf_conntrack_max = 3145728

Također je potrebno povećati broj spremnika za hash tablicu koja pohranjuje sva emitiranja (ovo je opcija u modulu nf_conntrack):

options nf_conntrack hashsize=1572864

Nakon ovih jednostavnih manipulacija dobiva se potpuno radni dizajn koji može prevesti veliki broj adresa klijenata u skup vanjskih. Međutim, izvedba ovog rješenja ostavlja mnogo za poželjeti. U mojim prvim pokušajima korištenja GNU/Linuxa za NAT (oko 2013.), uspio sam postići performanse od oko 7Gbit/s pri 0.8Mpps po poslužitelju (Xeon E5-1650v2). Od tog vremena napravljeno je mnogo različitih optimizacija u GNU/Linux kernel mrežnom stogu, performanse jednog poslužitelja na istom hardveru porasle su na gotovo 18-19 Gbit/s pri 1.8-1.9 Mpps (ovo su bile maksimalne vrijednosti) , no potražnja za volumenom prometa, koji obrađuje jedan poslužitelj, rasla je mnogo brže. Kao rezultat toga, razvijene su sheme za uravnoteženje opterećenja na različitim poslužiteljima, ali sve je to povećalo složenost postavljanja, održavanja i održavanja kvalitete pruženih usluga.

NFTtables

Danas je modni trend u softverskom "prebacivanju torbi" korištenje DPDK i XDP. O ovoj temi napisano je mnogo članaka, održano je mnogo različitih govora, pojavljuju se komercijalni proizvodi (na primjer, SKAT od VasExperts). No s obzirom na ograničene programske resurse telekom operatera, prilično je problematično samostalno kreirati bilo kakav “proizvod” temeljen na tim okvirima. Bit će puno teže upravljati takvim rješenjem u budućnosti; posebice će se morati razviti dijagnostički alati. Na primjer, standardni tcpdump s DPDK-om neće raditi samo tako i neće "vidjeti" pakete poslane natrag u žice pomoću XDP-a. Usred svih razgovora o novim tehnologijama za slanje prosljeđivanja paketa u korisnički prostor, prošli su nezapaženo izvještaji и Članak Pablo Neira Ayuso, održavatelj iptables, o razvoju protoka rasterećenja u nftables. Pogledajmo ovaj mehanizam detaljnije.

Glavna ideja je da ako je usmjerivač propustio pakete iz jedne sesije u oba smjera toka (TCP sesija je otišla u ESTABLISHED stanje), tada nema potrebe propuštati sljedeće pakete ove sesije kroz sva pravila vatrozida, jer sve ove provjere će ipak završiti s paketom koji se dalje prenosi na usmjeravanje. I zapravo ne trebamo odabrati rutu - već znamo kojem sučelju i kojem hostu trebamo poslati pakete unutar ove sesije. Sve što preostaje je pohraniti ove informacije i koristiti ih za usmjeravanje u ranoj fazi obrade paketa. Prilikom izvođenja NAT-a potrebno je dodatno pohraniti informacije o promjenama adresa i portova koje je preveo modul nf_conntrack. Da, naravno, u ovom slučaju razni policajci i druga informacijska i statistička pravila u iptablesu prestaju raditi, ali u okviru zadatka zasebnog stalnog NAT-a ili, na primjer, granice, to nije toliko važno, jer usluge distribuiraju se po uređajima.

Konfiguracija

Za korištenje ove funkcije potrebno nam je:

  • Koristite svježu jezgru. Unatoč činjenici da se sama funkcionalnost pojavila u kernelu 4.16, dosta dugo je bila vrlo “sirova” i redovito je izazivala paniku u kernelu. Sve se stabiliziralo oko prosinca 2019., kada su objavljeni LTS kerneli 4.19.90 i 5.4.5.
  • Ponovno napišite pravila iptables u formatu nftables koristeći relativno noviju verziju nftables. Radi točno u verziji 0.9.0

Ako je sve u načelu jasno s prvom točkom, glavna stvar je ne zaboraviti uključiti modul u konfiguraciju tijekom montaže (CONFIG_NFT_FLOW_OFFLOAD=m), a zatim druga točka zahtijeva objašnjenje. nftables pravila su potpuno drugačije opisana nego u iptables. Документация otkriva gotovo sve točke, postoje i posebne pretvarači pravila od iptables do nftables. Stoga ću dati samo primjer postavljanja NAT-a i protoka. Mala legenda na primjer: , - to su mrežna sučelja kroz koja prolazi promet; u stvarnosti ih može biti više od dva. , — početna i završna adresa raspona „bijelih” adresa.

NAT konfiguracija je vrlo jednostavna:

#! /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
        }
}

S rasterećenjem protoka malo je kompliciranije, ali sasvim 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 zapravo cijela namještaljka. Sada će sav TCP/UDP promet pasti u fastnat tablicu i biti puno brže obrađen.

Nalazi

Da bude jasno koliko je ovo "mnogo brže", priložit ću snimku zaslona opterećenja na dva stvarna poslužitelja, s istim hardverom (Xeon E5-1650v2), identično konfiguriranim, koristeći isti Linux kernel, ali izvršavajući NAT u iptables (NAT4) i u nftables (NAT5).

Brzo usmjeravanje i NAT u Linuxu

Na snimci zaslona nema grafikona paketa u sekundi, ali u profilu opterećenja ovih poslužitelja prosječna veličina paketa je oko 800 bajtova, tako da vrijednosti dosežu i do 1.5Mpps. Kao što vidite, poslužitelj s nftables ima veliku rezervu performansi. Trenutačno ovaj poslužitelj obrađuje do 30Gbit/s pri 3Mpps i očito je sposoban zadovoljiti ograničenje fizičke mreže od 40Gbps, dok ima besplatne CPU resurse.

Nadam se da će ovaj materijal biti koristan mrežnim inženjerima koji pokušavaju poboljšati performanse svojih poslužitelja.

Izvor: www.habr.com

Dodajte komentar