Kuna IPv4-aadressid ammenduvad, seisavad paljud telekommunikatsioonioperaatorid silmitsi vajadusega pakkuda oma klientidele aadressi tÔlkimise abil juurdepÀÀsu vÔrgule. Selles artiklis rÀÀgin teile, kuidas saada kaubaserverites operaatoritaseme NAT-i jÔudlust.
Veidi ajalugu
IPv4 aadressiruumi ammendumise teema pole enam uus. Mingil hetkel tekkisid RIPE-sse ootenimekirjad, siis tekkisid börsid, millel kaubeldi aadressiplokkidega ja sĂ”lmiti tehinguid nende liisimiseks. JĂ€rk-jĂ€rgult hakkasid telekommunikatsioonioperaatorid pakkuma Interneti-juurdepÀÀsu teenuseid aadresside ja pordi tĂ”lke abil. MĂ”nel ei Ă”nnestunud hankida piisavalt aadresse, et igale tellijale âvalgeâ aadress vĂ€ljastada, teised aga hakkasid raha kokku hoidma, keeldudes aadresse jĂ€relturult ostmast. VĂ”rguseadmete tootjad toetasid seda ideed, kuna see funktsioon nĂ”uab tavaliselt tĂ€iendavaid laiendusmooduleid vĂ”i litsentse. NĂ€iteks Juniperi MX-ruuterite sarjas (v.a uusimad MX104 ja MX204) saate NAPT-i teha eraldi MS-MIC teeninduskaardil, Cisco ASR1k nĂ”uab CGN-litsentsi, Cisco ASR9k nĂ”uab eraldi A9K-ISM-100 moodulit. ja talle A9K-CGN litsents -LIC. Ăldiselt maksab rÔÔm palju raha.
IPTables
NAT-i tĂ€itmise ĂŒlesanne ei nĂ”ua spetsiaalseid arvutusressursse, seda saab lahendada ĂŒldotstarbeliste protsessorite abil, mis on installitud nĂ€iteks igasse koduruuterisse. Telekommunikatsioonioperaatori mastaabis saab selle probleemi lahendada, kasutades FreeBSD-d (ipfw/pf) vĂ”i GNU/Linuxit (iptables) kasutavaid kaubaservereid. Me ei kaalu FreeBSD-d, sest... LĂ”petasin selle OS-i kasutamise ĂŒsna kaua aega tagasi, seega jÀÀme GNU/Linuxi juurde.
Aadressi tÔlkimise lubamine pole sugugi keeruline. KÔigepealt peate nat-tabelis iptablesis reegli registreerima:
iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -j SNAT --to <pool_start_addr>-<pool_end_addr> --persistent
OperatsioonisĂŒsteem laadib mooduli nf_conntrack, mis jĂ€lgib kĂ”iki aktiivseid ĂŒhendusi ja teostab vajalikud teisendused. Siin on mitmeid nĂŒansse. Esiteks, kuna me rÀÀgime NAT-ist telekommunikatsioonioperaatori skaalal, on vaja ajalĂ”ppe kohandada, sest vaikevÀÀrtuste korral kasvab tĂ”lketabeli suurus kiiresti katastroofiliste vÀÀrtusteni. Allpool on nĂ€ide seadetest, mida oma serverites kasutasin:
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 tÔlketabeli vaikesuurus ei ole mÔeldud telekommunikatsioonioperaatori tingimustes töötamiseks, tuleb seda suurendada:
net.netfilter.nf_conntrack_max = 3145728
Samuti on vaja suurendada kĂ”iki ĂŒlekandeid salvestava rĂ€sitabeli Ă€mbrite arvu (see on mooduli nf_conntrack valik):
options nf_conntrack hashsize=1572864
PĂ€rast neid lihtsaid manipuleerimisi saadakse tĂ€iesti töötav disain, mis suudab tĂ”lkida suure hulga kliendiaadresse vĂ€liste aadresside kogumiks. Selle lahenduse jĂ”udlus jĂ€tab aga soovida. Minu esimestel katsetel kasutada GNU/Linuxi NAT-i jaoks (umbes 2013. aastal) suutsin saavutada kiirusega umbes 7 Gbit/s 0.8 Mpps serveri kohta (Xeon E5-1650v2). Sellest ajast peale on GNU/Linuxi kerneli vĂ”rgupinus tehtud palju erinevaid optimeerimisi, ĂŒhe serveri jĂ”udlus samal riistvaral on tĂ”usnud ligi 18-19 Gbit/s kiirusel 1.8-1.9 Mpps (need olid maksimumvÀÀrtused) , kuid nĂ”udlus ĂŒhe serveri poolt töödeldava liiklusmahu jĂ€rele kasvas palju kiiremini. Selle tulemusena töötati vĂ€lja skeemid erinevate serverite koormuse tasakaalustamiseks, kuid see kĂ”ik suurendas pakutavate teenuste seadistamise, hooldamise ja kvaliteedi sĂ€ilitamise keerukust.
NFTable
TĂ€napĂ€eval on tarkvara âvahetuskottideâ moes trend DPDK ja XDP kasutamine. Sellel teemal on kirjutatud palju artikleid, peetud palju erinevaid sĂ”navĂ”tte, ilmuvad kommertstooted (nĂ€iteks SKAT firmalt VasExperts). Kuid arvestades telekommunikatsioonioperaatorite piiratud programmeerimisressursse, on nende raamistike pĂ”hjal mis tahes "toote" ise loomine ĂŒsna problemaatiline. Sellist lahendust on tulevikus palju keerulisem kasutada, eelkĂ”ige tuleb vĂ€lja töötada diagnostikavahendid. NĂ€iteks tavaline tcpdump koos DPDK-ga ei tööta niisama ega nĂ€e XDP abil juhtmetesse tagasi saadetud pakette. Keset kogu juttu uutest tehnoloogiatest pakettide edastamiseks kasutajaruumi, jĂ€id need mĂ€rkamatuks Đž Pablo Neira Ayuso, iptablesi hooldaja, voo mahalaadimise arendamise kohta nftablesis. Vaatame seda mehhanismi lĂ€hemalt.
PĂ”hiidee seisneb selles, et kui ruuter lĂ€bis ĂŒhest seansist pakette voo mĂ”lemas suunas (TCP seanss lĂ€ks olekusse ESTABLISHED), siis ei ole vaja selle seansi jĂ€rgnevaid pakette lĂ€bida kĂ”ik tulemĂŒĂŒrireeglid, sest kĂ”ik need kontrollid lĂ”ppevad ikkagi sellega, et pakett suunatakse edasi marsruutimisse. Ja me ei pea tegelikult marsruuti valima â me juba teame, millisele liidesele ja millisele hostile peame selle seansi jooksul pakette saatma. JÀÀb vaid see teave salvestada ja kasutada marsruutimiseks pakettide töötlemise varases staadiumis. NAT-i teostamisel on vaja tĂ€iendavalt salvestada teavet mooduli nf_conntrack tĂ”lgitud aadresside ja portide muutuste kohta. Jah, muidugi, sel juhul lakkavad töötamast erinevad politseinikud ja muud info- ja statistikareeglid iptablesis, aga eraldiseisva NAT vĂ”i nĂ€iteks piiri ĂŒlesande raames pole see nii oluline, sest teenused on jagatud seadmete vahel.
Konfiguratsioon
Selle funktsiooni kasutamiseks vajame:
- Kasutage vĂ€rsket tuuma. Hoolimata asjaolust, et funktsionaalsus ise ilmus kernelis 4.16, oli see ĂŒsna pikka aega vĂ€ga "toores" ja pĂ”hjustas regulaarselt kerneli paanikat. KĂ”ik stabiliseerus 2019. aasta detsembri paiku, kui vĂ€lja anti LTS-i tuumad 4.19.90 ja 5.4.5.
- Kirjutage iptablesi reeglid ĂŒmber nftables-vormingus, kasutades nftablesi ĂŒsna vĂ€rsket versiooni. Töötab tĂ€pselt versioonis 0.9.0
Kui esimese punktiga on pĂ”himĂ”tteliselt kĂ”ik selge, peaasi, et moodulit monteerimisel konfiguratsiooni ei unustataks (CONFIG_NFT_FLOW_OFFLOAD=m), siis teine ââpunkt vajab selgitust. nftablesi reegleid kirjeldatakse hoopis teisiti kui iptablesis. paljastab peaaegu kĂ”ik punktid, on ka erilisi reeglid iptables-ist nftable-ni. SeetĂ”ttu toon ainult nĂ€ite NAT-i seadistamise ja voo mahalaadimise kohta. VĂ€ike legend nĂ€iteks: , - need on vĂ”rguliidesed, mida liiklus lĂ€bib; tegelikkuses vĂ”ib neid olla rohkem kui kaks. , â valgete aadresside vahemiku algus- ja lĂ”ppaadress.
NAT-i konfigureerimine 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
}
}
Voolu mahalaadimisega on see veidi keerulisem, kuid ĂŒsna 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;
}
}
See on tegelikult kogu seadistus. NĂŒĂŒd langeb kogu TCP/UDP-liiklus fastnat-tabelisse ja seda töödeldakse palju kiiremini.
JĂ€reldused
Et teha selgeks, kui "palju kiirem" see on, lisan ekraanipildi kahe pÀris serveri koormusest, millel on sama riistvara (Xeon E5-1650v2), mis on identselt konfigureeritud ja kasutavad sama Linuxi tuuma, kuid tÀidavad iptablesis NAT-i. (NAT4) ja nftables (NAT5).

Ekraanipildil pole pakettide graafikut sekundis, kuid nende serverite laadimisprofiilis on paketi keskmine suurus umbes 800 baiti, seega ulatuvad vÀÀrtused kuni 1.5 Mpps. Nagu nĂ€ete, on nftablesiga serveril tohutu jĂ”udlusreserv. Praegu töötleb see server kiirusega kuni 30 Gbit/s kiirusel 3Mpps ja on selgelt suuteline tĂ€itma fĂŒĂŒsilise vĂ”rgu piirangut 40 Gbps, omades samal ajal tasuta protsessoriressursse.
Loodan, et see materjal on kasulik vĂ”rguinseneridele, kes ĂŒritavad oma serverite jĂ”udlust parandada.
Allikas: www.habr.com
