Rotot veloċi u NAT fil-Linux

Hekk kif l-indirizzi IPv4 jitnaqqsu, ħafna operaturi tat-telekomunikazzjoni qed iħabbtu wiċċhom mal-ħtieġa li jipprovdu lill-klijenti tagħhom b'aċċess għan-netwerk permezz tat-traduzzjoni tal-indirizzi. F'dan l-artikolu ser ngħidlek kif tista 'tikseb prestazzjoni ta' Carrier Grade NAT fuq servers tal-komoditajiet.

Ftit storja

Is-suġġett tal-eżawriment tal-ispazju tal-indirizz IPv4 m'għadux ġdid. F'xi punt, dehru listi ta' stennija f'RIPE, imbagħad ħarġu skambji li fihom kienu nnegozjati blokki ta' indirizzi u ġew konklużi ftehimiet biex jikruhom. Bil-mod il-mod, l-operaturi tat-telekomunikazzjoni bdew jipprovdu servizzi ta’ aċċess għall-Internet billi jużaw it-traduzzjoni tal-indirizz u l-port. Xi wħud ma rnexxielhomx jiksbu biżżejjed indirizzi biex joħorġu indirizz "abjad" lil kull abbonat, filwaqt li oħrajn bdew jiffrankaw il-flus billi rrifjutaw li jixtru indirizzi fis-suq sekondarju. Il-manifatturi tat-tagħmir tan-netwerk appoġġjaw din l-idea, għaliex din il-funzjonalità normalment teħtieġ moduli ta' estensjoni jew liċenzji addizzjonali. Pereżempju, fil-linja ta 'routers MX ta' Juniper (ħlief għall-aħħar MX104 u MX204), tista 'twettaq NAPT fuq karta ta' servizz MS-MIC separata, Cisco ASR1k teħtieġ liċenzja CGN, Cisco ASR9k teħtieġ modulu A9K-ISM-100 separat. u liċenzja A9K-CGN -LIC lilu. B'mod ġenerali, il-pjaċir jiswa ħafna flus.

IPTables

Il-kompitu tat-twettiq ta 'NAT ma jeħtieġx riżorsi tal-kompjuters speċjalizzati; jista' jiġi solvut minn proċessuri għal skopijiet ġenerali, li huma installati, pereżempju, fi kwalunkwe router tad-dar. Fuq l-iskala ta' operatur tat-telekomunikazzjoni, din il-problema tista' tiġi solvuta bl-użu ta' servers tal-komoditajiet li jħaddmu FreeBSD (ipfw/pf) jew GNU/Linux (iptables). Aħna mhux se nikkunsidraw FreeBSD, għax... Waqaft nuża dan l-OS żmien twil ilu, għalhekk aħna nżommu ma' GNU/Linux.

L-abilitazzjoni tat-traduzzjoni tal-indirizzi mhi diffiċli xejn. L-ewwel trid tirreġistra regola f'iptables fit-tabella nat:

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

Is-sistema operattiva se tgħabbi l-modulu nf_conntrack, li se jimmonitorja l-konnessjonijiet attivi kollha u jwettaq il-konverżjonijiet meħtieġa. Hemm diversi irqaq hawn. L-ewwelnett, peress li qed nitkellmu dwar NAT fuq l-iskala ta 'operatur tat-telekomunikazzjoni, huwa meħtieġ li jiġu aġġustati l-timeouts, għaliex b'valuri awtomatiċi d-daqs tat-tabella tat-traduzzjoni malajr jikber għal valuri katastrofiċi. Hawn taħt hawn eżempju tas-settings li użajt fuq is-servers tiegħi:

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

U t-tieni, peress li d-daqs default tat-tabella tat-traduzzjoni mhuwiex iddisinjat biex jaħdem taħt il-kundizzjonijiet ta 'operatur tat-telekomunikazzjoni, jeħtieġ li jiżdied:

net.netfilter.nf_conntrack_max = 3145728

Huwa wkoll meħtieġ li jiżdied in-numru ta 'bramel għat-tabella hash li taħżen ix-xandiriet kollha (din hija għażla fil-modulu nf_conntrack):

options nf_conntrack hashsize=1572864

Wara dawn il-manipulazzjonijiet sempliċi, jinkiseb disinn kompletament li jaħdem li jista 'jittraduċi numru kbir ta' indirizzi tal-klijenti f'ġabra ta 'dawk esterni. Madankollu, il-prestazzjoni ta 'din is-soluzzjoni tħalli ħafna x'tifhem. Fl-ewwel tentattivi tiegħi biex nuża GNU/Linux għal NAT (madwar 2013), stajt nikseb prestazzjoni ta' madwar 7Gbit/s f'0.8Mpps għal kull server (Xeon E5-1650v2). Minn dak iż-żmien, saru ħafna ottimizzazzjonijiet differenti fil-munzell tan-netwerk tal-kernel GNU/Linux, il-prestazzjoni ta 'server wieħed fuq l-istess ħardwer żdiedet għal kważi 18-19 Gbit/s f'1.8-1.9 Mpps (dawn kienu l-valuri massimi) , iżda d-domanda għall-volum tat-traffiku, ipproċessat minn server wieħed kibret ħafna aktar malajr. Bħala riżultat, ġew żviluppati skemi biex jibbilanċjaw it-tagħbija fuq servers differenti, iżda dan kollu żied il-kumplessità tat-twaqqif, iż-żamma u ż-żamma tal-kwalità tas-servizzi pprovduti.

NTFables

Illum il-ġurnata, xejra tal-moda fis-softwer "basktijiet li jinbidlu" hija l-użu ta 'DPDK u XDP. Inkitbu ħafna artikli fuq dan is-suġġett, saru ħafna diskorsi differenti, u qed jidhru prodotti kummerċjali (per eżempju, SKAT minn VasExperts). Iżda minħabba r-riżorsi limitati tal-ipprogrammar tal-operaturi tat-telekomunikazzjoni, huwa pjuttost problematiku li toħloq kwalunkwe "prodott" ibbażat fuq dawn l-oqfsa waħdek. Se jkun ħafna aktar diffiċli li titħaddem soluzzjoni bħal din fil-futur; b'mod partikolari, se jkollhom jiġu żviluppati għodod dijanjostiċi. Pereżempju, tcpdump standard b'DPDK mhux se jaħdem biss hekk, u mhux se "jara" pakketti mibgħuta lura lill-wajers bl-użu ta 'XDP. Fost it-taħdit kollu dwar teknoloġiji ġodda għall-ħruġ tal-kunsinna tal-pakketti għall-ispazju tal-utent, baqgħu inosservati rapporti и oġġetti Pablo Neira Ayuso, manutenzjoni ta 'iptables, dwar l-iżvilupp tal-fluss tal-ħruġ f'nftables. Ejja nagħtu ħarsa aktar mill-qrib lejn dan il-mekkaniżmu.

L-idea ewlenija hija li jekk ir-router għadda pakketti minn sessjoni waħda fiż-żewġ direzzjonijiet tal-fluss (is-sessjoni TCP marret fl-istat STABBILIT), allura m'hemmx għalfejn tgħaddi pakketti sussegwenti ta 'din is-sessjoni permezz tar-regoli kollha tal-firewall, minħabba li dawn il-kontrolli kollha xorta se jispiċċaw bil-pakkett jiġi trasferit aktar għar-routing. U fil-fatt m'għandniex bżonn nagħżlu rotta - diġà nafu lil liema interface u lil liema host għandna bżonn nibagħtu pakketti f'din is-sessjoni. Li jibqa 'huwa li taħżen din l-informazzjoni u tużaha għar-rotot fi stadju bikri tal-ipproċessar tal-pakketti. Meta twettaq NAT, huwa meħtieġ li wkoll tinħażen informazzjoni dwar bidliet fl-indirizzi u l-portijiet tradotti mill-modulu nf_conntrack. Iva, ovvjament, f'dan il-każ diversi pulizija u regoli oħra ta 'informazzjoni u statistika f'iptables jieqfu jaħdmu, iżda fil-qafas tal-kompitu ta' NAT permanenti separat jew, pereżempju, fruntiera, dan mhux daqshekk importanti, minħabba li s-servizzi huma mqassma fuq l-apparati.

Konfigurazzjoni

Biex nużaw din il-funzjoni neħtieġu:

  • Uża qalba friska. Minkejja l-fatt li l-funzjonalità nnifisha dehret fil-qalba 4.16, għal żmien pjuttost twil kienet ħafna "mhux maħduma" u regolarment ikkawżat paniku tal-qalba. Kollox stabbilizza madwar Diċembru 2019, meta ġew rilaxxati l-qlub LTS 4.19.90 u 5.4.5.
  • Ikteb mill-ġdid ir-regoli iptables fil-format nftables billi tuża verżjoni pjuttost reċenti ta 'nftables. Jaħdem eżatt fil-verżjoni 0.9.0

Jekk kollox fil-prinċipju huwa ċar bl-ewwel punt, il-ħaġa prinċipali hija li ma ninsewx li tinkludi l-modulu fil-konfigurazzjoni waqt l-assemblaġġ (CONFIG_NFT_FLOW_OFFLOAD=m), allura t-tieni punt jeħtieġ spjegazzjoni. regoli nftables huma deskritti kompletament differenti minn iptables. Dokumentazzjoni jiżvela kważi l-punti kollha, hemm ukoll speċjali konvertituri regoli minn iptables għal nftables. Għalhekk, se nagħti biss eżempju ta 'twaqqif ta' NAT u flow offload. Leġġenda żgħira pereżempju: , - dawn huma l-interfaces tan-netwerk li minnhom jgħaddi t-traffiku; fir-realtà jista’ jkun hemm aktar minn tnejn minnhom. , — l-indirizz tal-bidu u tat-tmiem tal-firxa ta’ indirizzi “bojod”.

Il-konfigurazzjoni tan-NAT hija sempliċi ħafna:

#! /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
        }
}

Bil-fluss tal-fluss huwa ftit aktar ikkumplikat, iżda pjuttost jinftiehem:

#! /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;
        }
}

Dik, fil-fatt, hija s-setup kollu. Issa t-traffiku kollu TCP/UDP se jaqa' fit-tabella fastnat u jiġi pproċessat ħafna aktar malajr.

Sejbiet

Biex tagħmilha ċara kemm dan huwa "ħafna aktar mgħaġġel", se nehmeż screenshot tat-tagħbija fuq żewġ servers reali, bl-istess ħardwer (Xeon E5-1650v2), ikkonfigurat b'mod identiku, bl-użu tal-istess għadma tal-Linux, iżda li twettaq NAT f'iptables (NAT4) u f'nftables (NAT5).

Rotot veloċi u NAT fil-Linux

M'hemm l-ebda grafika ta 'pakketti kull sekonda fil-screenshot, iżda fil-profil tat-tagħbija ta' dawn is-servers id-daqs medju tal-pakkett huwa ta 'madwar 800 bytes, għalhekk il-valuri jilħqu sa 1.5Mpps. Kif tistgħu taraw, is-server b'nftables għandu riżerva ta 'prestazzjoni enormi. Bħalissa, dan is-server jipproċessa sa 30Gbit/s bi 3Mpps u huwa ċar li kapaċi jilħaq il-limitazzjoni tan-netwerk fiżiku ta '40Gbps, filwaqt li jkollu riżorsi CPU b'xejn.

Nittama li dan il-materjal ikun utli għall-inġiniera tan-netwerk li jippruvaw itejbu l-prestazzjoni tas-servers tagħhom.

Sors: www.habr.com

Żid kumment