Te ararere tere me te NAT i Linux

I te paunga o nga wahitau IPv4, he maha nga kaiwhakarato waea waea e raru ana ki te whakarato ki o raatau kaihoko te uru ki te whatunga ma te whakamaoritanga wahitau. I roto i tenei tuhinga ka korero atu ahau ki a koe me pehea e taea ai e koe te mahi Carrier Grade NAT i runga i nga kaiwhakarato taonga.

He pene o te hitori

Ko te kaupapa o te ngenge mokowā wāhitau IPv4 ehara i te mea hou. I etahi wa, ka puta nga rarangi tatari i roto i te RIPE, katahi ka puta nga whakawhitinga i runga i nga poraka o nga wahitau i hokohoko, ka whakatauhia nga mahi ki te riihi. Ake, ka timata nga kaiwhakahaere waea ki te whakarato ratonga uru Ipurangi ma te whakamahi i te wahitau me te whakamaoritanga tauranga. Ko etahi kaore i kaha ki te whiwhi i nga waahi noho hei tuku i tetahi wahitau "ma" ki ia kaiohauru, ko etahi i timata ki te penapena moni ma te kore e hoko i nga wahitau i runga i te maakete tuarua. Ko nga kaihanga o nga taputapu whatunga i tautoko i tenei whakaaro, na te mea Ko te tikanga ka hiahiatia e tenei mahinga etahi taapiri taapiri, raihana raihana ranei. Hei tauira, i roto i te raina MX pouara a Juniper (haunga mo te MX104 me te MX204 hou), ka taea e koe te mahi NAPT i runga i tetahi kaari ratonga MS-MIC motuhake, me whiwhi raihana CGN a Cisco ASR1k, me hiahia a Cisco ASR9k he waahanga motuhake A9K-ISM-100. me te raihana A9K-CGN -LIC ki a ia. I te nuinga o te waa, he nui te utu o te ahuareka.

IPTables

Ko te mahi o te mahi NAT kaore e hiahiatia he rauemi rorohiko motuhake; ka taea te whakatau e nga kaitukatuka kaupapa whanui, ka whakauruhia, hei tauira, ki tetahi pouara kaainga. I runga i te tauine o te kaiwhakahaere waea, ka taea te whakatau i tenei raru ma te whakamahi i nga kaitoro taonga e whakahaere ana i te FreeBSD (ipfw/pf) ranei GNU/Linux (iptables). E kore matou e whakaaro ki a FreeBSD, na te mea... I mutu taku whakamahi i tenei OS kua roa nei, no reira ka piri matou ki te GNU/Linux.

Ko te whakahohe i te whakamaoritanga wahitau ehara i te mea uaua. Tuatahi me rehita koe i tetahi ture i roto i nga iptables i te ripanga nat:

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

Ka utaina e te punaha whakahaere te kōwae nf_conntrack, ka aro turuki i nga hononga kaha katoa me te mahi i nga huringa e tika ana. He maha nga korero iti kei konei. Tuatahi, i te mea e korero ana matou mo te NAT i runga i te tauine o te kaiwhakahaere waea, he mea tika ki te whakatika i nga waahi, na te mea me nga uara taunoa ka tere te tipu o te tepu whakamaori ki nga uara kino. Kei raro nei he tauira o nga tautuhinga i whakamahia e au ki runga i aku tūmau:

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

A tuarua, i te mea ko te rahi taunoa o te ripanga whakamaori kaore i hangaia kia mahi i raro i nga tikanga o te kaiwhakahaere waea, me whakanui ake:

net.netfilter.nf_conntrack_max = 3145728

Me whakanui ano te maha o nga peere mo te ripanga hash e penapena ana i nga panui katoa (he whiringa tenei i roto i te waahanga nf_conntrack):

options nf_conntrack hashsize=1572864

Whai muri i enei mahinga ngawari, ka puta he hoahoa tino mahi ka taea te whakamaori i te maha o nga wahitau kiritaki ki roto i te puna o waho. Heoi, ko te mahi o tenei otinga ka nui te hiahia. I aku nganatanga tuatahi ki te whakamahi i te GNU/Linux mo te NAT (circa 2013), i taea e au te mahi mo te 7Gbit/s i te 0.8Mpps ia tūmau (Xeon E5-1650v2). Mai i tera wa, he maha nga arotautanga rereke kua mahia i roto i te puranga whatunga kernel GNU/Linux, kua piki ake te mahinga o tetahi tūmau i runga i taua taputapu ki te tata ki te 18-19 Gbit/s i te 1.8-1.9 Mpps (koinei nga uara teitei) , engari ko te tono mo te rōrahi waka, i tukatukahia e te tūmau kotahi i tere ake te tere. Ko te mutunga mai, i whakawhanakehia nga kaupapa hei whakataurite i te taumahatanga ki runga i nga tuunga rereke, engari na enei mea katoa i piki ake te uaua o te whakatuu, te pupuri me te pupuri i te kounga o nga ratonga e whakaratohia ana.

NTFables

I enei wa, he ahua huatau i roto i nga raupaparorohiko "peeke neke" ko te whakamahi i te DPDK me te XDP. He maha nga tuhinga kua tuhia mo tenei kaupapa, he maha nga korero rereke kua puta, kua puta nga hua hokohoko (hei tauira, SKAT mai i VasExperts). Engari i runga i te iti o nga rauemi hotaka o nga kaiwhakahaere waea, he tino raruraru ki te hanga i tetahi "hua" i runga i enei anga i runga i a koe ake. He uaua ake te whakahaere i taua otinga a muri ake nei; ina koa, me whakawhanake nga taputapu tātaritanga. Hei tauira, ko te tcpdump paerewa me te DPDK e kore e mahi pera, kaore hoki e "kite" nga paatete ka whakahokia ki nga waea ma te whakamahi i te XDP. I roto i nga korero katoa mo nga hangarau hou mo te whakaputa i te paatete whakamua ki te waahi-kaiwhakamahi, kaore i kitea. pūrongo и Tuhinga Pablo Neira Ayuso, kaitiaki iptables, mo te whakawhanaketanga o te rerenga rere i roto i nga nftables. Kia ata tirohia tenei tikanga.

Ko te whakaaro nui mena ka tukuna e te pouara nga paakete mai i tetahi huihuinga i nga taha e rua o te rerenga (kua uru te huihuinga TCP ki te ahua WHAKATAHI), karekau he take ki te tuku i nga paatete o muri mai o tenei waahi ma nga ture paahi katoa, na te mea Ka mutu tonu enei arowhai me te whakawhiti atu te paatete ki te ararere. A kaore matou e hiahia ki te kowhiri i tetahi huarahi - kua mohio matou ko tehea atanga me te kaihautu me tukuna e matou nga putea i roto i tenei huihuinga. Ko nga mea e toe ana ko te penapena i enei korero me te whakamahi mo te ararere i te timatanga o te tukatuka paatete. I te wa e mahi ana i te NAT, he mea tika ki te penapena korero mo nga huringa o nga wahitau me nga tauranga i whakamaoritia e te kōwae nf_conntrack. Ae, o te akoranga, i roto i tenei keehi he maha nga pirihimana me etahi atu korero me nga ture tatauranga i roto i nga iptables ka mutu te mahi, engari i roto i te anga o te mahi a te NAT tu motuhake, hei tauira, he rohe, ehara tenei i te mea nui, na te mea ko nga ratonga. ka tohatohahia puta noa i nga taputapu.

Hōutuutu

Hei whakamahi i tenei mahi ka hiahia matou:

  • Whakamahia he kakano hou. Ahakoa te mea i puta ake te mahi i roto i te kernel 4.16, mo te wa roa he tino "mata" me te whakaoho i nga wa katoa. I pumau nga mea katoa i te marama o Hakihea 2019, i te wa i tukuna ai nga kakano LTS 4.19.90 me 5.4.5.
  • Tuhia ano nga ture iptables i roto i te whakatakotoranga nftables ma te whakamahi i tetahi putanga hou o nftables. Mahi tika i roto i te putanga 0.9.0

Mena he maamaa nga mea katoa me te tohu tuatahi, ko te mea nui kia kaua e wareware ki te whakauru i te waahanga i roto i te whirihoranga i te wa o te huihuinga (CONFIG_NFT_FLOW_OFFLOAD=m), katahi ka hiahia te tohu tuarua ki te whakamarama. Ko nga ture nftables he rereke nga korero i nga iptables. Tuhinga ka whakaatu tata katoa nga tohu, he mea motuhake ano kaihurihuri ture mai iptables ki nftables. No reira, ka hoatu noa e au he tauira mo te whakatu NAT me te rere whakaheke. He pakiwaitara iti hei tauira: , - koinei nga hononga whatunga e haere ai nga waka; i te mea pono ka neke atu i te rua. , — te waahi timatanga me te mutunga o te awhe o nga wahitau "ma".

He tino ngawari te whirihoranga 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
        }
}

Ki te whakahekenga rere he uaua ake, engari he tino marama:

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

Ko te tikanga, ko te tatūnga katoa. Inaianei ka taka katoa nga hokohoko TCP/UDP ki te ripanga fastnat ka tere ake te tukatuka.

Результаты

Kia marama ai he "tere tere" tenei, ka taapirihia e ahau he whakaahua o te utaina ki runga i nga kaitoro tuuturu e rua, me te taputapu kotahi (Xeon E5-1650v2), he rite tonu te whirihora, ma te whakamahi i te kernel Linux kotahi, engari kei te mahi NAT i roto i nga iptables. (NAT4) me nga nftables (NAT5).

Te ararere tere me te NAT i Linux

Karekau he kauwhata o nga paatete mo ia hekona i roto i te whakaahua, engari kei roto i te kotaha uta o enei tuunga ko te rahi o te paanui kei te 800 paita, no reira ka eke nga uara ki te 1.5Mpps. Ka kite koe, he rahui mahi nui te tūmau me nga nftables. I tenei wa, ka tukatuka tenei tūmau ki te 30Gbit/s i te 3Mpps me te tino kaha ki te whakatutuki i te herenga whatunga tinana o te 40Gbps, i te mea he rauemi PTM kore utu.

Te ti'aturi nei au ka whai hua tenei rauemi ki nga miihini whatunga e ngana ana ki te whakapai ake i nga mahi a o raatau kaitoro.

Source: will.com

Tāpiri i te kōrero