Yiyara afisona ati NAT ni Linux

Bi awọn adirẹsi IPv4 ṣe di idinku, ọpọlọpọ awọn oniṣẹ telikomita ni o dojukọ iwulo lati pese awọn alabara wọn pẹlu iraye si nẹtiwọọki nipa lilo itumọ adirẹsi. Ninu àpilẹkọ yii Emi yoo sọ fun ọ bi o ṣe le gba iṣẹ NAT ti Carrier Grade lori awọn olupin eru.

A bit ti itan

Awọn koko ti IPv4 adirẹsi aaye re ko si ohun titun mọ. Ni aaye kan, awọn akojọ idaduro han ni RIPE, lẹhinna awọn iyipada ti o han lori eyiti awọn ohun amorindun ti awọn adirẹsi ti wa ni tita ati awọn iṣowo ti pari lati ya wọn. Ní kẹ̀rẹ̀kẹ̀rẹ̀, àwọn oníṣẹ́ tẹlifóònù bẹ̀rẹ̀ sí pèsè àwọn ìpèsè ìráyè sí Íńtánẹ́ẹ̀tì nípa lílo àdírẹ́sì àti ìtumọ̀ èbúté. Diẹ ninu awọn ko ṣakoso lati gba awọn adirẹsi ti o to lati fun adirẹsi “funfun” kan si alabapin kọọkan, lakoko ti awọn miiran bẹrẹ si fi owo pamọ nipa kiko lati ra awọn adirẹsi lori ọja keji. Awọn aṣelọpọ ti ẹrọ nẹtiwọọki ṣe atilẹyin imọran yii, nitori iṣẹ ṣiṣe yii nigbagbogbo nilo awọn modulu itẹsiwaju tabi awọn iwe-aṣẹ. Fun apẹẹrẹ, ni Juniper ká ila MX onimọ (ayafi fun awọn titun MX104 ati MX204), NAPT le wa ni ošišẹ ti lori lọtọ MS-MIC iṣẹ kaadi, nilo Cisco ASR1k iwe-ašẹ CGN, Cisco ASR9k nilo lọtọ A9K-ISM-100 module. ati awọn ẹya A9K-CGN iwe-ašẹ -LIC fun u. Ni gbogbogbo, igbadun naa jẹ owo pupọ.

IPTables

Iṣẹ ṣiṣe NAT ko nilo awọn orisun iširo amọja; o le ṣe ipinnu nipasẹ awọn ilana idi gbogbogbo, eyiti o fi sii, fun apẹẹrẹ, ni eyikeyi olulana ile. Lori iwọn ti oniṣẹ telecom, iṣoro yii le ṣee yanju nipa lilo awọn olupin eru ti n ṣiṣẹ FreeBSD (ipfw/pf) tabi GNU/Linux (iptables). A kii yoo gbero FreeBSD, nitori… Mo dẹkun lilo OS yii ni igba pipẹ sẹhin, nitorinaa a yoo duro si GNU/Linux.

Muu ṣiṣẹ itumọ adirẹsi ko nira rara. Ni akọkọ o nilo lati forukọsilẹ ofin ni iptables ni tabili nat:

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

Eto ẹrọ naa yoo ṣaja module nf_conntrack, eyiti yoo ṣe atẹle gbogbo awọn asopọ ti nṣiṣe lọwọ ati ṣe awọn iyipada pataki. Ọpọlọpọ awọn arekereke wa nibi. Ni akọkọ, niwọn bi a ti n sọrọ nipa NAT lori iwọn ti oniṣẹ telecom, o jẹ dandan lati ṣatunṣe awọn akoko ipari, nitori pẹlu awọn iye aiyipada iwọn tabili itumọ yoo yarayara si awọn iye ajalu. Ni isalẹ jẹ apẹẹrẹ ti awọn eto ti Mo lo lori olupin mi:

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

Ati ni ẹẹkeji, niwọn igba ti iwọn aiyipada ti tabili itumọ ko ṣe apẹrẹ lati ṣiṣẹ labẹ awọn ipo ti oniṣẹ tẹlifoonu, o nilo lati pọ si:

net.netfilter.nf_conntrack_max = 3145728

O tun jẹ dandan lati mu nọmba awọn garawa pọ si fun tabili hash ti o tọju gbogbo awọn igbohunsafefe (eyi jẹ aṣayan ninu module nf_conntrack):

options nf_conntrack hashsize=1572864

Lẹhin awọn ifọwọyi ti o rọrun wọnyi, apẹrẹ ti n ṣiṣẹ patapata ni a gba ti o le tumọ nọmba nla ti awọn adirẹsi alabara sinu adagun ti awọn ita. Sibẹsibẹ, iṣẹ ti ojutu yii fi ọpọlọpọ silẹ lati fẹ. Ninu awọn igbiyanju akọkọ mi ni lilo GNU/Linux fun NAT (ni ayika 2013), Mo ni anfani lati ni iṣẹ ni ayika 7Gbit/s ni 0.8Mpps fun olupin (Xeon E5-1650v2). Lati akoko yẹn, ọpọlọpọ awọn iṣapeye oriṣiriṣi ni a ti ṣe ni akopọ nẹtiwọọki ekuro GNU/Linux, iṣẹ olupin kan lori ohun elo kanna ti pọ si o fẹrẹ to 18-19 Gbit/s ni 1.8-1.9 Mpps (iwọnyi jẹ awọn iye to pọ julọ) , ṣugbọn awọn eletan fun ijabọ iwọn didun, ni ilọsiwaju nipasẹ ọkan server dagba Elo yiyara. Bi abajade, awọn eto ni idagbasoke lati dọgbadọgba fifuye lori awọn olupin oriṣiriṣi, ṣugbọn gbogbo eyi pọ si idiju ti iṣeto, mimu ati mimu didara awọn iṣẹ ti a pese.

Awọn ohun elo

Ni ode oni, aṣa asiko kan ninu sọfitiwia “awọn baagi iyipada” jẹ lilo DPDK ati XDP. Ọpọlọpọ awọn nkan ni a ti kọ lori koko yii, ọpọlọpọ awọn ọrọ oriṣiriṣi ni a ti ṣe, ati awọn ọja iṣowo ti han (fun apẹẹrẹ, SKAT lati VasExperts). Ṣugbọn fun awọn orisun siseto lopin ti awọn oniṣẹ tẹlifoonu, o jẹ iṣoro pupọ lati ṣẹda “ọja” eyikeyi ti o da lori awọn ilana wọnyi lori tirẹ. Yoo nira pupọ diẹ sii lati ṣiṣẹ iru ojutu kan ni ọjọ iwaju; ni pataki, awọn irinṣẹ iwadii yoo ni lati ni idagbasoke. Fun apẹẹrẹ, boṣewa tcpdump pẹlu DPDK kii yoo ṣiṣẹ bii iyẹn, ati pe kii yoo “ri” awọn apo-iwe ti a firanṣẹ pada si awọn okun waya nipa lilo XDP. Laarin gbogbo ọrọ nipa awọn imọ-ẹrọ tuntun fun gbigbejade soso siwaju si aaye olumulo, wọn ko ṣe akiyesi awọn iroyin и awọn nkan Pablo Neira Ayuso, olutọju iptables, nipa idagbasoke ti ṣiṣan ṣiṣan ni awọn nftables. Jẹ ká ya a jo wo ni yi siseto.

Ero akọkọ ni pe ti olulana ba kọja awọn apo-iwe lati igba kan ni awọn itọnisọna mejeeji ti ṣiṣan (akoko TCP ti lọ sinu ipo EDEBLISHED), lẹhinna ko si iwulo lati kọja awọn apo-iwe atẹle ti igba yii nipasẹ gbogbo awọn ofin ogiriina, nitori gbogbo awọn sọwedowo wọnyi yoo tun pari pẹlu apo-iwe ti a gbe siwaju si ipa-ọna. Ati pe a ko nilo gangan lati yan ipa-ọna kan - a ti mọ tẹlẹ si wiwo wo ati si agbalejo wo ni a nilo lati fi awọn apo-iwe ranṣẹ laarin igba yii. Gbogbo ohun ti o ku ni lati tọju alaye yii ki o lo fun ipa-ọna ni ipele ibẹrẹ ti sisẹ apo. Nigbati o ba n ṣiṣẹ NAT, o jẹ dandan lati tọju alaye ni afikun nipa awọn ayipada ninu awọn adirẹsi ati awọn ebute oko oju omi ti a tumọ nipasẹ module nf_conntrack. Bẹẹni, nitorinaa, ninu ọran yii ọpọlọpọ awọn ọlọpa ati alaye miiran ati awọn ofin iṣiro ni awọn iptables da iṣẹ duro, ṣugbọn laarin ilana ti iṣẹ-ṣiṣe ti NAT ti o duro lọtọ tabi, fun apẹẹrẹ, aala, eyi kii ṣe pataki, nitori awọn iṣẹ naa ti wa ni pin kọja awọn ẹrọ.

Iṣeto ni

Lati lo iṣẹ yii a nilo:

  • Lo ekuro tuntun kan. Bi o ti jẹ pe iṣẹ ṣiṣe funrararẹ han ni ekuro 4.16, fun igba pipẹ o jẹ “aise” pupọ ati nigbagbogbo fa ijaaya ekuro. Ohun gbogbo duro ni ayika Oṣu kejila ọdun 2019, nigbati awọn ekuro LTS 4.19.90 ati 5.4.5 ti tu silẹ.
  • Tun awọn ofin iptables kọ ni ọna kika nftables nipa lilo ẹya aipe ti nftables. Ṣiṣẹ ni pato ni ẹya 0.9.0

Ti ohun gbogbo ni opo ba han pẹlu aaye akọkọ, ohun akọkọ kii ṣe gbagbe lati fi module sinu iṣeto ni akoko apejọ (CONFIG_NFT_FLOW_OFFLOAD = m), lẹhinna aaye keji nilo alaye. Awọn ofin nfttables jẹ apejuwe ni iyatọ patapata ju ninu awọn iptables. Iwe akosilẹ han fere gbogbo ojuami, nibẹ ni o wa tun pataki awọn oluyipada ofin lati iptables to nftables. Nitorinaa, Emi yoo fun apẹẹrẹ nikan ti eto NAT ati pipaṣẹ sisan. Àlàyé kekere kan fun apẹẹrẹ: , - Iwọnyi ni awọn atọkun nẹtiwọọki nipasẹ eyiti ijabọ kọja; ni otitọ o le jẹ diẹ sii ju meji ninu wọn. , - ibẹrẹ ati ipari adirẹsi ti awọn ibiti o ti awọn adirẹsi "funfun".

Iṣeto NAT rọrun pupọ:

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

Pẹlu gbigbe ṣiṣan o jẹ idiju diẹ sii, ṣugbọn o jẹ oye pupọ:

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

Iyẹn, ni otitọ, ni gbogbo iṣeto. Bayi gbogbo TCP/UDP ijabọ yoo subu sinu fastnat tabili ati ki o wa ni ilọsiwaju Elo yiyara.

Результаты

Lati jẹ ki o ye bi “yiyara pupọ” eyi ṣe jẹ, Emi yoo so sikirinifoto ti fifuye lori awọn olupin gidi meji, pẹlu ohun elo kanna (Xeon E5-1650v2), tunto ni aami, ni lilo ekuro Linux kanna, ṣugbọn ṣiṣe NAT ni awọn iptables. (NAT4) ati ni nftables (NAT5).

Yiyara afisona ati NAT ni Linux

Ko si ayaworan ti awọn apo-iwe fun iṣẹju-aaya ninu sikirinifoto, ṣugbọn ninu profaili fifuye ti awọn olupin wọnyi iwọn apo-iwe apapọ ni ayika awọn baiti 800, nitorinaa awọn iye naa de 1.5Mpps. Bii o ti le rii, olupin pẹlu nftables ni ifiṣura iṣẹ ṣiṣe nla kan. Lọwọlọwọ, olupin yii n ṣe ilana to 30Gbit/s ni 3Mpps ati pe o lagbara lati pade opin nẹtiwọki ti ara ti 40Gbps, lakoko ti o ni awọn orisun Sipiyu ọfẹ.

Mo nireti pe ohun elo yii yoo wulo fun awọn onimọ-ẹrọ nẹtiwọọki n gbiyanju lati mu ilọsiwaju iṣẹ ti awọn olupin wọn dara.

orisun: www.habr.com

Fi ọrọìwòye kun