Nuntun cepet lan NAT ing Linux

Nalika alamat IPv4 wis entek, akeh operator telekomunikasi ngadhepi kabutuhan kanggo nyedhiyakake akses jaringan marang klien kanthi nggunakake terjemahan alamat. Ing artikel iki aku bakal pitutur marang kowe carane sampeyan bisa entuk kinerja Carrier Grade NAT ing server komoditas.

Sawetara sejarah

Topik kekeselen ruang alamat IPv4 ora anyar maneh. Ing sawetara titik, dhaptar tunggu katon ing RIPE, banjur ijol-ijolan muncul ing ngendi blok alamat didagang lan kesepakatan dirampungake kanggo nyewakake. Secara bertahap, operator telekomunikasi wiwit nyedhiyakake layanan akses Internet nggunakake terjemahan alamat lan port. Sawetara ora bisa entuk alamat sing cukup kanggo ngetokake alamat "putih" kanggo saben pelanggan, dene liyane wiwit ngirit dhuwit kanthi nolak tuku alamat ing pasar sekunder. Produsen peralatan jaringan ndhukung idea iki, amarga fungsi iki biasane mbutuhake modul extension tambahan utawa lisensi. Contone, ing baris Juniper MX router (kajaba MX104 paling anyar lan MX204), sampeyan bisa nindakake NAPT ing kertu layanan MS-MIC kapisah, Cisco ASR1k mbutuhake lisensi CGN, Cisco ASR9k mbutuhake modul A9K-ISM-100 kapisah. lan lisensi A9K-CGN -LIC marang. Umumé, kesenengan biaya akèh dhuwit.

IPTables

Tugas nindakake NAT ora mbutuhake sumber daya komputasi khusus, bisa ditanggulangi dening pemroses tujuan umum, sing diinstal, contone, ing sembarang router ngarep. Ing skala operator telekomunikasi, masalah iki bisa ditanggulangi kanthi nggunakake server komoditas sing nganggo FreeBSD (ipfw/pf) utawa GNU/Linux (iptables). Kita ora bakal nganggep FreeBSD, amarga ... Aku mandheg nggunakake OS iki cukup suwe, mula kita bakal tetep nganggo GNU/Linux.

Ngaktifake terjemahan alamat ora angel. Pisanan sampeyan kudu ndhaptar aturan ing iptables ing tabel nat:

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

Sistem operasi bakal mbukak modul nf_conntrack, sing bakal ngawasi kabeh sambungan aktif lan nindakake konversi sing dibutuhake. Ana sawetara subtleties ing kene. Kaping pisanan, amarga kita ngomong babagan NAT ing skala operator telekomunikasi, sampeyan kudu nyetel wektu entek, amarga kanthi nilai standar ukuran tabel terjemahan bakal cepet tuwuh dadi nilai bencana. Ing ngisor iki conto setelan sing digunakake ing serverku:

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

Lan kaping pindho, amarga ukuran standar tabel terjemahan ora dirancang kanggo bisa digunakake ing kahanan operator telekomunikasi, mula kudu ditambah:

net.netfilter.nf_conntrack_max = 3145728

Sampeyan uga perlu nambah jumlah ember kanggo tabel hash sing nyimpen kabeh siaran (iki minangka pilihan ing modul nf_conntrack):

options nf_conntrack hashsize=1572864

Sawise manipulasi sing prasaja iki, desain sing bisa digunakake kanthi lengkap sing bisa nerjemahake pirang-pirang alamat klien menyang klompok eksternal. Nanging, kinerja solusi iki ninggalake akeh sing dikarepake. Ing nyoba pisanan nggunakake GNU / Linux kanggo NAT (circa 2013), aku bisa entuk kinerja watara 7Gbit / s ing 0.8Mpps saben server (Xeon E5-1650v2). Wiwit wektu iku, akeh optimasi beda wis digawe ing tumpukan jaringan kernel GNU/Linux, kinerja siji server ing hardware padha wis tambah kanggo meh 18-19 Gbit / s ing 1.8-1.9 Mpps (iki minangka nilai maksimum) , nanging dikarepake kanggo volume lalu lintas, diproses dening siji server tansaya akeh luwih cepet. Akibaté, skema dikembangake kanggo ngimbangi beban ing server sing beda-beda, nanging kabeh iki nambah kerumitan nyetel, njaga lan njaga kualitas layanan sing diwenehake.

NTFables

Saiki, tren modis ing piranti lunak "tas shift" yaiku nggunakake DPDK lan XDP. Akeh artikel sing ditulis babagan topik iki, akeh pidato sing beda-beda, lan produk komersial katon (contone, SKAT saka VasExperts). Nanging amarga sumber daya pemrograman winates saka operator telekomunikasi, cukup masalah kanggo nggawe "produk" adhedhasar kerangka kasebut dhewe. Bakal luwih angel kanggo ngoperasikake solusi kasebut ing mangsa ngarep, utamane, alat diagnostik kudu dikembangake. Contone, tcpdump standar karo DPDK ora bakal bisa kaya ngono, lan ora bakal "ndeleng" paket sing dikirim maneh menyang kabel nggunakake XDP. Ing tengah-tengah kabeh omongan babagan teknologi anyar kanggo ngasilake paket sing diterusake menyang ruang pangguna, dheweke ora ngerti. laporan и artikel Pablo Neira Ayuso, iptables maintainer, babagan pangembangan aliran offloading ing nftables. Ayo goleki mekanisme iki kanthi luwih rinci.

Ide utama yaiku yen router ngliwati paket saka siji sesi ing loro arah aliran (sesi TCP menyang negara ESTABLISHED), mula ora perlu ngliwati paket sabanjure sesi iki liwat kabeh aturan firewall, amarga kabeh mriksa iki isih bakal mungkasi karo paket ditransfer luwih kanggo nuntun. Lan kita ora kudu milih rute - kita wis ngerti antarmuka lan host sing kudu ngirim paket ing sesi iki. Kabeh sing isih ana yaiku nyimpen informasi iki lan digunakake kanggo nuntun ing tahap awal pangolahan paket. Nalika nindakake NAT, iku perlu kanggo tambahan nyimpen informasi bab owah-owahan ing alamat lan bandar dijarwakake dening modul nf_conntrack. Ya, mesthi, ing kasus iki macem-macem polisi lan informasi liyane lan aturan statistik ing iptables mandheg digunakake, nanging ing framework saka tugas NAT ngadeg kapisah utawa, contone, tapel wates, iki ora dadi penting, amarga layanan disebarake ing kabeh piranti.

Konfigurasi

Kanggo nggunakake fungsi iki kita kudu:

  • Gunakake kernel seger. Senadyan kasunyatan manawa fungsi kasebut muncul ing kernel 4.16, cukup suwe banget "mentah" lan asring nyebabake panik kernel. Kabeh stabil ing sekitar Desember 2019, nalika kernel LTS 4.19.90 lan 5.4.5 dirilis.
  • Tulis maneh aturan iptables ing format nftables nggunakake versi nftables sing cukup anyar. Dianggo persis ing versi 0.9.0

Yen kabeh ing asas cetha karo titik pisanan, sing utama ora lali kanggo nyakup modul ing konfigurasi sak Déwan (CONFIG_NFT_FLOW_OFFLOAD = m), banjur titik kapindho mbutuhake panjelasan. Aturan nftables diterangake kanthi beda tinimbang ing iptables. Dokumentasi mbukak meh kabeh TCTerms, ana uga khusus konverter aturan saka iptables kanggo nftables. Mulane, aku mung bakal menehi conto nyetel NAT lan aliran offload. Legenda cilik contone: , - iki minangka antarmuka jaringan sing dilewati lalu lintas; nyatane bisa uga ana luwih saka loro. , — alamat wiwitan lan pungkasan saka sawetara alamat "putih".

Konfigurasi NAT prasaja banget:

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

Kanthi offload aliran rada rumit, nanging cukup dingerteni:

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

Sing, nyatane, kabeh persiyapan. Saiki kabeh lalu lintas TCP/UDP bakal tiba ing tabel fastnat lan diproses luwih cepet.

Результаты

Kanggo nggawe cetha carane "luwih cepet" iki, aku bakal masang gambar saka mbukak ing loro server nyata, karo hardware padha (Xeon E5-1650v2), identik diatur, nggunakake kernel Linux padha, nanging nindakake NAT ing iptables. (NAT4) lan ing nftables (NAT5).

Nuntun cepet lan NAT ing Linux

Ora ana grafik paket per detik ing gambar kasebut, nanging ing profil beban server kasebut, ukuran paket rata-rata udakara 800 bita, saengga nilai kasebut tekan 1.5Mpps. Nalika sampeyan bisa ndeleng, server karo nftables duwe cadangan kinerja ageng. Saiki, server iki ngolah nganti 30Gbit / s ing 3Mpps lan jelas bisa ngrampungake watesan jaringan fisik 40Gbps, nalika duwe sumber daya CPU gratis.

Muga-muga materi iki migunani kanggo para insinyur jaringan sing nyoba nambah kinerja server.

Source: www.habr.com

Add a comment