Масири зуд ва NAT дар Linux

Вақте ки суроғаҳои IPv4 тамом мешаванд, бисёре аз операторони телекоммуникатсионӣ бо зарурати таъмини муштариёни худ бо истифода аз тарҷумаи суроғаҳо дастрасии шабакаро доранд. Дар ин мақола ман ба шумо мегӯям, ки чӣ тавр шумо метавонед иҷрои Carrier Grade NAT-ро дар серверҳои молӣ ба даст оред.

Якчанд таърих

Мавзӯи суроғаи IPv4 тамомшавии фазо дигар нав нест. Дар баъзе лаҳзаҳо, дар RIPE рӯйхатҳои интизорӣ пайдо шуданд, пас биржаҳо пайдо шуданд, ки дар онҳо блокҳои суроғаҳо савдо карда шуданд ва барои иҷораи онҳо аҳдҳо баста шуданд. Оҳиста-оҳиста операторони алоқа бо истифода аз суроғаҳо ва тарҷумаи портҳо хидматрасонии дастрасӣ ба Интернетро оғоз карданд. Баъзеҳо натавонистанд суроғаи кофиро ба даст оранд, то ба ҳар як муштарӣ суроғаи «сафед» дода шавад, дигарон бошанд, аз хариди суроғаҳо дар бозори такрорӣ худдорӣ карда, маблағро сарфа карданд. Истеҳсолкунандагони таҷҳизоти шабакавӣ ин фикрро дастгирӣ карданд, зеро ин функсия одатан модулҳои иловагӣ ё иҷозатномаҳоро талаб мекунад. Масалан, дар хати роутерҳои MX Juniper (ба истиснои охирини MX104 ва MX204), шумо метавонед NAPT-ро дар корти хидматрасонии алоҳидаи MS-MIC иҷро кунед, Cisco ASR1k иҷозатномаи CGN-ро талаб мекунад, Cisco ASR9k модули алоҳидаи A9K-ISM-100-ро талаб мекунад. ва иҷозатномаи A9K-CGN -LIC ба ӯ. Умуман, лаззат пули зиёдеро талаб мекунад.

IPTables

Вазифаи иҷрои NAT захираҳои махсуси ҳисоббарориро талаб намекунад, онро протсессорҳои таъиноти умумӣ ҳал кардан мумкин аст, ки масалан, дар ҳама гуна роутери хонагӣ насб карда мешаванд. Дар миқёси оператори телекоммуникатсионӣ, ин мушкилотро метавон бо истифода аз серверҳои молии FreeBSD (ipfw/pf) ё GNU/Linux (iptables) ҳал кард. Мо FreeBSD-ро баррасӣ намекунем, зеро... Ман истифодаи ин ОС-ро хеле пештар бас кардам, аз ин рӯ мо ба GNU/Linux пайваст мешавем.

Даргиронидани тарҷумаи суроғаҳо аслан душвор нест. Аввал шумо бояд қоидаро дар iptables дар ҷадвали nat сабт кунед:

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

Системаи оператсионӣ модули nf_conntrack-ро бор мекунад, ки ҳамаи пайвастҳои фаъолро назорат мекунад ва табдили заруриро иҷро мекунад. Дар ин ҷо якчанд нозукиҳо мавҷуданд. Аввалан, азбаски мо дар бораи NAT дар миқёси оператори телекоммуникатсионӣ сухан меронем, лозим аст, ки мӯҳлатҳои вақтро танзим кунед, зеро бо арзишҳои пешфарз андозаи ҷадвали тарҷума зуд ба арзишҳои фалокатовар меафзояд. Дар зер намунаи танзимоте, ки ман дар серверҳои худ истифода мебарам:

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

Ва дуюм, азбаски андозаи пешфарзи ҷадвали тарҷума барои кор дар шароити оператори телекоммуникатсионӣ пешбинӣ нашудааст, онро зиёд кардан лозим аст:

net.netfilter.nf_conntrack_max = 3145728

Инчунин шумораи сатилҳоро барои ҷадвали hash нигоҳ доштани ҳама пахшҳоро зиёд кардан лозим аст (ин вариант дар модули nf_conntrack аст):

options nf_conntrack hashsize=1572864

Пас аз ин манипулятсияҳои оддӣ, тарҳи комилан корӣ ба даст меояд, ки метавонад шумораи зиёди суроғаҳои муштариро ба ҳавзи суроғаҳои беруна тарҷума кунад. Бо вуҷуди ин, иҷрои ин ҳалли бисёр чизҳоро талаб мекунад. Дар аввалин кӯшишҳои ман барои истифодаи GNU/Linux барои NAT (тақрибан 2013), ман тавонистам иҷрои тақрибан 7 Гбит/с дар 0.8 Мп/с дар як сервер (Xeon E5-1650v2) гирам. Аз он вақт инҷониб, дар стек шабакавии ядрои GNU/Linux бисёр оптимизатсияҳо анҷом дода шуданд, кори як сервер дар як сахтафзор тақрибан ба 18-19 Гбит/с дар 1.8-1.9 Мп/с афзоиш ёфт (инҳо ҳадди аксар буданд арзишҳо), аммо талабот ба ҳаҷми трафик, ки аз ҷониби як сервер коркард мешавад, хеле зудтар афзоиш ёфт. Дар натиҷа, схемаҳо барои мувозинати сарборӣ ба серверҳои гуногун таҳия карда шуданд, аммо ҳамаи ин мушкилии танзим, нигоҳдорӣ ва нигоҳ доштани сифати хидматҳои пешниҳодшударо зиёд кард.

NTFables

Дар айни замон, тамоюли мӯд дар нармафзори "халтаҳои интиқол" истифодаи DPDK ва XDP мебошад. Дар ин мавзӯъ мақолаҳои зиёде навишта шудаанд, суханрониҳои гуногун гуфта шудаанд ва маҳсулоти тиҷоратӣ пайдо мешаванд (масалан, SKAT аз VasExperts). Аммо бо дарназардошти захираҳои маҳдуди барномасозии операторони телекоммуникатсионӣ, мустақилона сохтани ҳама гуна “маҳсулот” дар асоси ин чаҳорчӯбаҳо хеле мушкил аст. Дар оянда кор фармудани чунин ҳалли мушкилтар хоҳад буд, аз ҷумла, асбобҳои ташхис бояд таҳия карда шаванд. Масалан, стандарти tcpdump бо DPDK айнан ҳамин тавр кор намекунад ва бастаҳоеро, ки бо истифода аз XDP ба симҳо фиристода шудаанд, "намебинад". Дар байни ҳама гуфтугӯҳо дар бораи технологияҳои нави интиқоли пакетҳо ба фазои корбар, онҳо нодида монданд. хабар медихад и мақолаҳо Пабло Нейра Аюсо, нигоҳдории iptables, дар бораи рушди интиқоли ҷараён дар nftables. Биёед ин механизмро муфассалтар дида бароем.

Идеяи асосӣ дар он аст, ки агар роутер пакетҳоро аз як сеанс ба ҳар ду самти ҷараён гузаронад (сеанси TCP ба ҳолати ИСТИФОДАГОРӢ рафт), пас зарурати гузаштани бастаҳои минбаъдаи ин сессия аз тамоми қоидаҳои брандмауэр вуҷуд надорад, зеро ҳамаи ин санҷишҳо бо интиқоли минбаъда ба масир ба анҷом мерасанд. Ва ба мо аслан лозим нест, ки масир интихоб кунем - мо аллакай медонем, ки ба кадом интерфейс ва ба кадом ҳост мо бояд пакетҳоро дар ин сессия фиристем. Танҳо нигоҳ доштани ин маълумот ва истифодаи он барои масир дар марҳилаи аввали коркарди бастаҳо боқӣ мемонад. Ҳангоми иҷрои NAT, маълумотро дар бораи тағирёбии суроғаҳо ва портҳое, ки аз ҷониби модули nf_conntrack тарҷума шудаанд, ба таври иловагӣ нигоҳ доштан лозим аст. Бале, албатта, дар ин ҳолат полисҳои гуногун ва дигар иттилоот ва қоидаҳои оморӣ дар iptables кор карданро қатъ мекунанд, аммо дар доираи вазифаи алоҳидаи NAT ё, масалан, сарҳад, ин чандон муҳим нест, зеро хидматҳо дар байни дастгоҳҳо тақсим карда мешаванд.

Танзимот

Барои истифодаи ин функсия ба мо лозим аст:

  • Як ядрои тару тозаро истифода баред. Сарфи назар аз он, ки худи функсия дар ядрои 4.16 пайдо шуд, он муддати тӯлонӣ хеле "хом" буд ва мунтазам боиси воҳимаи ядро ​​​​мебуд. Ҳама чиз тақрибан моҳи декабри соли 2019 мӯътадил шуд, вақте ки ядроҳои LTS 4.19.90 ва 5.4.5 бароварда шуданд.
  • Қоидаҳои iptables-ро дар формати nftables бо истифода аз версияи хеле охирини nftables аз нав нависед. Маҳз дар версияи 0.9.0 кор мекунад

Агар бо банди аввал ҳама чиз фаҳмо бошад, чизи асосӣ ин аст, ки фаромӯш накунед, ки модулро дар конфигуратсия ҳангоми васлкунӣ дохил кунед (CONFIG_NFT_FLOW_OFFLOAD=m), пас нуқтаи дуюм шарҳро талаб мекунад. Қоидаҳои nftables нисбат ба iptables комилан фарқ мекунанд. сабт кариб хамаи нуктахоро ошкор мекунад, махсус низ мавчуданд табдилдиҳандагон қоидаҳо аз iptables то nftables. Аз ин рӯ, ман танҳо як мисоли танзими NAT ва интиқоли ҷараёнро медиҳам. Масалан, як ривояти хурд: , - инҳо интерфейсҳои шабакавӣ мебошанд, ки тавассути онҳо трафик мегузарад; дар асл метавонад аз дутои онҳо зиёд бошад. , — адреси ибтидой ва охири диапазони адресхои «сафед».

Конфигуратсияи NAT хеле содда аст:

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

Бо интиқоли ҷараён он каме мураккабтар аст, аммо хеле фаҳмо аст:

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

Дар асл, ин тамоми танзимот аст. Акнун тамоми трафики TCP/UDP ба ҷадвали fastnat меафтад ва хеле зудтар коркард мешавад.

натиҷаҳои

Барои равшан кардани он, ки ин чӣ қадар "тезтар" аст, ман скриншоти борро дар ду сервери воқеӣ бо ҳамон сахтафзор (Xeon E5-1650v2) замима хоҳам кард, ки якхела конфигуратсия шудаанд, бо истифода аз як ядрои Linux, аммо NAT-ро дар iptables иҷро мекунанд. (NAT4) ва дар nftables (NAT5).

Масири зуд ва NAT дар Linux

Дар скриншот графики пакетҳо дар як сония вуҷуд надорад, аммо дар профили боркунии ин серверҳо андозаи миёнаи бастаҳо тақрибан 800 байт аст, бинобар ин, арзишҳо то 1.5Mpps мерасад. Тавре ки шумо мебинед, сервер бо nftables дорои захираи бузурги иҷроиш мебошад. Дар айни замон, ин сервер то 30 Гбит/с дар 3 Мп/с коркард мекунад ва ба таври возеҳ қодир аст, ки маҳдудияти шабакаи физикии 40 Гбит/с дар ҳолест, ки захираҳои ройгони CPU дошта бошад.

Ман умедворам, ки ин мавод барои муҳандисони шабака муфид хоҳад буд, ки кӯшиш мекунанд, ки кори серверҳои худро беҳтар кунанд.

Манбаъ: will.com

Илова Эзоҳ