IPv4 aadresside ammendumise tÔttu seisavad paljud telekommunikatsiooniettevÔtted silmitsi vajadusega korraldada oma klientide juurdepÀÀs vÔrku aadresside tÔlke abil. Selles artiklis rÀÀgin, kuidas saavutada Carrier Grade NAT tasemel jÔudlus kommoditeediserveritel.
Enne kui liigume edasi
IPv4 aadressiruumide ammendumise teema ei ole enam uus. Teatud hetkel tekkisid RIPE'is ooteread (waiting list), seejĂ€rel ilmusid börsid, kus kaupleti aadressiblokke ning sĂ”lmiti lepingud nende rentimiseks. Aja jooksul hakkasid telekommunikatsiooniettevĂ”tted pakkuma interneti juurdepÀÀsu aadresside ja portide tĂ”lke abil. MĂ”ned ei saanud piisavalt aadresse, et anda igale tellijale 'valget' aadressi, teised alustasid sÀÀstmist, loobudes aadresside ostmisest sekundaarsetelt turgudelt. VĂ”rguseadmete tootjad toetasid seda ideed, kuna see funktsioon nĂ”uab tavaliselt tĂ€iendavaid laiendusi vĂ”i litsentse. NĂ€iteks Juniperi MX marsruuteri seerias (vĂ€lja arvatud viimased MX104 ja MX204) saab NAPT-i teostada eraldi teenusekaardil MS-MIC, Cisco ASR1k puhul on vajalik CGN litsents, Cisco ASR9k puhul on vajalik eraldi A9K-ISM-100 moodul ja litsents A9K-CGN-LIC selle jaoks. Ăldiselt ei ole see odav lĂ”bu.
IPTables
NAT-i teostamise ĂŒlesanne ei nĂ”ua spetsialiseeritud arvutivĂ”imsust, see on suuteline lahendama tavalised protsessorid, mis on installitud nĂ€iteks igas koduses ruuteris. TelekommunikatsiooniettevĂ”tte mastaabis saab selle ĂŒlesande lahendada, kasutades kommertservereid FreeBSD (ipfw/pf) vĂ”i GNU/Linux (iptables) operatsioonisĂŒsteemidega. FreeBSD-d ei kĂ€sitle, kuna ma olen juba pikka aega loobunud selle OS-i kasutamisest, seega peatume GNU/Linuxi peal.
Aadresside tÔlke lubamine ei ole sugugi keeruline. Alustamiseks tuleb kirjutada reegel iptables'i nat tabelisse:
iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -j SNAT --to - --persistent
OperatsioonisĂŒsteem laadib sisse nf_conntrack mooduli, mis jĂ€lgib kĂ”iki aktiivseid ĂŒhendusi ja teostab vajalikud muudatused. Siin on mĂ”ned nĂŒansid. Esiteks, kuna tegemist on operaatori NAT-iga, tuleb ajutisi seadistusi kohandada, sest vaikeseaded vĂ”ivad tabeli suuruse kiiresti katastroofiliseks muuta. Allpool on nĂ€ide seadistustest, mida kasutasin oma serverites:
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
Ja teiseks, kuna vaikimisi tabeli suurus ei ole kohandatud operaatoritingimustele, tuleb seda suurendada:
net.netfilter.nf_conntrack_max = 3145728
Samuti tuleb suurendada ka pÀiste arvu hash-tabelis, mis sisaldab kÔiki muundamisi (see on nf_conntrack mooduli valik):
options nf_conntrack hashsize=1572864
PĂ€rast neid lihtsaid toiminguid tekib tĂ€iesti töökorras lahendus, mis suudab edastada suurt hulka klientide aadresse vĂ€liste aadresside kogusse. Siiski, selle lahenduse jĂ”udlus jÀÀb soovitust madalamaks. Oma esimestel katsetel kasutada GNU/Linuxi NAT-ina (umbes aastal 2013) sain ĂŒhe serveri (Xeon E5-1650v2) korral jĂ”udluse umbes 7Gbit/s ja 0.8Mpps. Sellest ajast on GNU/Linuxi sĂŒdamiku vĂ”rgustiku sisene tehtud palju erinevaid optimeerimisi, ĂŒhe serveri jĂ”udlus samal riistvaral on tĂ”usnud praktiliselt 18-19 Gbit/s ja 1.8-1.9 Mpps (need olid piiri vÀÀrtused), kuid ĂŒhe serveri kĂ€ideldava liikluse maht on kasvanud palju kiiremini. LĂ”puks on vĂ€lja töötatud koormuse tasakaalustamise skeemid erinevate serverite vahel, kuid see kĂ”ik on suurendanud seadistamise, hooldamise ja teenuse kvaliteedi sĂ€ilitamise keerukust.
NFTables
Praegu on moes programmide "pakettide ĂŒmberpanemise" suund DPDK ja XDP kasutamine. Sellel teemal on kirjutatud hulgaliselt artikleid, toimunud on palju erinevaid ettekandeid ja turule on ilmunud kaubanduslikke tooteid (nĂ€iteks SCAT firmalt VasExperts). Kuid piiratud inimressurssidega programmeerijatel on keeruline ise midagi sarnast nende raamistike baasil kokku panna. Sellise lahenduse kasutamine hiljem osutub palju keerulisemaks, sealhulgas tuleb vĂ€lja töötada diagnostikavahendid. NĂ€iteks tavapĂ€rane tcpdump DPDK-ga lihtsalt ei tööta, samuti ei "nĂ€e" ta pakette, mis saadetakse tagasi juhtmetesse XDP abil. Uute tehnoloogiate, mis edastavad pakette user-space'is, rÀÀkimise taustal on tĂ€helepanuta jÀÀnud ja Pablo Neira Ayuso, iptables'i hooldaja, rÀÀkis flow offloading'i arendamisest nftables'is. Vaadakem seda mehhanismi lĂ€hemalt.
Peamine idee seisneb selles, et kui ruuter on lasknud sama sessiooni pakette mĂ”lemas suunas voos (TCP sessioon on lĂ€inud ESTABLISHED olekusse), siis ei ole tarvis edasisi selle sessiooni pakette lĂ€bi kĂ”igi tulemĂŒĂŒrireeglite lasta, kuna kĂ”ik need kontrollid lĂ”ppevad igal juhul paketi edastamisega edasise suunamise juurde. Ja valiku tegemine marsruudi suhtes pole samuti vajalik â me teame juba, milliseks liideseks ja millisele hostile tuleb paketid selle sessiooni piires edastada. JÀÀb vaid see teave salvestada ja kasutada seda paketi varajases töötlemise etapis marsruudiks. NAT'i tĂ€itmisel on vajalik ka salvestada teave aadresside ja sadamate muudatuste kohta, mida transformaator nf_conntrack on teinud. Jah, muidugi, sel juhul lĂ”petavad töö mitmesugused poliitikavahendajad ja muud teabe-statistilised reeglid iptables'is, kuid eraldi NAT'i vĂ”i nĂ€iteks piiriĂŒlese ĂŒlesande kontekstis ei ole see sugugi nii oluline, kuna teenused on jaotatud seadmete vahel.
Konfiguratsioon
Selle funktsiooni kasutamiseks peame:
- Kasutama vĂ€rsket kernelit. Kuigi see funktsioon ilmus juba kernelis 4.16, oli see ĂŒsna kaua vĂ€ga "toores" ja pĂ”hjustas regulaarselt kernel panic'e. KĂ”ik stabiliseerus umbes detsembris 2019, kui ilmusid LTS kernelid 4.19.90 ja 5.4.5.
- Kirjutage iptables reeglid ĂŒmber nftables formaati, kasutades piisavalt vĂ€rsket nftables versiooni. Töötab tĂ€pselt versioonis 0.9.0
Kui esimese punktiga on pĂ”himĂ”tteliselt selge, et peamine on unustada mitte lubada moodulit konfigureerimises (CONFIG_NFT_FLOW_OFFLOAD=m), siis teine punkt vajab selgitusi. Nftables reeglid on kirjeldatud tĂ€iesti teisiti kui iptables. katab praktiliselt kĂ”ik aspektid, samuti on olemas spetsiaalsed reeglitest iptables-st nftables-sse. SeetĂ”ttu toon vĂ€lja ainult NAT-i ja flow offloadi seadistuse nĂ€ite. VĂ€ike legend nĂ€ite jaoks: , â need on vĂ”rgu liidesed, mille kaudu lĂ€bib liiklus, neid vĂ”ib olla tegelikult rohkem kui kaks. , â valgete aadresside vahemiku alg- ja lĂ”puaadress.
NAT konfiguratsioon on vÀga lihtne:
#! /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
}
}
Flow offloadiga on veidi keerulisem, kuid tÀiesti arusaadav:
#! /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;
}
}
Sedasi ongi kogu seadistus. NĂŒĂŒd jĂ”uab kogu TCP/UDP liiklus fastnat tabelisse ja seda töödeldakse palju kiiremini.
tulemused nÀitasid ainult nelja ebaolulise koodibloki kattuvust, mis olid tingitud POSIX ja ANSI C nÔuetest.
Et mÔista, kui palju "palju kiiremini", kasutan ekraanipilti kahe reaalse serveri koormusest, millel on sama konfiguratsioon (Xeon E5-1650v2), vÔrdne seadistamine, mis kasutavad sama Linuxi kernelit, kuid teostavad NAT-i iptables (NAT4) ja nftables (NAT5) abil.

Ekraanipildil ei ole pakettide sekundis graafikut, kuid nende serverite koormuse profiilis on paketi keskmine suurus umbes 800 baidi, seega vÀÀrtused ulatuvad 1.5Mpps. Nagu nĂ€ha, on nftables serveri sooritusvĂ”ime reserv tohutu. Praegu suudab see server töödelda kuni 30Gbit/s kiirusel 3Mpps ja on selgelt vĂ”imeline saavutama fĂŒĂŒsilise vĂ”rgu piirangu 40Gbps, omades samal ajal vabade CPU ressursside.
Loodan, et see materjal on kasulik vĂ”rguinseneridele, kes pĂŒĂŒavad parandada oma serverite jĂ”udlust.
Allikas: habr.com
