Generasi lalu lintas ruang pengguna


Traffic Generation Menggunakan MoonGen + DPDK + Lua dalam Tampilan Artis

Netralisasi serangan DDoS dalam kondisi nyata memerlukan pengujian awal dan pengujian berbagai teknik. Peralatan dan perangkat lunak jaringan harus diuji dalam kondisi buatan yang mendekati kondisi sebenarnya - dengan arus lalu lintas yang mensimulasikan serangan. Tanpa eksperimen semacam itu, sangat sulit untuk mendapatkan informasi yang dapat dipercaya tentang fitur-fitur spesifik dan batasan-batasan dari setiap alat kompleks.

Pada artikel ini, kami akan mengungkapkan beberapa metode penghasil lalu lintas yang digunakan di Qrator Labs.

PERINGATAN

Kami sangat menyarankan agar pembaca tidak mencoba menggunakan alat yang disebutkan untuk menyerang objek infrastruktur nyata. Organisasi serangan DoS dapat dihukum oleh hukum dan dapat menyebabkan hukuman berat. Qrator Labs melakukan semua tes di lingkungan laboratorium yang terisolasi.

Tingkat teknis modern


Tugas penting di area kami adalah menjenuhkan antarmuka Ethernet 10G dengan paket kecil, yang menyiratkan pemrosesan 14,88 Mpps (jutaan paket per detik). Selanjutnya, kami mempertimbangkan paket jaringan Ethernet terkecil - 64 byte - karena kepentingan utama kami adalah memaksimalkan jumlah paket yang dikirimkan per unit waktu. Perhitungan sederhana menunjukkan bahwa kami hanya memiliki sekitar 67 nanodetik untuk memproses satu paket tersebut.

Sebagai perbandingan, kali ini dekat dengan apa yang dibutuhkan prosesor modern untuk mendapatkan sepotong data dari memori jika ia melewatkan cache. Semuanya menjadi lebih rumit ketika kita mulai bekerja dengan antarmuka Ethernet 40G dan 100G dan mencoba untuk menjenuhkan mereka sepenuhnya ke tingkat garis (kinerja maksimum yang dinyatakan mungkin dari perangkat jaringan).

Karena dalam kasus biasa aliran data melewati aplikasi di ruang pengguna (userspace), kemudian melalui kernel, akhirnya masuk ke pengontrol jaringan (NIC), ide pertama dan paling mudah adalah mencoba mengkonfigurasi pembuatan paket langsung di kernel. Contoh dari solusi tersebut adalah pktgen modul nuklir [2]. Metode ini memungkinkan Anda untuk secara signifikan meningkatkan kinerja, tetapi tidak cukup fleksibel, karena perubahan sekecil apapun dalam kode sumber dalam kernel mengarah ke siklus pembangunan yang lama, mem-boot ulang modul kernel atau bahkan seluruh sistem dan, pada kenyataannya, pengujian, yang mengurangi produktivitas keseluruhan (yaitu, memerlukan lebih banyak waktu dari programmer dan usaha).

Pendekatan lain yang mungkin adalah untuk mendapatkan akses langsung dari userspace ke buffer memori pengontrol jaringan. Jalur ini lebih rumit, tetapi sepadan dengan upaya untuk mencapai produktivitas yang lebih tinggi. Kerugian termasuk kompleksitas tinggi dan fleksibilitas rendah. Contoh dari pendekatan ini adalah netmap , PF_RING, dan DPDK [4].

Cara lain yang efektif, meskipun sangat mahal untuk mencapai kinerja tinggi adalah dengan menggunakan peralatan yang tidak universal, tetapi khusus. Contoh: Ixia .

Ada juga solusi berdasarkan DPDK menggunakan skrip, yang meningkatkan fleksibilitas dalam mengontrol parameter generator, dan juga memungkinkan Anda untuk memvariasikan jenis paket yang dihasilkan selama startup. Di bawah ini kami menggambarkan pengalaman kami sendiri dengan salah satu alat ini - MoonGen.

Arsitektur MoonGen


Fitur khas MoonGen adalah:

  1. Memproses data DPDK di userspace adalah alasan utama untuk mendapatkan kinerja;
  2. Lua [ 5 ] susun dengan skrip sederhana di tingkat atas dan binding ke perpustakaan DPDK yang ditulis dalam C, di bagian bawah;
  3. Berkat teknologi JIT (tepat waktu), skrip Lua bekerja cukup cepat, yang agak bertentangan dengan ide yang diterima secara umum tentang efektivitas bahasa skrip.

MoonGen dapat dianggap sebagai pembungkus Lua di sekitar perpustakaan DPDK. Setidaknya operasi DPDK berikut terlihat di tingkat antarmuka pengguna Lua:

  • Mengkonfigurasi pengontrol jaringan;
  • Alokasi dan akses langsung ke kumpulan dan buffer memori, yang, untuk tujuan optimasi, harus dialokasikan di area yang selaras terus menerus;
  • Akses langsung ke RSS-antrian pengontrol jaringan;
  • API untuk mengelola aliran komputasi, dengan mempertimbangkan heterogenitas akses memori (NUMA dan afinitas CPU) [ 12 ].



Arsitektur MoonGen, skema dari material [ 1 ].

Moongen


MoonGen adalah generator paket berkecepatan tinggi scripted berdasarkan perpustakaan DPDK. Skrip Lua mengontrol seluruh proses: skrip yang dibuat pengguna bertanggung jawab untuk membuat, memodifikasi, dan mengirim paket. Berkat pustaka pemrosesan paket LuaJIT dan DPDK yang sangat cepat, arsitektur ini memungkinkan Anda untuk menjenuhkan antarmuka Ethernet 10 gigabit dengan paket 64-byte hanya menggunakan satu inti dari CPU. MoonGen memungkinkan Anda untuk mencapai kecepatan ini bahkan ketika skrip Lua memodifikasi setiap paket. Itu tidak menggunakan trik seperti menggunakan kembali buffer yang sama dari pengontrol jaringan.

MoonGen juga dapat menerima paket, mis. Memeriksa paket mana yang dijatuhkan oleh sistem yang sedang diuji. Karena penerimaan paket dikendalikan secara eksklusif oleh skrip Lua khusus, itu juga dapat digunakan untuk membuat skrip pengujian yang lebih kompleks. Misalnya, Anda dapat menggunakan dua instance MoonGen untuk membuat koneksi satu sama lain. Konfigurasi semacam itu dapat digunakan, khususnya, untuk menguji apa yang disebut kotak tengah (peralatan antara titik pengiriman dan penerimaan lalu lintas), misalnya, firewall. MoonGen berfokus pada empat bidang utama:

  • Kinerja tinggi dan penskalaan multi-core: lebih dari 20 juta paket per detik pada satu inti CPU;
  • Fleksibilitas: setiap paket dihasilkan secara real time berdasarkan skrip Lua yang dibuat pengguna;
  • Prangko waktu yang tepat: pada perangkat keras (komoditas) biasa, penandaan waktu dilakukan dengan akurasi milidetik;
  • Kontrol yang tepat dari interval antara paket yang dikirim: generasi yang dapat diandalkan dari pola dan jenis lalu lintas yang diperlukan pada perangkat keras biasa.

DPDK


DPDK adalah singkatan dari Data Plane Development Kit dan terdiri dari perpustakaan yang fungsi utamanya adalah untuk meningkatkan kinerja menghasilkan paket jaringan pada beragam arsitektur prosesor pusat.

Dalam dunia di mana jaringan komputer menjadi dasar komunikasi manusia, kinerja, bandwidth, dan latensi menjadi parameter yang semakin penting untuk sistem seperti jaringan nirkabel dan infrastruktur kabel, termasuk semua komponen individu: router, penyeimbang beban, firewall; serta area aplikasi: transfer media (streaming), VoIP, dll.

DPDK adalah cara yang ringan dan nyaman untuk membuat tes dan skrip. Transfer data dalam userspace adalah sesuatu yang tidak sering kita amati, terutama karena sebagian besar aplikasi berkomunikasi dengan peralatan jaringan melalui sistem operasi dan tumpukan kernel, yang merupakan kebalikan dari model DPDK.

Lua


Tujuan utama dari keberadaan Lua adalah untuk menyediakan alat-alat ekspresif yang sederhana dan fleksibel yang dapat diperluas untuk tugas-tugas spesifik saat ini, bukan seperangkat primitif yang hanya berlaku dalam satu paradigma pemrograman. Hasilnya, bahasa dasarnya sangat ringan - seluruh penerjemah hanya membutuhkan 180 kB dalam bentuk yang dikompilasi dan mudah beradaptasi dengan berbagai kemungkinan implementasi.

Lua adalah bahasa yang dinamis. Sangat kompak sehingga dapat ditempatkan di hampir semua perangkat. Lua mendukung serangkaian kecil jenis: nilai Boolean, angka (titik mengambang presisi ganda), dan string. Struktur data konvensional, seperti array, set, dan daftar, dapat diwakili oleh satu-satunya struktur data built-in di Lua - sebuah tabel, yang merupakan array asosiatif heterogen.

Lua menggunakan kompilasi JIT (just in time), oleh karena itu, sebagai bahasa scripting, ia menunjukkan kinerja yang sebanding dengan bahasa yang dikompilasi seperti C [ 10 ].

Mengapa moongen


Sebagai perusahaan yang berspesialisasi dalam menetralkan serangan DDoS, Qrator Labs membutuhkan cara yang andal untuk membuat, meningkatkan, dan menguji solusi keamanannya sendiri. Untuk pengujian yang terakhir, diperlukan berbagai metode untuk menghasilkan lalu lintas yang mensimulasikan serangan nyata. Namun, tidaklah mudah untuk mensimulasikan serangan banjir yang berbahaya, namun langsung, pada 2-3 tingkat model OSI, terutama karena kesulitan dalam mencapai kinerja tinggi dalam pembuatan paket.

Dengan kata lain, untuk perusahaan yang terlibat dalam ketersediaan berkelanjutan dan netralisasi DDoS, mensimulasikan berbagai serangan DoS di lingkungan laboratorium yang terisolasi adalah cara untuk memahami bagaimana berbagai peralatan yang merupakan bagian dari sistem perangkat keras perusahaan akan berperilaku dalam kenyataan.

MoonGen adalah cara yang baik untuk menghasilkan nilai lalu lintas yang dekat dengan batas untuk pengontrol jaringan di minimum core CPU. Transfer data dalam ruang pengguna secara signifikan meningkatkan kinerja tumpukan yang dipermasalahkan (MoonGen + DPDK), dibandingkan dengan banyak opsi lain untuk menghasilkan nilai lalu lintas tinggi. Menggunakan DPDK murni membutuhkan lebih banyak upaya, jadi Anda tidak perlu terkejut dengan keinginan kami untuk mengoptimalkan kinerja. Kami juga mendukung klon [ 7 ] dari repositori MoonGen asli untuk memperluas fungsionalitas dan implementasi tes kami sendiri.

Untuk mencapai fleksibilitas maksimum, logika untuk menghasilkan paket diatur oleh pengguna menggunakan skrip Lua, yang merupakan salah satu fitur utama MoonGen. Dalam hal pemrosesan paket yang relatif sederhana, solusi ini bekerja cukup cepat untuk menjenuhkan antarmuka 10G pada inti CPU tunggal. Cara khas untuk memodifikasi paket yang masuk dan membuat yang baru adalah bekerja dengan paket dari jenis yang sama, di mana hanya beberapa bidang yang berubah.

Contohnya adalah tes l3-tcp-syn-ack-flood, dijelaskan di bawah ini. Perhatikan bahwa setiap modifikasi paket dapat dilakukan di buffer yang sama, di mana paket yang dihasilkan atau diterima pada langkah sebelumnya ternyata. Memang, konversi paket semacam itu dilakukan dengan sangat cepat, karena tidak melibatkan operasi mahal, seperti panggilan sistem, akses ke bagian memori yang berpotensi tidak di-cache, dan sejenisnya.

Tes pada Perangkat Keras Qrator Labs


Laboratorium Qrator melakukan semua tes di laboratorium pada berbagai peralatan. Dalam hal ini, kami menggunakan pengontrol antarmuka jaringan berikut:

  • Intel 82599ES 10G
  • Mellanox ConnectX-4 40G
  • Mellanox ConnectX-5 100G

Kami mencatat secara terpisah bahwa ketika bekerja dengan pengontrol jaringan yang beroperasi pada standar di atas 10G, masalah kinerja menjadi lebih akut. Saat ini tidak mungkin untuk menjenuhkan antarmuka 40G dengan satu inti, meskipun dengan sejumlah kecil inti ini sudah realistis.

Dalam hal pengontrol jaringan yang diproduksi oleh Mellanox, dimungkinkan untuk mengubah beberapa parameter dan pengaturan perangkat menggunakan panduan tuning [ 3 ] yang disediakan oleh pabrikan. Ini memungkinkan Anda untuk meningkatkan kinerja, dan dalam beberapa kasus khusus, untuk memperdalam perilaku NIC. Pabrikan lain mungkin memiliki dokumen serupa untuk perangkat berkinerja tinggi mereka sendiri yang ditujukan untuk penggunaan profesional. Bahkan jika Anda tidak dapat menemukan dokumen seperti itu di domain publik, selalu masuk akal untuk menghubungi pabrikan secara langsung. Dalam kasus kami, perwakilan dari perusahaan Mellanox sangat baik dan, selain memberikan dokumentasi, dengan cepat menjawab pertanyaan kami, karena itu kami berhasil mencapai pemanfaatan 100% strip, yang sangat penting bagi kami.

Tes banjir TCP SYN


L3-tcp-syn-ack-flood adalah contoh mensimulasikan serangan seperti SYN flood [ 6 ]. Ini adalah versi diperpanjang Qrator Labs dari uji l3-tcp-syn-banjir dari repositori MoonGen utama, yang disimpan dalam klon repositori kami.

Tes kami dapat menjalankan tiga jenis proses:

  1. Hasilkan aliran paket TCP SYN dari awal, dengan memvariasikan bidang yang diperlukan, seperti alamat IP sumber, nomor port sumber, dll.
  2. Buat respons ACK yang valid untuk setiap paket SYN yang diterima sesuai dengan TCP;
  3. Buat respons SYN-ACK yang valid untuk setiap paket ACK yang diterima sesuai dengan protokol TCP.

Misalnya, loop kode internal (masing-masing, "terpanas") untuk membuat respons ACK adalah sebagai berikut:

local tx = 0 local rx = rxQ:recv(rxBufs) for i = 1, rx do local buf = rxBufs[i] local pkt = buf:getTcpPacket(ipv4) if pkt.ip4:getProtocol() == ip4.PROTO_TCP and pkt.tcp:getSyn() and (pkt.tcp:getAck() or synack) then local seq = pkt.tcp:getSeqNumber() local ack = pkt.tcp:getAckNumber() pkt.tcp:unsetSyn() pkt.tcp:setAckNumber(seq+1) pkt.tcp:setSeqNumber(ack) local tmp = pkt.ip4.src:get() pkt.ip4.src:set(pkt.ip4.dst:get()) pkt.ip4.dst:set(tmp) … -- some more manipulations with packet fields tx = tx + 1 txBufs[tx] = buf end end if tx > 0 then txBufs:resize(tx) txBufs:offloadTcpChecksums(ipv4) -- offload checksums to NIC txQ:send(txBufs) end 

Gagasan umum untuk membuat paket respons adalah sebagai berikut. Pertama, Anda perlu menghapus paket dari antrian RX, lalu periksa apakah jenis paket cocok dengan yang diharapkan. Jika kebetulan, siapkan jawaban dengan memodifikasi beberapa bidang paket asli. Akhirnya, masukkan paket yang dibuat ke antrian TX menggunakan buffer yang sama. Untuk meningkatkan kinerja, alih-alih mengambil paket satu per satu dan memodifikasinya satu per satu, kami menggabungkannya, mengekstraksi semua paket yang tersedia dari antrian RX, membuat respons yang sesuai, dan menempatkan semuanya dalam antrian TX. Meskipun ada sejumlah besar manipulasi pada satu paket, kinerja tetap tinggi, terutama karena fakta bahwa Lua JIT mengkompilasi semua operasi ini menjadi sejumlah kecil instruksi prosesor. Banyak tes lain, tidak hanya TCP SYN / ACK, bekerja dengan prinsip yang sama.

Tabel di bawah ini menunjukkan hasil uji banjir SYN (generasi SYN tanpa upaya respons) menggunakan Mellanox ConnectX-4. NIC ini memiliki dua port 40G dengan langit-langit kinerja teoritis 59,52 Mpps pada satu port dan 2 * 50 Mpps untuk dua port. Implementasi spesifik menghubungkan NIC ke PCIe agak membatasi bandwidth (memberikan 2 * 50 bukannya yang diharapkan 2 * 59,52).
core per port1 port, Mpps2 port, Mpps per masing-masing port
12019
23836
356.547
459.550

Uji banjir SYN; NIC: Mellanox Technologies MT27700 Family (ConnectX-4), port ganda 40G; CPU: Intel® Xeon® Silver 4114 CPU @ 2.20GHz

Tabel berikut menunjukkan hasil uji banjir SYN yang sama yang dilakukan pada Mellanox ConnectX-5 dengan satu port 100G.
coreMpps
135
269
3104
4127
5120
6131
7132
8144

Uji banjir SYN; NIC: Mellanox Technologies MT27800 Family (ConnectX-5), port 100G tunggal; CPU: Intel® Xeon® Silver 4114 CPU @ 2.20GHz

Perhatikan bahwa dalam semua kasus, kami mencapai lebih dari 96% langit-langit kinerja teoritis pada sejumlah kecil inti prosesor.

Tangkap lalu lintas masuk dan simpan ke file PCAP


Contoh lain dari tes ini adalah rx-to-pcap, yang mencoba untuk menangkap semua lalu lintas masuk dan menyimpan ke sejumlah file PCAP [ 8 ]. Meskipun tes ini tidak secara khusus menyangkut pembuatan paket, itu berfungsi sebagai demonstrasi fakta bahwa tautan terlemah dalam mengatur transfer data melalui userspace adalah sistem file. Bahkan sistem file virtual tmpfs memperlambat aliran secara signifikan. Dalam hal ini, 8 inti dari prosesor sentral diperlukan untuk pemanfaatan 14,88 Mpps, sementara hanya satu inti yang cukup untuk menerima (dan mengatur ulang, atau mengarahkan ulang) jumlah lalu lintas yang sama.

Tabel berikut menunjukkan jumlah lalu lintas (dalam Mpps) yang diterima dan disimpan ke file PCAP yang terletak di sistem file ext2 pada SSD (kolom kedua) atau pada sistem file tmpfs (kolom ketiga).
corepada SSD, Mppspada tmpfs, Mpps
11.481.62
244.6
36.948.1
49.7511.65
512.113.8
613,3814.47
714.414.86
814.8814.88

Tes Rx-to-pcap; NIC: Intel 82599ES 10-Gigabit; CPU: Intel® Xeon® CPU E5-2683 v4 @ 2.10GHz

Modifikasi MoonGen: Manajer Tugas tman


Kami juga ingin memperkenalkan kepada pembaca ekstensi kami sendiri dari fungsionalitas MoonGen, yang menyediakan cara lain untuk meluncurkan sekelompok tugas untuk pengujian. Gagasan utama di sini adalah untuk memisahkan konfigurasi umum dan pengaturan khusus untuk setiap tugas, yang memungkinkan Anda untuk menjalankan sejumlah tugas yang berbeda secara sewenang-wenang (yaitu skrip Lua) secara bersamaan. Dalam klon repositori MoonGen kami, implementasi MoonGen dengan task manager [ 9 ] disajikan, di sini kami hanya akan secara singkat mencantumkan fungsi utamanya.

Antarmuka baris perintah baru memungkinkan Anda untuk menjalankan banyak tugas dari berbagai jenis secara bersamaan. Skenario dasarnya adalah sebagai berikut:

 ./build/tman [tman options...] [-- <task1-file> [task1 options...]] [-- <task2-file> [task2 options...]] [-- ...] 

Selain itu ./build/tman -h memberikan bantuan terperinci.

Namun, ada batasan - file pekerjaan Lua biasa tidak kompatibel dengan antarmuka tman . File pekerjaan tman harus dengan jelas mendefinisikan objek berikut:

  • Fungsi configure (parser) yang menjelaskan parameter pekerjaan;
  • Fungsi tugas (taskNum, txInfo, rxInfo, args), yang menjelaskan proses tugas yang sebenarnya. Di sini txInfo dan rxInfo masing-masing adalah array dari antrian RX dan TX; args berisi parameter dari task manager dan tugas itu sendiri.
  • Contoh dapat ditemukan dalam contoh / tman.

Menggunakan task manager memberi Anda lebih banyak fleksibilitas dalam menjalankan tes heterogen.

Kesimpulan


Metode yang ditawarkan MoonGen ternyata sangat sesuai dengan tujuan kami dan memuaskan karyawan dengan hasil yang diperoleh. Kami mendapat alat dengan kinerja tinggi, sambil mempertahankan lingkungan pengujian dan bahasa yang cukup sederhana. Kinerja tinggi dari pengaturan ini dicapai berkat dua fitur utama: akses langsung ke buffer pengontrol antarmuka jaringan dan teknik kompilasi Just-In-Time di Lua.

Sebagai aturan, mencapai langit-langit teoritis untuk kinerja pengontrol antarmuka jaringan adalah tugas yang layak. Seperti yang telah kami tunjukkan, satu inti mungkin cukup untuk menjenuhkan port 10G, sementara muatan penuh port 100G tidak menimbulkan masalah khusus dengan jumlah core yang lebih besar.

Kami sangat berterima kasih kepada tim Mellanox atas bantuan mereka dengan peralatan mereka dan kepada tim MoonGen atas reaksi mereka untuk memperbaiki kesalahan.

Material


  1. MoonGen: Generator Paket Berkecepatan Tinggi Scriptable - Paul Emmerich et al., Konferensi Pengukuran Internet 2015 (IMC'15), 2015
  2. Pktgen
  3. Panduan tuning Mellanox
  4. Kit Pengembangan Pesawat Data
  5. Lua
  6. Banjir sin
  7. Klon repositori MoonGen dari Qrator Labs
  8. Format file PCAP
  9. Manajer tugas
  10. Performa Lua
  11. Fungsi Jaringan Whitepaper Virtualisasi
  12. NUMA, akses memori yang tidak seragam

Source: https://habr.com/ru/post/id423957/


All Articles