IPv4 aadresside lÔppemisega seisavad paljud teenusepakkujad silmitsi vajadusega korraldada oma klientide juurdepÀÀs vÔrku aadresside tÔlkimise abil. Antud artiklis selgitan, kuidas saavutada Carrier Grade NAT tasemel jÔudlust kaupade serverites.
Veidi ajalugu
IPv4-aadressiruumi ammendumise teema pole enam uus. Millalgi tekkis RIPE-s ootejĂ€rjekord (waiting list), seejĂ€rel tekkisid turud, kus kaupleti aadressiblokkidega ja tehti tehinguid nende ĂŒĂŒrimiseks. Aja jooksul hakkasid sideoperaatorid pakkuma Interneti-juurdepÀÀsu aadresside ja portide maskeerimise (NAT) abil. MĂ”nedel ei olnud piisavalt aadresse, et iga tellija jaoks vĂ€lja anda âvalgetâ aadressi, samas kui teised hakkasid kulusid kokku hoidma, loobudes aadresside ostmisest teisest turust. VĂ”rguseadmete tootjad toetasid seda ideed, kuna see funktsioon nĂ”uab tavaliselt tĂ€iendavaid laiendusi vĂ”i litsentse. NĂ€iteks Juniperi MX marsruuterite seerias (vĂ€lja arvatud viimased MX104 ja MX204) saab NAPT-i teostada eraldi teenusekaardil MS-MIC, Cisco ASR1k jaoks on vajalik SGN-litsents, Cisco ASR9k puhul aga eraldi moodul A9K-ISM-100 ja sellele litsents A9K-CGN-LIC. Ăldiselt maksab see lĂ”bu korralikku raha.
IPTables
NAT-i tĂ€itmise ĂŒlesanne ei vaja spetsialiseeritud arvutusressursse, seda suudavad lahendada tavalised protsessorid, nagu need, mis on nĂ€iteks igas koduses ruuteris. Sideoperaatori mastaabis saab seda ĂŒlesannet lahendada kaupade serverite kasutamisega, mis on hallatavad FreeBSD (ipfw/pf) vĂ”i GNU/Linuxi (iptables) sĂŒsteemi all. FreeBSD-d me ei kĂ€sitle, kuna olen juba ammu sellest operatsioonisĂŒsteemist loobunud, nii et peatume GNU/Linuxil.
Aadresside tĂ”lke sisselĂŒlitamine pole sugugi keeruline. Esiteks 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 mooduli nf_conntrack, mis jĂ€lgib kĂ”iki aktiivseid ĂŒhendusi ja teeb vajalikud muundamised. Siin on mĂ”ned nĂŒansid. Esiteks, kuna rÀÀgime NAT-ist sideoperaatori mastaabis, tuleb aegumisi kohandada, sest vaikevÀÀrtustega suureneb tĂ”lketabeli suurus ĂŒsna kiiresti katastroofiliste vÀÀrtusteni. Allpool on nĂ€ide seadistustest, mida olen oma serverites kasutanud:
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
Teiseks, kuna vaikimisi ei ole tÔlketabeli suurus mÔeldud töötamiseks sideoperaatori tingimustes, on seda vaja suurendada:
net.netfilter.nf_conntrack_max = 3145728
Samuti on vajalik suurendada ka bucket'ite arvu kÔigi tÔlkete haldava hash-tabeli jaoks (see on nf_conntrack mooduli valik):
options nf_conntrack hashsize=1572864
PĂ€rast neid lihtsaid toiminguid on asi korralikult töövalmis, suudab ta suunata suure hulga klientide aadresse vĂ€lisse punt. Siiski jĂ€tab selle lahenduse jĂ”udlus soovida. Oma esimestel katsetel GNU/Linuxi kasutamisel NAT-i jaoks (umbes 2013. aastal) suutsin saavutada 7 Gbit/s jĂ”udluse koos 0.8 Mpps-ga ĂŒhel serveril (Xeon E5-1650v2). Sellest ajast on GNU/Linuxi tuuma vĂ”rguhalduskiht lĂ€bimas mitmeid erinevaid optimeerimisi ja ĂŒhe serveri jĂ”udlus samadel komponentidel on peaaegu kahekordistunud, ulatudes 18-19 Gbit/s ja 1.8-1.9 Mpps-ni (need olid maksimaalsed nĂ€itajad), kuid ĂŒhe serveri töötleva liikluse vajadus on kasvanud palju kiiremini. LĂ”puks töötati vĂ€lja erinevad koormuse tasakaalustamise skeemid mitme serveri vahel, kuid kĂ”ik see suurendas seadistamise, hooldamise ja pakutava teenuse kvaliteedi sĂ€ilitamise keerukust.
NFTables
Praegune trend programmistikas "pakettide ĂŒlekandmisel" on DPDK ja XDP kasutamine. Selle teema kohta on kirjutatud palju artikleid, toimunud on mitmeid ettekandeid ja turule on tulnud erinevad kommertstoodete lahendused (nĂ€iteks Scat VasExpertsilt). Kuid piiratud ressurssidega programmijate seas on teleringiteenustes nende raamistikude jĂ€rgi oma lahenduse loomine ĂŒsna keeruline. Sellist lahendust hiljem kasutada on veelgi keerulisem, eelkĂ”ige tuleb arendada diagnostikavahendeid. NĂ€iteks ei tööta standardne tcpdump DPDK-ga lihtsalt nii, ja XDP abil saatud paketid ei "nĂ€e" seda tagasipöördudes juhtmes. KĂ”ikide arutelude taustal uute tehnoloogiate kohta, mis on seotud pakettide edastamise viiga user-space'i, on jaanud tĂ€helepanuta ja Pablo Neira Ayuso, iptables'i hooldaja, flow offloading'i arendamisest nftables'is. Vaatame seda mehhanismi lĂ€hemalt.
Peamine idee on see, et kui ruuter on edastanud ĂŒhe seansi pakette mĂ”lemale poole voogu (TCP seanss on jĂ”udnud olekusse ESTABLISHED), siis ei ole vajalik edastada jĂ€rgmisi selle seansi pakette lĂ€bi kĂ”igi tulemĂŒĂŒrireeglite, kuna kĂ”ik need kontrollid lĂ”ppevad nagunii paketi edastamisega edasi suunamisse. Ega marsruudi valimisega pole midagi teha â me teame juba, millisele liidesele ja millele hostile tuleb pakette selle seansi piires edastada. Tuleb vaid sĂ€ilitada see teave ja kasutada seda pakkide marsruudistamiseks varases paketi töötlemise etapis. NAT-i teostamisel tuleb lisaks sĂ€ilitada teave aadresside ja sadamate muutuste kohta, mille on muutnud nf_conntrack moodul. Jah, loomulikult lakkavad sel juhul toimimast erinevad poliitikad ja muud teabe-statistilised reeglid iptables'is, kuid ĂŒksiku NAT-i ĂŒlesande vĂ”i nĂ€iteks piiriĂŒlese ĂŒlesande raames pole see nii olulist, kuna teenused on jaotatud seadmete vahel.
Konfiguratsioon
Selle funktsiooni kasutamiseks peame:
- Kasutage vĂ€rsket tuuma. Kuigi funktsionaalsus ilmus tuumas 4.16, oli see pikka aega vĂ€ga âtooresâ ja pĂ”hjustas regulaarselt kernel panic. KĂ”ik stabiliseerus umbes 2019. aasta detsembris, kui ilmusid LTS tuumad 4.19.90 ja 5.4.5.
- Kandke iptables'i reeglid nftablesi formaati, kasutades piisavalt vÀrsket versiooni nftablesist. Töötab tÀpselt versioonis 0.9.0.
Kui esimese punkti osas on kĂ”ik pĂ”himĂ”tteliselt selge, siis peamine on mitte unustada lisada moodul konfiguratsiooni kogumise ajal (CONFIG_NFT_FLOW_OFFLOAD=m), siis teine punkt vajab selgitusi. Nftablesi reeglid ei ole ĂŒldse samamoodi kirjeldatud kui iptablesi omad. avaldab praktiliselt kĂ”ik punktid, samuti on olemas spetsiaalsed reeglite tĂ”lkimiseks iptablesist nftablesisse. SeetĂ”ttu toon ainult NAT-i ja flow offloadi seadistuse nĂ€ite. VĂ€ike legend nĂ€ite jaoks: , â need on vĂ”rgu liidesed, mille kaudu liiklus lĂ€bib, neid vĂ”ib olla tegelikult rohkem kui kaks. , â valgete aadresside vahemiku algus- ja lĂ”ppaadress.
NAT-i 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 offload 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;
}
}
Siin on kogu seadistus. NĂŒĂŒd suunatakse kogu TCP/UDP liiklus fastnat tabelisse ja töödeldakse palju kiiremini.
Tulemused
Et mÔista, kui palju kiiremini, jagan ma ekraanipilti kahe reaalse serveri koormusest, millel on sama riistvara (Xeon E5-1650v2), samad seaded ja mis kasutavad sama Linuxi tuuma, kuid teostavad NAT-d iptables'is (NAT4) ja nftables'is (NAT5).

Ekraanipildil ei ole pakettide sekundi graafikut, aga nende serverite koormuse profiilis on paketi keskmine suurus umbes 800 baiti, seega jĂ”uavad vÀÀrtused 1.5Mpps-ni. Nagu nĂ€ha, on nftablesiga serveril tohutu jĂ”udlusreserv. Praegu suudab see server töödelda kuni 30Gbit/s kiirusel 3Mpps ja on selgelt suuteline ulatuma fĂŒĂŒsilistesse 40Gbps piiridesse, omades samas CPU ressursse vaba.
Loodan, et see materjal on kasulik vĂ”rguinseneridele, kes pĂŒĂŒavad parandada oma serverite tootlikkust.
Allikas: habr.com
