Paspas nga routing ug NAT sa Linux

Samtang ang mga adres sa IPv4 nahurot, daghang mga operator sa telecom ang nag-atubang sa panginahanglan nga mahatagan ang ilang mga kliyente og access sa network gamit ang paghubad sa address. Sa kini nga artikulo isulti ko kanimo kung giunsa nimo makuha ang pasundayag sa Carrier Grade NAT sa mga server sa produkto.

Usa ka gamay nga kasaysayan

Ang hilisgutan sa IPv4 address space exhaustion dili na bag-o. Sa pila ka punto, ang mga lista sa paghulat nagpakita sa RIPE, unya ang mga pagbinayloay mitumaw kung diin ang mga bloke sa mga adres gibaligya ug ang mga deal gitapos sa pag-abang kanila. Sa hinay-hinay, ang mga operator sa telecom nagsugod sa paghatag og mga serbisyo sa pag-access sa Internet gamit ang address ug port translation. Ang uban wala makakuha og igo nga mga adres aron mag-isyu sa usa ka "puti" nga adres sa matag subscriber, samtang ang uban nagsugod sa pagtipig salapi pinaagi sa pagdumili sa pagpalit sa mga adres sa sekondaryang merkado. Gisuportahan sa mga tiggama sa kagamitan sa network kini nga ideya, tungod kay kini nga pag-andar kasagaran nanginahanglan dugang nga mga module sa extension o lisensya. Pananglitan, sa linya sa MX router ni Juniper (gawas sa pinakabag-o nga MX104 ug MX204), mahimo nimong buhaton ang NAPT sa usa ka bulag nga MS-MIC service card, ang Cisco ASR1k nanginahanglan usa ka lisensya sa CGN, ang Cisco ASR9k nanginahanglan usa ka bulag nga module sa A9K-ISM-100 ug usa ka lisensya sa A9K-CGN -LIC kaniya. Sa kinatibuk-an, ang kalipay nagkantidad ug daghang salapi.

IPTables

Ang tahas sa pagbuhat sa NAT wala magkinahanglan og espesyal nga mga kapanguhaan sa pag-compute; kini masulbad pinaagi sa mga processor sa kinatibuk-ang katuyoan, nga gi-install, pananglitan, sa bisan unsang home router. Sa sukod sa usa ka operator sa telecom, kini nga problema masulbad gamit ang mga commodity server nga nagpadagan sa FreeBSD (ipfw/pf) o GNU/Linux (iptables). Dili namo tagdon ang FreeBSD, tungod kay... Dugay na kong mihunong sa paggamit niini nga OS, mao nga magpabilin kami sa GNU/Linux.

Ang pagpagana sa paghubad sa adres dili gyud lisud. Una kinahanglan nimo nga magparehistro sa usa ka lagda sa iptables sa nat table:

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

Ang operating system magkarga sa module nga nf_conntrack, nga magmonitor sa tanan nga aktibo nga koneksyon ug maghimo sa gikinahanglan nga mga pagkakabig. Adunay daghang mga subtleties dinhi. Una, tungod kay naghisgot kami bahin sa NAT sa sukod sa usa ka operator sa telecom, kinahanglan nga ayohon ang mga timeout, tungod kay sa mga default nga kantidad ang gidak-on sa lamesa sa paghubad dali nga motubo sa mga kantidad sa katalagman. Sa ubos usa ka pananglitan sa mga setting nga akong gigamit sa akong mga server:

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

Ug ikaduha, tungod kay ang default nga gidak-on sa lamesa sa paghubad wala gilaraw aron molihok sa ilawom sa mga kondisyon sa usa ka operator sa telecom, kinahanglan kini nga dugangan:

net.netfilter.nf_conntrack_max = 3145728

Kinahanglan usab nga dugangan ang gidaghanon sa mga balde alang sa hash table nga nagtipig sa tanan nga mga sibya (kini usa ka kapilian sa nf_conntrack module):

options nf_conntrack hashsize=1572864

Pagkahuman niining yano nga mga manipulasyon, nakuha ang usa ka hingpit nga nagtrabaho nga disenyo nga makahubad sa daghang mga adres sa kliyente ngadto sa usa ka pool sa mga eksternal. Bisan pa, ang paghimo sa kini nga solusyon labi nga gitinguha. Sa una nakong pagsulay sa paggamit sa GNU/Linux para sa NAT (circa 2013), nakuha nako ang performance sa palibot sa 7Gbit/s sa 0.8Mpps kada server (Xeon E5-1650v2). Sukad niadtong panahona, daghang lain-laing mga pag-optimize ang nahimo sa GNU/Linux kernel network stack, ang performance sa usa ka server sa samang hardware mitubo ngadto sa halos 18-19 Gbit/s sa 1.8-1.9 Mpps (kini ang pinakataas nga kantidad) , apan ang panginahanglan alang sa gidaghanon sa trapiko, nga giproseso sa usa ka server mas paspas nga mitubo. Ingon usa ka sangputanan, ang mga laraw sa pagbalanse sa load gihimo alang sa lainlaing mga server, apan kining tanan nagdugang sa pagkakomplikado sa pag-set up, pagpadayon ug pagpadayon sa kalidad sa mga serbisyo nga gihatag.

NTFables

Karong panahona, usa ka uso nga uso sa software nga "pagbalhin sa mga bag" mao ang paggamit sa DPDK ug XDP. Daghang mga artikulo ang gisulat bahin niini nga hilisgutan, daghang lainlaing mga pakigpulong ang nahimo, ug ang mga komersyal nga produkto nagpakita (pananglitan, SKAT gikan sa VasExperts). Apan tungod sa limitado nga mga kapanguhaan sa pagprograma sa mga operator sa telecom, medyo problemado ang paghimo og bisan unsang "produkto" base sa kini nga mga balangkas sa imong kaugalingon. Mas lisud ang pag-operate sa ingon nga solusyon sa umaabot; labi na, kinahanglan nga mapalambo ang mga himan sa pagdayagnos. Pananglitan, ang standard nga tcpdump nga adunay DPDK dili molihok sama niana, ug dili kini "makita" ang mga pakete nga gipadala balik sa mga wire gamit ang XDP. Taliwala sa tanan nga mga pakigpulong bahin sa bag-ong mga teknolohiya alang sa pagpasa sa mga pakete sa user-space, wala sila namatikdan. mga taho ΠΈ mga artikulo Pablo Neira Ayuso, iptables maintainer, mahitungod sa pagpalambo sa flow offloading sa nftables. Atong tan-awon pag-ayo kini nga mekanismo.

Ang nag-unang ideya mao nga kung ang router nagpasa sa mga pakete gikan sa usa ka sesyon sa duha ka direksyon sa agos (TCP session miadto sa ESTABLISHED nga estado), nan dili kinahanglan nga ipasa ang sunod nga mga pakete niini nga sesyon pinaagi sa tanan nga mga lagda sa firewall, tungod kay kining tanan nga mga tseke mahuman gihapon sa packet nga ibalhin pa ngadto sa routing. Ug dili gyud kami kinahanglan nga magpili usa ka ruta - nahibal-an na namon kung asa nga interface ug kung unsang host ang kinahanglan namon magpadala mga pakete sa sulod niini nga sesyon. Ang nahabilin mao ang pagtipig niini nga kasayuran ug gamiton kini alang sa pag-ruta sa sayo nga yugto sa pagproseso sa packet. Kung nagpahigayon sa NAT, kinahanglan nga dugang nga pagtipig sa kasayuran bahin sa mga pagbag-o sa mga adres ug pantalan nga gihubad sa module nga nf_conntrack. Oo, siyempre, sa niini nga kaso lain-laing mga pulis ug uban pang mga impormasyon ug statistical nga mga lagda sa iptables mihunong sa pagtrabaho, apan sa sulod sa gambalay sa buluhaton sa usa ka bulag nga nagbarog NAT o, alang sa panig-ingnan, sa usa ka utlanan, kini mao ang dili kaayo importante, tungod kay ang mga serbisyo giapod-apod sa mga aparato.

Pagsalig

Aron magamit kini nga function kinahanglan namon:

  • Gamit ug bag-ong kernel. Bisan pa sa kamatuoran nga ang pag-andar mismo nagpakita sa kernel 4.16, sa dugay nga panahon kini "hilaw" kaayo ug kanunay nga hinungdan sa kalisang sa kernel. Ang tanan nag-stabilize sa Disyembre 2019, kung ang LTS kernels 4.19.90 ug 5.4.5 gipagawas.
  • Isulat pag-usab ang mga lagda sa iptables sa format sa nftables gamit ang bag-o nga bersyon sa nftables. Nagtrabaho sa eksakto sa bersyon 0.9.0

Kung ang tanan sa prinsipyo klaro sa unang punto, ang nag-unang butang dili kalimtan nga ilakip ang module sa pag-configure sa panahon sa asembliya (CONFIG_NFT_FLOW_OFFLOAD=m), nan ang ikaduha nga punto nagkinahanglan og katin-awan. Ang mga lagda sa nftables gihulagway nga hingpit nga lahi kaysa sa iptables. ДокумСнтация nagpadayag sa hapit tanan nga mga punto, adunay mga espesyal usab mga converter mga lagda gikan sa iptables hangtod sa nftables. Busa, mohatag lang ko ug pananglitan sa pag-set up sa NAT ug flow offload. Usa ka gamay nga leyenda pananglitan: , - kini ang mga interface sa network diin moagi ang trapiko; sa tinuud mahimo’g adunay labaw pa sa duha niini. , β€” ang sinugdanan ug katapusan nga adres sa han-ay sa "puti" nga mga adres.

Ang pag-configure sa NAT yano ra:

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

Uban sa pag-agos sa karga kini mas komplikado, apan masabtan:

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

Kana, sa tinuud, mao ang tibuuk nga pag-setup. Karon ang tanang trapiko sa TCP/UDP mahulog sa fastnat table ug mas paspas nga maproseso.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

Aron maklaro kung unsa kini ka "labi ka paspas", i-attach nako ang screenshot sa load sa duha ka tinuod nga server, nga adunay parehas nga hardware (Xeon E5-1650v2), parehas nga gi-configure, gamit ang parehas nga Linux kernel, apan gihimo ang NAT sa mga iptables (NAT4) ug sa nftables (NAT5).

Paspas nga routing ug NAT sa Linux

Walay graph sa mga pakete kada segundo sa screenshot, apan sa load profile niini nga mga server ang kasagaran nga gidak-on sa pakete anaa sa palibot sa 800 bytes, mao nga ang mga bili moabot ngadto sa 1.5Mpps. Sama sa imong nakita, ang server nga adunay mga nftable adunay daghang reserba sa pasundayag. Sa pagkakaron, kini nga server nagproseso hangtod sa 30Gbit/s sa 3Mpps ug klaro nga makahimo sa pagtagbo sa pisikal nga limitasyon sa network nga 40Gbps, samtang adunay libre nga mga kapanguhaan sa CPU.

Nanghinaut ko nga kini nga materyal mapuslanon sa mga inhenyero sa network nga naningkamot nga mapaayo ang pasundayag sa ilang mga server.

Source: www.habr.com

Idugang sa usa ka comment