IPv4-osoitteiden ehtyessä monet teleoperaattorit joutuvat tarjoamaan asiakkailleen verkkoyhteyden osoitteenmuunnoksen avulla. Tässä artikkelissa kerron sinulle, kuinka voit saada Carrier Grade NAT -suorituskyvyn hyödykepalvelimilla.
Vähän historiaa
IPv4-osoitetilan tyhjentäminen ei ole enää uusi aihe. Jossain vaiheessa RIPEen ilmestyi jonotuslistoja, sitten syntyi pörssit, joissa käytiin kauppaa osoitelohkoilla ja solmittiin sopimuksia niiden vuokraamisesta. Vähitellen teleoperaattorit alkoivat tarjota Internet-yhteyspalveluita osoite- ja porttikäännösten avulla. Jotkut eivät onnistuneet saamaan tarpeeksi osoitteita antaakseen "valkoisen" osoitteen jokaiselle tilaajalle, kun taas toiset alkoivat säästää rahaa kieltäytymällä ostamasta osoitteita jälkimarkkinoilta. Verkkolaitteiden valmistajat tukivat tätä ajatusta, koska Tämä toiminto vaatii yleensä lisälaajennusmoduuleja tai -lisenssejä. Esimerkiksi Juniperin MX-reitittimien sarjassa (paitsi uusimmat MX104 ja MX204) voit suorittaa NAPT:n erillisellä MS-MIC-palvelukortilla, Cisco ASR1k vaatii CGN-lisenssin, Cisco ASR9k vaatii erillisen A9K-ISM-100-moduulin. ja A9K-CGN-lisenssi -LIC hänelle. Yleensä ilo maksaa paljon rahaa.
iptables
NAT:n suorittaminen ei vaadi erityisiä laskentaresursseja, se voidaan ratkaista yleiskäyttöisillä prosessoreilla, jotka asennetaan esimerkiksi mihin tahansa kotireitittimeen. Teleoperaattorin mittakaavassa tämä ongelma voidaan ratkaista käyttämällä hyödykkeitä, joissa on FreeBSD (ipfw/pf) tai GNU/Linux (iptables). Emme harkitse FreeBSD:tä, koska... Lopetin tämän käyttöjärjestelmän käytön jo kauan sitten, joten pysymme GNU/Linuxissa.
Osoitteen kääntäminen ei ole ollenkaan vaikeaa. Ensin sinun on rekisteröitävä sääntö iptablesissa nat-taulukossa:
iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -j SNAT --to <pool_start_addr>-<pool_end_addr> --persistent
Käyttöjärjestelmä lataa nf_conntrack-moduulin, joka valvoo kaikkia aktiivisia yhteyksiä ja suorittaa tarvittavat muunnokset. Tässä on useita hienouksia. Ensinnäkin, koska puhumme NAT:sta teleoperaattorin mittakaavassa, on tarpeen säätää aikakatkaisuja, koska oletusarvoilla käännöstaulukon koko kasvaa nopeasti katastrofaalisiin arvoihin. Alla on esimerkki asetuksista, joita käytin palvelimillani:
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 toiseksi, koska käännöstaulukon oletuskokoa ei ole suunniteltu toimimaan teleoperaattorin olosuhteissa, sitä on lisättävä:
net.netfilter.nf_conntrack_max = 3145728
On myös tarpeen lisätä kaikki lähetykset tallentavan hash-taulukon segmenttien määrää (tämä on vaihtoehto nf_conntrack-moduulissa):
options nf_conntrack hashsize=1572864
Näiden yksinkertaisten manipulointien jälkeen saadaan täysin toimiva malli, joka voi muuntaa suuren määrän asiakasosoitteita joukkoon ulkoisia osoitteita. Tämän ratkaisun suorituskyky jättää kuitenkin paljon toivomisen varaa. Ensimmäisissä yrityksissäni käyttää GNU/Linuxia NAT:lle (noin 2013) pystyin saavuttamaan noin 7 Gbit/s nopeudella 0.8 Mpps per palvelin (Xeon E5-1650v2). Siitä lähtien GNU/Linux-ytimen verkkopinoon on tehty monia erilaisia optimointeja, yhden palvelimen suorituskyky samalla laitteistolla on noussut lähes 18-19 Gbit/s nopeudella 1.8-1.9 Mpps (nämä olivat maksimiarvot) , mutta yhden palvelimen käsittelemän liikennemäärän kysyntä kasvoi paljon nopeammin. Tämän seurauksena kehitettiin järjestelmiä eri palvelimien kuormituksen tasapainottamiseksi, mutta kaikki tämä lisäsi tarjottujen palvelujen määrittämisen, ylläpidon ja laadun ylläpitämisen monimutkaisuutta.
NFT-taulukot
Nykyään muodikas trendi ohjelmistojen "vaihtolaukuissa" on DPDK:n ja XDP:n käyttö. Aiheesta on kirjoitettu paljon artikkeleita, monia erilaisia puheenvuoroja on pidetty ja kaupallisia tuotteita ilmestyy (esim. VasExpertsin SKAT). Mutta kun otetaan huomioon teleoperaattoreiden rajalliset ohjelmointiresurssit, on melko ongelmallista luoda mitään "tuotetta" näiden kehysten pohjalta yksin. Tällaisen ratkaisun käyttö tulee olemaan tulevaisuudessa paljon vaikeampaa, erityisesti diagnostisia työkaluja on kehitettävä. Esimerkiksi tavallinen tcpdump DPDK:n kanssa ei toimi samalla tavalla, eikä se "näe" paketteja, jotka lähetetään takaisin johtoihin XDP:n avulla. Keskellä kaikkea puhetta uusista teknologioista pakettien edelleenlähettämiseksi käyttäjätilaan, ne jäivät huomaamatta
Pääajatuksena on, että jos reititin välitti paketteja yhdestä istunnosta molempiin kulkusuuntaan (TCP-istunto meni ESTABLISHED-tilaan), tämän istunnon myöhempiä paketteja ei tarvitse kuljettaa kaikkien palomuurisääntöjen läpi, koska kaikki nämä tarkistukset päättyvät silti siihen, että paketti siirretään edelleen reitittimeen. Ja meidän ei itse asiassa tarvitse valita reittiä - tiedämme jo, mihin käyttöliittymään ja mille isännälle meidän on lähetettävä paketteja tämän istunnon aikana. Jäljelle jää vain tallentaa nämä tiedot ja käyttää niitä reitittämiseen pakettien käsittelyn varhaisessa vaiheessa. NAT:ia suoritettaessa on lisäksi tarpeen tallentaa tietoja nf_conntrack-moduulin kääntämistä osoitteiden ja porttien muutoksista. Kyllä, tietysti tässä tapauksessa eri poliisit ja muut tiedot ja tilastosäännöt iptablesissa lakkaavat toimimasta, mutta erillisen pysyvän NATin tai esimerkiksi rajan tehtävän puitteissa tämä ei ole niin tärkeää, koska palvelut jaetaan laitteille.
kokoonpano
Tämän toiminnon käyttämiseksi tarvitsemme:
- Käytä tuoretta ydintä. Huolimatta siitä, että itse toiminnallisuus ilmestyi ytimeen 4.16, se oli melko pitkään erittäin "raaka" ja aiheutti säännöllisesti ytimen paniikkia. Kaikki vakiintui joulukuussa 2019, kun LTS-ytimet 4.19.90 ja 5.4.5 julkaistiin.
- Kirjoita iptables-säännöt uudelleen nftables-muodossa käyttämällä melko tuoretta nftables-versiota. Toimii täsmälleen versiossa 0.9.0
Jos periaatteessa kaikki on selvää ensimmäisestä kohdasta, tärkeintä ei ole unohtaa sisällyttää moduulia kokoonpanoon kokoonpanon aikana (CONFIG_NFT_FLOW_OFFLOAD=m), niin toinen kohta vaatii selitystä. nftables-säännöt on kuvattu täysin eri tavalla kuin iptablesissa.
NAT-määritys on hyvin yksinkertainen:
#! /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
}
}
Virtauksen purkamisen kanssa se on hieman monimutkaisempi, mutta täysin ymmärrettävä:
#! /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;
}
}
Se on itse asiassa koko kokoonpano. Nyt kaikki TCP/UDP-liikenne putoaa fastnat-taulukkoon ja käsitellään paljon nopeammin.
Tulokset
Tehdäkseni selväksi, kuinka "paljon nopeampi" tämä on, liitän mukaan kuvakaappauksen kahdesta todellisesta palvelimesta, joissa on sama laitteisto (Xeon E5-1650v2), identtisesti konfiguroitu ja jotka käyttävät samaa Linux-ydintä, mutta suorittavat NAT:n iptablesissa. (NAT4) ja nftablesissa (NAT5).
Kuvakaappauksessa ei ole kaaviota paketeista sekunnissa, mutta näiden palvelimien kuormitusprofiilissa keskimääräinen pakettikoko on noin 800 tavua, joten arvot yltävät jopa 1.5 Mpps:iin. Kuten näet, nftables-palvelimella on valtava suorituskykyreservi. Tällä hetkellä tämä palvelin käsittelee jopa 30 Gbit/s nopeudella 3Mpps ja pystyy selvästi täyttämään fyysisen verkon rajoituksen 40 Gbps, samalla kun sillä on ilmaisia prosessoriresursseja.
Toivon, että tästä materiaalista on hyötyä verkkoinsinööreille, jotka yrittävät parantaa palvelimiensa suorituskykyä.
Lähde: will.com