ፈጣን ማዘዋወር እና NAT በሊኑክስ ውስጥ

የአይፒቪ 4 አድራሻዎች እየሟጠጡ ሲሄዱ፣ ብዙ የቴሌኮም ኦፕሬተሮች የአድራሻ ትርጉምን በመጠቀም ደንበኞቻቸውን የኔትወርክ መዳረሻ የመስጠት ፍላጎት አጋጥሟቸዋል። በዚህ ጽሑፍ ውስጥ በሸቀጦች አገልጋዮች ላይ የ Carrier Grade NAT አፈፃፀም እንዴት ማግኘት እንደሚችሉ እነግርዎታለሁ።

ትንሽ ታሪክ

የIPv4 አድራሻ ቦታ መሟጠጥ ርዕስ ከአሁን በኋላ አዲስ አይደለም። በአንድ ወቅት፣ የጥበቃ ዝርዝሮች በ RIPE ውስጥ ታዩ፣ ከዚያም የትኛዎቹ አድራሻዎች የተገበያዩባቸው እና እነሱን ለማከራየት ስምምነቶች ተደርገዋል። ቀስ በቀስ የቴሌኮም ኦፕሬተሮች በአድራሻ እና በወደብ ትርጉም በመጠቀም የኢንተርኔት አገልግሎት መስጠት ጀመሩ። አንዳንዶች ለእያንዳንዱ ተመዝጋቢ "ነጭ" አድራሻ ለመስጠት በቂ አድራሻ ማግኘት አልቻሉም, ሌሎች ደግሞ በሁለተኛው ገበያ አድራሻዎችን ለመግዛት ፈቃደኛ ባለመሆናቸው ገንዘብ መቆጠብ ጀመሩ. የኔትወርክ እቃዎች አምራቾች ይህንን ሃሳብ ደግፈዋል, ምክንያቱም ይህ ተግባር ብዙውን ጊዜ ተጨማሪ የኤክስቴንሽን ሞጁሎችን ወይም ፈቃዶችን ይፈልጋል። ለምሳሌ በ Juniper's MX ራውተሮች (ከቅርብ ጊዜ MX104 እና MX204 በስተቀር) በተለየ የ MS-MIC አገልግሎት ካርድ ላይ NAPT ን ማከናወን ይችላሉ፣ Cisco ASR1k የሲጂኤን ፍቃድ ይፈልጋል፣ Cisco ASR9k የተለየ A9K-ISM-100 ሞጁል ይፈልጋል። እና የ A9K-CGN ፍቃድ -LIC ለእሱ. በአጠቃላይ, ደስታው ብዙ ገንዘብ ያስወጣል.

IPTables

NAT ን የማከናወን ተግባር ልዩ የኮምፒዩተር ሀብቶችን አይፈልግም ፣ በአጠቃላይ ዓላማ ባለው ፕሮሰሰር ሊፈታ ይችላል ፣ ለምሳሌ በማንኛውም የቤት ራውተር ውስጥ ተጭነዋል። በቴሌኮም ኦፕሬተር ሚዛን፣ ይህ ችግር FreeBSD (ipfw/pf) ወይም GNU/Linux (iptables) የሚያሄዱ የሸቀጦች አገልጋዮችን በመጠቀም ሊፈታ ይችላል። FreeBSDን አንመለከትም ፣ ምክንያቱም… ይህን ስርዓተ ክወና መጠቀም ያቆምኩት ከረጅም ጊዜ በፊት ነው፣ ስለዚህ ከጂኤንዩ/ሊኑክስ ጋር እንጣበቃለን።

የአድራሻ ትርጉምን ማንቃት በጭራሽ አስቸጋሪ አይደለም። በመጀመሪያ በ nat ሠንጠረዥ ውስጥ በ iptables ውስጥ ህግን መመዝገብ ያስፈልግዎታል-

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

የስርዓተ ክወናው የ nf_conntrack ሞጁሉን ይጭናል, ይህም ሁሉንም ንቁ ግንኙነቶችን ይቆጣጠራል እና አስፈላጊ ለውጦችን ያደርጋል. እዚህ ብዙ ረቂቅ ነገሮች አሉ። በመጀመሪያ ስለ ኤንኤቲ በቴሌኮም ኦፕሬተር ሚዛን ላይ እየተነጋገርን ስለሆነ የጊዜ ማብቂያዎችን ማስተካከል አስፈላጊ ነው, ምክንያቱም በነባሪ ዋጋዎች የትርጉም ሠንጠረዥ መጠን በፍጥነት ወደ አስከፊ እሴቶች ያድጋል. በአገልጋዮቼ ላይ የተጠቀምኳቸው የቅንጅቶች ምሳሌ ከዚህ በታች አለ።

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

እንዲሁም ሁሉንም ስርጭቶች ለማከማቸት ለሃሽ ጠረጴዛ የባልዲዎች ብዛት መጨመር አስፈላጊ ነው (ይህ በ nf_conntrack ሞጁል ውስጥ ያለ አማራጭ ነው)

options nf_conntrack hashsize=1572864

ከእነዚህ ቀላል ማጭበርበሮች በኋላ ብዙ ቁጥር ያላቸውን የደንበኛ አድራሻዎችን ወደ የውጪ ሰዎች ገንዳ መተርጎም የሚችል ሙሉ በሙሉ የሚሰራ ንድፍ ተገኝቷል። ይሁን እንጂ የዚህ መፍትሔ አፈፃፀም ብዙ የሚፈለጉትን ይተዋል. GNU/Linux for NATን ለመጠቀም ባደረኩት የመጀመሪያ ሙከራዎች (እ.ኤ.አ. በ2013 አካባቢ) ወደ 7Gbit/s አካባቢ በአንድ አገልጋይ 0.8Mpps (Xeon E5-1650v2) አፈጻጸም ማግኘት ችያለሁ። ከዚያን ጊዜ ጀምሮ በጂኤንዩ/ሊኑክስ የከርነል አውታረ መረብ ቁልል ውስጥ ብዙ የተለያዩ ማሻሻያዎች ተደርገዋል፣የአንድ አገልጋይ አፈጻጸም በተመሳሳይ ሃርድዌር ወደ 18-19 Gbit/s በ1.8-1.9 Mpps (እነዚህ ከፍተኛዎቹ እሴቶች ነበሩ) ነገር ግን በአንድ አገልጋይ የሚስተናገደው የትራፊክ መጠን ፍላጎት በጣም በፍጥነት አደገ። በውጤቱም, በተለያዩ አገልጋዮች ላይ ያለውን ሸክም ለማመጣጠን እቅዶች ተዘጋጅተዋል, ነገር ግን ይህ ሁሉ የሚሰጠውን አገልግሎት የማዘጋጀት, የመጠበቅ እና የመጠበቅን ውስብስብነት ጨምሯል.

ሠንጠረTች

በአሁኑ ጊዜ በሶፍትዌር "የሽግግር ቦርሳዎች" ውስጥ ያለው ፋሽን አዝማሚያ የዲፒዲኬ እና ኤክስዲፒ አጠቃቀም ነው. በዚህ ርዕስ ላይ ብዙ ጽሑፎች ተጽፈዋል, ብዙ የተለያዩ ንግግሮች ተደርገዋል, እና የንግድ ምርቶች እየታዩ ነው (ለምሳሌ, SKAT ከ VasExperts). ነገር ግን የቴሌኮም ኦፕሬተሮች ካለው ውስን የፕሮግራም አወጣጥ ግብአቶች አንፃር በእራስዎ በእነዚህ ማዕቀፎች ላይ በመመስረት ማንኛውንም “ምርት” መፍጠር በጣም ችግር አለበት። ለወደፊቱ እንዲህ ዓይነቱን መፍትሔ ለመሥራት በጣም አስቸጋሪ ይሆናል, በተለይም የመመርመሪያ መሳሪያዎች መዘጋጀት አለባቸው. ለምሳሌ, መደበኛ tcpdump ከ DPDK ጋር ልክ እንደዛ አይሰራም እና XDP ን በመጠቀም ወደ ሽቦዎች የተላኩ እሽጎች "አይታይም". ፓኬትን ወደ ተጠቃሚ ቦታ ለማስተላለፍ ስለ አዳዲስ ቴክኖሎጂዎች በሚወራው ሁሉ ውስጥ፣ ሳይስተዋል ቀሩ ሪፖርቶች и መጣጥፎች ፓብሎ ኔይራ አዩሶ፣ iptables ተንከባካቢ፣ በንፍታሌሎች ውስጥ ስለ ፍሰት ጭነት እድገት። ይህንን ዘዴ በበለጠ ዝርዝር እንመልከት.

ዋናው ሀሳብ ራውተሩ በሁለቱም የፍሰቱ አቅጣጫዎች ውስጥ ከአንድ ክፍለ ጊዜ ፓኬቶችን ካለፈ (TCP ክፍለ ጊዜ ወደ ተቋሙ ሁኔታ ገባ) ፣ ከዚያ በሁሉም የፋየርዎል ህጎች ውስጥ የዚህን ክፍለ ጊዜ ተከታይ እሽጎች ማለፍ አያስፈልግም። እነዚህ ሁሉ ቼኮች ፓኬጁን ወደ ማዞሪያው የበለጠ በመተላለፉ አሁንም ያበቃል። እና በትክክል መንገድ መምረጥ አያስፈልገንም - በዚህ ክፍለ ጊዜ ፓኬቶችን ወደ የትኛው በይነገጽ እና ለየትኛው አስተናጋጅ መላክ እንዳለብን አስቀድመን አውቀናል. የቀረው ይህንን መረጃ ማከማቸት እና በፓኬት ሂደት መጀመሪያ ደረጃ ላይ ለማዘዋወር መጠቀም ብቻ ነው። NAT ን በሚያከናውንበት ጊዜ በአድራሻዎች እና በወደቦች ላይ በ nf_conntrack ሞጁል የተተረጎሙ ለውጦች መረጃን ማከማቸት አስፈላጊ ነው። አዎን, በእርግጥ, በዚህ ጉዳይ ላይ የተለያዩ ፖሊሶች እና ሌሎች መረጃዎች እና የስታቲስቲክስ ደንቦች በ iptables ውስጥ ሥራቸውን ያቆማሉ, ነገር ግን በተለየ ቋሚ NAT ተግባር ማዕቀፍ ውስጥ ወይም ለምሳሌ ድንበር, ይህ በጣም አስፈላጊ አይደለም, ምክንያቱም አገልግሎቶቹ ናቸው. በመሳሪያዎች ላይ ይሰራጫሉ.

ውቅር

ይህንን ተግባር ለመጠቀም እኛ ያስፈልገናል-

  • ትኩስ አስኳል ይጠቀሙ. ምንም እንኳን ተግባሩ እራሱ በከርነል 4.16 ውስጥ ቢታይም ፣ ለረጅም ጊዜ በጣም “ጥሬ” እና በመደበኛነት የከርነል ፍርሃትን አስከትሏል። LTS kernels 2019 እና 4.19.90 ሲለቀቁ ሁሉም ነገር ዲሴምበር 5.4.5 አካባቢ ተረጋጋ።
  • በቅርብ ጊዜ የ nftables ስሪት በመጠቀም የiptables ደንቦችን በ 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 ትራፊክ ወደ ፋስትናት ሠንጠረዥ ውስጥ ይወድቃል እና በጣም በፍጥነት ይከናወናል።

ውጤቶች

ይህ ምን ያህል “ፈጣን” እንደሆነ ግልጽ ለማድረግ የጭነቱን ቅጽበታዊ ገጽ እይታ በሁለት እውነተኛ አገልጋዮች ላይ አያይዤ እሰጣለሁ፣ ከተመሳሳይ ሃርድዌር (Xeon E5-1650v2) ጋር፣ በተመሳሳይ መልኩ የተዋቀረ፣ ተመሳሳዩን ሊኑክስ ከርነል በመጠቀም፣ ነገር ግን NAT በ iptables ውስጥ እየሰራ ነው። (NAT4) እና በ nftables (NAT5)።

ፈጣን ማዘዋወር እና NAT በሊኑክስ ውስጥ

በቅጽበታዊ ገጽ እይታው ላይ የፓኬቶች ግራፍ በሰከንድ የለም፣ ነገር ግን በእነዚህ አገልጋዮች ጭነት መገለጫ ውስጥ አማካይ የፓኬት መጠን 800 ባይት አካባቢ ነው፣ ስለዚህ እሴቶቹ እስከ 1.5Mpps ይደርሳሉ። እንደሚመለከቱት ፣ nftables ያለው አገልጋይ ትልቅ የአፈፃፀም ክምችት አለው። በአሁኑ ጊዜ፣ ይህ አገልጋይ በ30Mpps እስከ 3Gbit/s ድረስ ይሰራል እና የ40Gbps አካላዊ አውታረ መረብ ውሱንነት ነፃ የሲፒዩ ሃብቶች እያለው በግልፅ ሊያሟላ ይችላል።

ይህ ጽሑፍ የአገልጋዮቻቸውን አፈጻጸም ለማሻሻል ለሚሞክሩ የአውታረ መረብ መሐንዲሶች ጠቃሚ እንደሚሆን ተስፋ አደርጋለሁ።

ምንጭ: hab.com

አስተያየት ያክሉ