Rute gancang sareng NAT dina Linux

Salaku alamat IPv4 jadi depleted, loba operator telekomunikasi anu Nyanghareupan kabutuhan nyadiakeun klien maranéhanana aksés jaringan maké tarjamah alamat. Dina tulisan ieu kuring bakal nyarioskeun ka anjeun kumaha anjeun tiasa kéngingkeun kinerja Carrier Grade NAT dina server komoditi.

A sajarah saeutik

Topik ngeunaan kacapean spasi alamat IPv4 geus euweuh anyar. Dina sababaraha waktos, daptar ngantosan muncul dina RIPE, teras bursa muncul dimana blok-blok alamat didagangkeun sareng deal disimpulkeun pikeun nyéwakeunana. Saeutik demi saeutik, operator telekomunikasi mimiti nyayogikeun jasa aksés Internét nganggo alamat sareng terjemahan port. Sababaraha teu ngatur pikeun ménta alamat cukup pikeun ngaluarkeun alamat "bodas" ka unggal palanggan, sedengkeun nu sejenna mimiti nyimpen duit ku nolak mésér alamat di pasar sekundér. Produsén pakakas jaringan dirojong gagasan ieu, sabab fungsionalitas ieu biasana merlukeun modul extension tambahan atawa lisensi. Contona, dina garis Juniper ngeunaan MX routers (iwal MX104 panganyarna na MX204), anjeun tiasa ngalakukeun NAPT dina kartu jasa MS-MIC misah, Cisco ASR1k merlukeun lisénsi CGN, Cisco ASR9k merlukeun A9K-ISM-100 modul misah. sarta lisénsi A9K-CGN -LIC ka anjeunna. Sacara umum, pelesir ngarugikeun loba duit.

IPTabel

Tugas ngalaksanakeun NAT henteu meryogikeun sumber komputasi khusus, éta tiasa direngsekeun ku prosesor tujuan umum, anu dipasang, contona, dina router bumi mana waé. Dina skala operator telekomunikasi, masalah ieu tiasa direngsekeun nganggo server komoditi anu ngajalankeun FreeBSD (ipfw/pf) atanapi GNU/Linux (iptables). Kami moal nganggap FreeBSD, sabab ... Abdi parantos lami lirén nganggo OS ieu, janten urang bakal lengket kana GNU/Linux.

Aktipkeun tarjamahan alamat henteu sesah. Mimiti anjeun kedah ngadaptarkeun aturan dina iptables dina 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 ngamuat modul nf_conntrack, anu bakal ngawas sadaya sambungan aktip sareng ngalaksanakeun konvérsi anu diperyogikeun. Aya sababaraha subtleties di dieu. Anu mimiti, saprak urang ngobrol ngeunaan NAT dina skala operator telekomunikasi, perlu nyaluyukeun waktosna, sabab kalayan nilai standar ukuran tabel tarjamahan bakal gancang ningkat kana nilai bencana. Di handap ieu conto setélan anu kuring dianggo dina server kuring:

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

Sareng kadua, sabab ukuran standar tabel tarjamahan henteu dirancang pikeun dianggo dina kaayaan operator telekomunikasi, éta kedah ningkat:

net.netfilter.nf_conntrack_max = 3145728

Perlu ogé nambahan jumlah ember pikeun tabel hash anu nyimpen sadaya siaran (ieu mangrupikeun pilihan dina modul nf_conntrack):

options nf_conntrack hashsize=1572864

Saatos manipulasi saderhana ieu, desain anu lengkep tiasa dianggo anu tiasa narjamahkeun sajumlah ageung alamat klien kana kolam renang éksternal. Sanajan kitu, kinerja solusi ieu ninggalkeun loba kahayang. Dina usaha munggaran kuring ngagunakeun GNU / Linux pikeun NAT (circa 2013), kuring tiasa kéngingkeun kinerja sakitar 7Gbit / s dina 0.8Mpps per server (Xeon E5-1650v2). Ti saprak éta, seueur optimasi anu béda-béda dilakukeun dina tumpukan jaringan kernel GNU/Linux, kinerja hiji server dina hardware anu sami parantos ningkat ka ampir 18-19 Gbit / s dina 1.8-1.9 Mpps (ieu mangrupikeun nilai maksimal) , tapi paménta pikeun volume lalulintas, diolah ku hiji server tumuwuh leuwih gancang. Hasilna, skéma dikembangkeun pikeun nyaimbangkeun beban dina server anu béda, tapi sadayana ieu ningkatkeun pajeulitna nyetél, ngajaga sareng ngajaga kualitas jasa anu disayogikeun.

NTFables

Kiwari, trend fashionable dina software "shifting bags" nyaeta pamakéan DPDK na XDP. Seueur tulisan anu ditulis dina topik ieu, seueur pidato anu béda-béda parantos dilakukeun, sareng produk komérsial muncul (Contona, SKAT ti VasExperts). Tapi tinangtu sumberdaya programming kawates operator telekomunikasi, éta rada masalah pikeun nyieun sagala "produk" dumasar kana frameworks ieu sorangan. Bakal langkung hese pikeun ngajalankeun solusi sapertos kitu di hareup, khususna, alat diagnostik kedah dikembangkeun. Salaku conto, tcpdump standar sareng DPDK moal jalan sapertos kitu, sareng éta moal "tingali" pakét anu dikirim deui ka kabel nganggo XDP. Ditengah sadaya omongan ngeunaan téknologi anyar pikeun ngaluarkeun pakét anu diteruskeun ka rohangan-pamaké, aranjeunna henteu kapendak. laporan и tulisan Pablo Neira Ayuso, iptables maintainer, ngeunaan ngembangkeun offloading aliran di nftables. Hayu urang nempo leuwih jéntré mékanisme ieu.

Gagasan utama nyaéta upami router ngalangkungan pakét tina hiji sési dina dua arah aliran (sési TCP asup kana kaayaan ESTABLISHED), maka henteu kedah ngalangkungan pakét sési ieu dina sadaya aturan firewall, sabab kabéh cék ieu masih bakal ditungtungan ku pakét nu keur ditransfer salajengna ka routing nu. Sareng urang saleresna henteu kedah milih rute - urang parantos terang kana antarmuka mana sareng host mana anu urang kedah ngirim pakét dina sési ieu. Sadaya anu tetep nyaéta pikeun nyimpen inpormasi ieu sareng dianggo pikeun routing dina tahap awal ngolah pakét. Nalika ngalakukeun NAT, perlu pikeun nyimpen informasi tambahan ngeunaan parobahan alamat na palabuhan ditarjamahkeun ku modul nf_conntrack. Leres, tangtosna, dina hal ieu rupa-rupa pulisi sareng inpormasi sanés sareng aturan statistik dina iptables lirén damel, tapi dina kerangka tugas NAT nangtung anu misah atanapi, contona, wates, ieu henteu penting pisan, sabab jasa disebarkeun ka sadaya alat.

Konfigurasi

Pikeun ngagunakeun fungsi ieu urang peryogi:

  • Paké kernel seger. Sanaos kanyataan yén pungsionalitasna muncul dina kernel 4.16, pikeun waktos anu lami éta "atah" sareng sering nyababkeun panik kernel. Sadayana stabil sakitar Désémber 2019, nalika kernel LTS 4.19.90 sareng 5.4.5 dileupaskeun.
  • Tulis deui aturan iptables dina format nftables nganggo versi nftables anu cukup anyar. Gawéna persis dina versi 0.9.0

Lamun sagalana prinsipna jelas jeung titik kahiji, hal utama - ulah poho pikeun ngawengku modul dina konfigurasi salila assembly (CONFIG_NFT_FLOW_OFFLOAD = m), lajeng titik kadua merlukeun katerangan. aturan nftables digambarkeun sagemblengna béda ti di iptables. Dokuméntasi nembongkeun ampir kabéh titik, aya ogé husus converters aturan ti iptables ka nftables. Ku alatan éta, kuring ngan ukur bakal masihan conto nyetél NAT sareng aliran offload. Hiji legenda leutik contona: , - ieu mangrupikeun antarmuka jaringan anu ngalangkungan lalu lintas; dina kanyataanana tiasa langkung ti dua di antarana. , — alamat awal sareng tungtung kisaran alamat "bodas".

Konfigurasi NAT saderhana pisan:

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

Kalayan offload aliran éta sakedik langkung rumit, tapi cukup kaharti:

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

Éta, kanyataanna, nyaéta sakabéh setelan. Ayeuna sadaya lalu lintas TCP/UDP bakal digolongkeun kana tabel fastnat sareng diolah langkung gancang.

Hasil

Pikeun ngajelaskeun kumaha "langkung gancang" ieu, kuring bakal ngalampirkeun screenshot tina beban dina dua server nyata, sareng hardware anu sami (Xeon E5-1650v2), dikonpigurasi idéntik, nganggo kernel Linux anu sami, tapi ngalaksanakeun NAT di iptables. (NAT4) sareng dina nftables (NAT5).

Rute gancang sareng NAT dina Linux

Henteu aya grafik pakét per detik dina layar, tapi dina profil beban server ieu ukuran pakét rata-rata sakitar 800 bait, janten nilaina dugi ka 1.5Mpps. Sakumaha anjeun tiasa tingali, server sareng nftables gaduh cadangan kinerja anu ageung. Ayeuna, server ieu ngolah nepi ka 30Gbit/s dina 3Mpps jeung jelas sanggup minuhan watesan jaringan fisik 40Gbps, bari ngabogaan sumberdaya CPU bébas.

Kuring miharep bahan ieu bakal mangpaat pikeun insinyur jaringan nyobian pikeun ngaronjatkeun kinerja server maranéhanana.

sumber: www.habr.com

Tambahkeun komentar