Kiire marsruutimine ja NAT Linuxis

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 aruanded Đž artiklid 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 muundurid 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).

Kiire marsruutimine ja NAT Linuxis

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

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster