Brzo rutiranje i NAT u Linuxu

Kako IPv4 adrese postaju iscrpljene, mnogi telekom operateri suočeni su s potrebom da svojim klijentima omoguće pristup mreži koristeći prevođenje adresa. U ovom članku ću vam reći kako možete postići NAT performanse Carrier Grade na robnim serverima.

Malo istorije

Tema iscrpljivanja IPv4 adresnog prostora više nije nova. U jednom trenutku, u RIPE-u su se pojavile liste čekanja, zatim su se pojavile berze na kojima se trgovalo blokovima adresa i sklapali poslovi o njihovom iznajmljivanju. Telekom operateri su postepeno počeli da pružaju usluge pristupa internetu koristeći prevođenje adresa i portova. Neki nisu uspeli da pribave dovoljno adresa da izdaju „belu” adresu svakom pretplatniku, dok su drugi počeli da štede odbijajući da kupe adrese 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 rutera (osim najnovijih MX104 i MX204), možete izvesti NAPT na zasebnoj MS-MIC servisnoj kartici, Cisco ASR1k zahtijeva CGN licencu, Cisco ASR9k zahtijeva poseban modul A9K-ISM-100 i A9K-CGN licencu -LIC njemu. Generalno, zadovoljstvo košta mnogo novca.

IPTables

Zadatak izvođenja NAT-a ne zahtijeva specijalizirane računarske resurse, već ga mogu riješiti procesori opće namjene, koji su instalirani, na primjer, u bilo kojem kućnom ruteru. Na nivou telekom operatera, ovaj problem se može rešiti korišćenjem robnih servera koji koriste FreeBSD (ipfw/pf) ili GNU/Linux (iptables). Nećemo razmatrati FreeBSD, jer... Odavno sam prestao da koristim ovaj OS, tako da ćemo se držati GNU/Linuxa.

Omogućavanje prijevoda adresa uopće nije teško. Prvo morate registrovati pravilo u iptables u nat tabeli:

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

Operativni sistem će učitati nf_conntrack modul, koji će pratiti sve aktivne veze i izvršiti potrebne konverzije. Ovdje postoji nekoliko suptilnosti. Prvo, budući da je riječ o NAT-u na skali telekom operatera, potrebno je podesiti vremenska ograničenja, jer će sa zadanim vrijednostima veličina tablice prijevoda brzo narasti do katastrofalnih vrijednosti. Ispod je primjer postavki koje sam koristio na svojim serverima:

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 da radi u uvjetima telekom operatera, potrebno je povećati:

net.netfilter.nf_conntrack_max = 3145728

Također je potrebno povećati broj bucketa za hash tablicu u kojoj se pohranjuju svi emitiranja (ovo je opcija u modulu nf_conntrack):

options nf_conntrack hashsize=1572864

Nakon ovih jednostavnih manipulacija, dobija se potpuno ispravan dizajn koji može prevesti veliki broj klijentskih adresa u skup eksternih adresa. Međutim, performanse ovog rješenja ostavljaju mnogo da se požele. 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 serveru (Xeon E5-1650v2). Od tog vremena, napravljeno je mnogo različitih optimizacija u mrežnom stogu GNU/Linux kernela, performanse jednog servera na istom hardveru su porasle na skoro 18-19 Gbit/s pri 1.8-1.9 Mpps (to su bile maksimalne vrijednosti) , ali potražnja za obimom saobraćaja, koji obrađuje jedan server, rasla je mnogo brže. Kao rezultat toga, razvijene su šeme za balansiranje opterećenja na različitim serverima, ali je sve to povećalo složenost postavljanja, održavanja i održavanja kvaliteta pruženih usluga.

NFTtables

U današnje vrijeme, moderan trend u softverskim “promjenama vreća” je korištenje DPDK i XDP. Mnogo je članaka napisano na ovu temu, održano je mnogo različitih govora, a pojavljuju se i komercijalni proizvodi (npr. SKAT iz VasExperts-a). Ali s obzirom na ograničene programske resurse telekom operatera, prilično je problematično kreirati bilo koji „proizvod“ zasnovan na ovim okvirima samostalno. U budućnosti će biti mnogo teže upravljati takvim rješenjem, a posebno će se morati razviti dijagnostički alati. Na primjer, standardni tcpdump sa DPDK neće raditi tek tako, i neće "vidjeti" pakete koji se vraćaju u žice koristeći XDP. Usred svih priča o novim tehnologijama za prosljeđivanje paketa u korisnički prostor, one su ostale neprimijećene izvještaji и članci Pablo Neira Ayuso, održavatelj iptables-a, o razvoju flow offloadinga u nftables. Pogledajmo detaljnije ovaj mehanizam.

Osnovna ideja je da ako je ruter proslijedio pakete iz jedne sesije u oba smjera toka (TCP sesija je prešla u ESTABLISHED stanje), onda nema potrebe da se sljedeći paketi ove sesije propuštaju kroz sva pravila zaštitnog zida, jer sve ove provjere će se i dalje završiti tako što se paket dalje prenosi na rutiranje. I zapravo ne trebamo birati rutu - već znamo na koje sučelje i kojem hostu trebamo poslati pakete unutar ove sesije. Sve što ostaje je da se te informacije pohrane i koriste za rutiranje u ranoj fazi obrade paketa. Prilikom izvođenja NAT-a potrebno je dodatno pohraniti informacije o promjenama adresa i portova koje je preveo nf_conntrack modul. Da, naravno, u ovom slučaju razni policajci i druge informacije i statistička pravila u iptables prestaju da rade, ali u okviru zadatka zasebnog stalnog NAT-a ili, na primer, granice, to nije toliko važno, jer servisi distribuiraju se na sve uređaje.

Konfiguracija

Za korištenje ove funkcije potrebno nam je:

  • Koristite svježe jezgro. Unatoč činjenici da se sama funkcionalnost pojavila u kernelu 4.16, dosta dugo je bila vrlo "sirova" i redovito je izazivala paniku kernela. Sve se stabiliziralo oko decembra 2019. godine, kada su pušteni LTS kerneli 4.19.90 i 5.4.5.
  • Prepišite iptables pravila u nftables formatu koristeći prilično noviju verziju nftables. Radi tačno u verziji 0.9.0

Ako je sve u principu jasno s prvom tačkom, glavna stvar je da ne zaboravite uključiti modul u konfiguraciju tokom montaže (CONFIG_NFT_FLOW_OFFLOAD=m), onda druga točka zahtijeva objašnjenje. nftables pravila su opisana potpuno drugačije nego u iptables. Dokumentacija otkriva skoro sve tačke, postoje i posebne pretvarači pravila od iptables do nftables. Stoga ću dati samo primjer postavljanja NAT-a i flow offloada. Mala legenda na primjer: , - ovo su mrežna sučelja kroz koje promet prolazi; 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
        }
}

Sa flow offload je malo složenije, 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, u stvari, cijela postavka. Sada će sav TCP/UDP saobraćaj pasti u fastnat tabelu i biti obrađen mnogo brže.

Rezulʹtaty

Da bi bilo jasno koliko je ovo "mnogo brže", priložit ću snimku ekrana opterećenja na dva stvarna servera, sa istim hardverom (Xeon E5-1650v2), identično konfigurisanim, koristeći isto jezgro Linuxa, ali izvodeći NAT u iptables (NAT4) i u nftables (NAT5).

Brzo rutiranje i NAT u Linuxu

Na snimku ekrana nema grafikona paketa u sekundi, ali u profilu učitavanja ovih servera prosječna veličina paketa je oko 800 bajtova, tako da vrijednosti dostižu i do 1.5Mpps. Kao što vidite, server sa nftables ima ogromnu rezervu performansi. Trenutno, ovaj server obrađuje do 30Gbit/s pri 3Mpps i očigledno je sposoban da ispuni ograničenje fizičke mreže od 40Gbps, dok ima slobodne CPU resurse.

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

izvor: www.habr.com

Dodajte komentar