Mensimulasikan paket tertunda dan terjatuh di Linux

Jawaban:

323

netem memanfaatkan fungsionalitas yang sudah ada di Linux dan utilitas userspace untuk mensimulasikan jaringan. Inilah sebenarnya yang dimaksud oleh jawaban Markus, dengan nama yang berbeda.

Contoh di beranda mereka sudah menunjukkan bagaimana Anda dapat mencapai apa yang Anda minta:

Contohnya

Meniru penundaan jaringan area luas

Ini adalah contoh paling sederhana, itu hanya menambah jumlah penundaan tetap untuk semua paket keluar dari Ethernet lokal.

# tc qdisc add dev eth0 root netem delay 100ms

Sekarang tes ping sederhana untuk menjadi tuan rumah di jaringan lokal akan menunjukkan peningkatan 100 milidetik. Penundaan dibatasi oleh resolusi clock dari kernel (Hz). Pada sebagian besar sistem 2.4, jam sistem beroperasi pada 100 Hz yang memungkinkan penundaan peningkatan 10 ms. Pada 2.6, nilainya adalah parameter konfigurasi dari 1000 hingga 100 Hz.

Contoh selanjutnya hanya mengubah parameter tanpa memuat ulang qdisc

Jaringan luas nyata menunjukkan variabilitas sehingga dimungkinkan untuk menambahkan variasi acak.

# tc qdisc change dev eth0 root netem delay 100ms 10ms

Ini menyebabkan penundaan yang ditambahkan menjadi 100 ± 10 ms. Variasi keterlambatan jaringan tidak sepenuhnya acak, jadi untuk meniru bahwa ada nilai korelasi juga.

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

Ini menyebabkan keterlambatan yang ditambahkan menjadi 100 ± 10 ms dengan elemen acak berikutnya tergantung 25% pada yang terakhir. Ini bukan korelasi statistik yang sebenarnya, tetapi perkiraan.

Keterlambatan distribusi

Biasanya, keterlambatan dalam jaringan tidak seragam. Lebih umum menggunakan sesuatu seperti distribusi normal untuk menggambarkan variasi dalam penundaan. Disiplin netem dapat mengambil tabel untuk menentukan distribusi yang tidak seragam.

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

Tabel aktual (normal, pareto, paretonormal) dihasilkan sebagai bagian dari kompilasi iproute2 dan ditempatkan di / usr / lib / tc; jadi dimungkinkan dengan upaya untuk membuat distribusi Anda sendiri berdasarkan data eksperimental.

Paket hilang

Kehilangan paket acak ditentukan dalam perintah 'tc' dalam persen. Nilai non-nol terkecil yang mungkin adalah:

2 −32 = 0,0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

Hal ini menyebabkan 1/10 dari persen (yaitu 1 dari 1000) paket akan secara acak dijatuhkan.

Korelasi opsional juga dapat ditambahkan. Hal ini menyebabkan generator angka acak menjadi kurang acak dan dapat digunakan untuk meniru paket burst loss.

# tc qdisc change dev eth0 root netem loss 0.3% 25%

Ini akan menyebabkan 0,3% paket hilang, dan setiap probabilitas berturut-turut tergantung pada seperempat pada yang terakhir.

Prob n = 0,25 × Prob n-1 + 0,75 × Acak

Perhatikan bahwa Anda harus menggunakan tc qdisc addjika Anda tidak memiliki aturan untuk antarmuka itu atau tc qdisc changejika Anda sudah memiliki aturan untuk antarmuka itu. Mencoba menggunakan tc qdisc changeantarmuka tanpa aturan akan memberikan kesalahan RTNETLINK answers: No such file or directory.

singkat
sumber
2
Situs web asli memiliki kesalahan itu, saya hanya menyalin teks itu secara langsung. Tapi ya, 2 ^ (- 32) = 2.33e-10
ephemient
34
Perhatikan bahwa tc -p qdisc ls dev eth0akan mencantumkan aturan yang ditetapkan saat ini, dan tc qdisc del dev eth0 rootakan menghapusnya
Quamis
1
dipilih untuk menunjukkan kesalahan saat mencoba mengubah entri yang tidak ada
Neo
Apakah Anda tahu mengapa saya mendapatkan kesalahan ini? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / HASIL $ sudo tc qdisc tambahkan dev eth0 root netem delay 100ms RTNETLINK jawaban: File ada ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / HASIL $ sudo tc qdisc ubah dev eth0 root netem delay 100ms RTNETLINK jawaban: Argumen tidak valid serverfault.com/questions/743885/…
Mona Jalal
Mungkin ide yang baik untuk memasukkan perincian cara membatasi seluruh antarmuka throughput untuk mensimulasikan tautan kecepatan rendah
Pavel P
91

Untuk paket yang dijatuhkan, saya hanya akan menggunakan iptables dan modul statistik .

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

Di atas akan menjatuhkan paket yang masuk dengan probabilitas 1%. Hati-hati, apa pun di atas sekitar 0,14 dan sebagian besar dari Anda koneksi tcp kemungkinan besar akan macet sepenuhnya.

Lihatlah man iptables dan cari "statistik" untuk informasi lebih lanjut.

Bjarke Freund-Hansen
sumber
6
Mengapa koneksi TCP macet pada apa pun di atas 14%?
David Wolever
2
@ Davidvider: Karena cara ukuran jendela geser tcp disesuaikan. Tapi 14% murni dari pengalaman, coba saja sendiri dan Anda akan melihat bahwa ssh menjadi sebagian besar tidak dapat digunakan pada 14% dan di atas, tetapi sebenarnya bekerja cukup baik pada tingkat penurunan paket yang lebih rendah.
Bjarke Freund-Hansen
12
Demi keselamatan, mungkin yang terbaik adalah membatasi aturan untuk hanya berlaku untuk port (s), yang ingin Anda uji: iptables -Sebuah INPUT - statistik FOO -m .... Dengan cara ini, ssh Anda dan koneksi lainnya akan tetap tanpa gangguan dan Anda dapat menabrak drop-rate agar layanan yang diinginkan dapat mereproduksi masalah dengan lebih cepat.
Mikhail T.
5
Perhatikan bahwa DROPpada koneksi keluar agak konyol menyebabkan send()operasi kembali EPERM, bukan hanya menjatuhkan paket (seperti seharusnya).
Nama Palsu
2
Apakah ini semua yang diperlukan untuk membatalkan perintah itu? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314
6

Salah satu kolega saya menggunakan tc untuk melakukan ini. Lihat halaman manual untuk informasi lebih lanjut. Anda dapat melihat contoh penggunaannya di sini .

Menandai
sumber
Saya pikir ini lebih mudah untuk menggunakan iptables :)
c4f4t0r
tentu, tetapi tc jauh lebih cepat daripada iptables
teknoraver
5

iptables (8) memiliki modul kecocokan statistik yang dapat digunakan untuk mencocokkan setiap paket ke-n. Untuk menjatuhkan paket ini, cukup tambahkan -j DROP .

hillu
sumber
1

Belum mencobanya sendiri, tetapi halaman ini memiliki daftar modul plugin yang berjalan di sistem penyaringan IP iptables bawaan Linux. Salah satu modul disebut "n", dan memungkinkan Anda untuk mengatur aturan yang akan menurunkan tingkat paket yang dapat dikonfigurasi. Paling tidak bisa menjadi tempat yang baik untuk memulai.

beristirahat
sumber
1

Alat injeksi jaringan yang mudah digunakan adalah Saboteur . Itu dapat mensimulasikan:

  • Total partisi jaringan
  • Layanan jauh mati (tidak mendengarkan pada port yang diharapkan)
  • Keterlambatan
  • Kehilangan paket - Batas waktu koneksiTCP (seperti yang sering terjadi ketika dua sistem dipisahkan oleh firewall stateful)
Alex Giotis
sumber
1
Sayangnya, komitmen terakhir untuk proyek itu adalah pada 28 Agustus 2015, yaitu hampir 4 tahun yang lalu. Masalah terbuka sekarang berusia 5 tahun.
Ali
1

Salah satu alat yang paling banyak digunakan dalam komunitas ilmiah untuk tujuan itu adalah DummyNet . Setelah Anda menginstal ipfwmodul kernel, untuk memperkenalkan jeda propagasi 50 ms antara 2 mesin, jalankan saja perintah-perintah ini:

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

Untuk juga memperkenalkan 50% paket loss Anda harus menjalankan:

./ipfw pipe 1 config plr 0.5

Sini lebih detail.

gaetano
sumber