Linux'ta gecikmeli ve bırakılan paketleri simüle etme


Yanıtlar:


323

netem, ağları simüle etmek için halihazırda Linux ve kullanıcı alanı yardımcı programlarında yerleşik olan işlevselliği kullanır. Aslında Mark'ın cevabı farklı bir adla ifade ediyor.

Ana sayfalarındaki örnekler zaten istediğinizi nasıl başarabileceğinizi gösteriyor:

Örnekler

Geniş alan ağı gecikmelerini taklit etme

Bu en basit örnektir, yerel Ethernet'ten çıkan tüm paketlere sabit miktarda gecikme ekler.

# tc qdisc add dev eth0 root netem delay 100ms

Şimdi yerel ağda barındırmak için basit bir ping testi 100 milisaniyelik bir artış göstermelidir. Gecikme çekirdeğin saat çözünürlüğü (Hz) ile sınırlıdır. Çoğu 2.4 sistemde, sistem saati 100 Hz'de çalışır ve bu da 10 ms'lik artışlarla gecikmelere izin verir. 2.6'da, değer 1000 ila 100 Hz arasındaki bir yapılandırma parametresidir.

Sonraki örnekler sadece qdisc'i yeniden yüklemeden parametreleri değiştirir

Gerçek geniş alan ağları değişkenlik gösterir, bu nedenle rasgele varyasyon eklemek mümkündür.

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

Bu, eklenen gecikmenin 100 ± 10 ms olmasına neden olur. Ağ gecikmesi değişimi tamamen rastgele değildir, bu nedenle bir korelasyon değerinin de olduğunu taklit etmek için.

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

Bu, eklenen gecikmenin 100 ± 10 ms olmasına neden olur ve bir sonraki rastgele eleman sonuncusunda% 25'e bağlıdır. Bu gerçek istatistiksel korelasyon değil, bir yaklaşımdır.

Gecikme dağılımı

Tipik olarak, bir ağdaki gecikme aynı değildir. Gecikmedeki değişimi tanımlamak için normal dağılım gibi bir şey kullanmak daha yaygındır. Netem disiplini, eşit olmayan bir dağılım belirlemek için bir tablo alabilir.

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

Gerçek tablolar (normal, pareto, paretonormal) iproute2 derlemesinin bir parçası olarak oluşturulur ve / usr / lib / tc içine yerleştirilir; bu nedenle deneysel verilere dayalı olarak kendi dağıtımınızı yapmak için biraz çaba harcamanız mümkündür.

Paket kaybı

Rastgele paket kaybı yüzde olarak 'tc' komutunda belirtilir. Olası en küçük sıfır olmayan değer:

2 −32 =% 0.0000000232

# tc qdisc change dev eth0 root netem loss 0.1%

Bu, yüzde (1/1000) paketin 1 / 10'unun rastgele düşmesine neden olur.

İsteğe bağlı bir korelasyon da eklenebilir. Bu, rasgele sayı üretecinin daha az rasgele olmasına neden olur ve paket patlama kayıplarını taklit etmek için kullanılabilir.

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

Bu, paketlerin% 0,3'ünün kaybolmasına neden olur ve her ardışık olasılık, sonuncusuna çeyrek bağlıdır.

Prob n = 0.25 × Prob n-1 + 0.75 × Rastgele

tc qdisc addBu arabirim için kuralınız tc qdisc changeyoksa veya bu arabirim için zaten kurallarınız varsa kullanmanız gerektiğini unutmayın . tc qdisc changeKural içermeyen bir arayüzde kullanılmaya çalışmak hata verir RTNETLINK answers: No such file or directory.


2
Orijinal web sitesinde bu hata var, sadece o metni doğrudan kopyaladım. Ama evet, 2 ^ (- 32) = 2.33e-10
ephemient

34
Not tc -p qdisc ls dev eth0akım tanımlanmış kurallar listesi, ve tc qdisc del dev eth0 rootbunları silecektir
Quamis

1
Mevcut olmayan bir girişi değiştirmeye çalışırken hataya işaret etti
Neo

Bu hataları neden aldığımı biliyor musunuz? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / iş yükleri / SONUÇLAR $ sudo tc qdisc dev eth0 root netem gecikmesi 100ms RTNETLINK yanıtlar: Dosya var ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / iş yükleri / SONUÇLAR $ sudo tc qdisc değişiklik dev eth0 root netem gecikme 100 ms RTNETLINK cevaplar: Geçersiz argüman serverfault.com/questions/743885/…
Mona Jalal

Düşük hızlı bağlantıları simüle etmek için tüm arayüz verimini nasıl sınırlandıracağınızla ilgili ayrıntıları dahil etmek iyi bir fikir olabilir
Pavel P

91

Bırakılan paketler için iptables ve istatistik modülünü kullanırım .

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

Yukarıda% 1 olasılıkla gelen bir paket düşecektir. Dikkatli olun, yaklaşık 0.14'ün üzerindeki herhangi bir şey ve çoğunuz tcp bağlantıları büyük olasılıkla tamamen durur.

Adam iptables bir göz atın ve daha fazla bilgi için "istatistik" arayın.


6
TCP bağlantıları neden% 14'ün üzerinde dursun?
David Wolever

2
@DavidWolever: Tcp sürgülü pencerelerin boyutunun ayarlanması nedeniyle. Ancak% 14 tamamen deneyimlidir, kendiniz bir deneyin ve ssh'nin% 14 ve üzeri çoğunlukla kullanılamaz hale geldiğini göreceksiniz, ancak aslında daha düşük paket damla oranlarında oldukça iyi çalışıyor.
Bjarke Freund-Hansen

12
Güvenlik için, kuralı yalnızca test etmek istediğiniz bağlantı noktalarına uygulamak için sınırlamak en iyisidir: iptables -A INPUT --dport FOO -m istatistikleri .... Bu şekilde, ssh ve diğer bağlantılarınız ilgisiz kalmak ve ilgili hizmetin herhangi bir sorunu daha hızlı yeniden üretebilmesi için düşme oranını çarpabilirsiniz.
Mikhail T.

5
Not olduğu DROPüzerinde giden bağlantıları oldukça gülünç neden send()dönüş operasyonlarını EPERMziyade sadece (olması gerektiği gibi) paketleri bırakarak,.
Sahte Ad

2
Bu komutu geri almak için gereken tek şey bu mu? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314

6

Meslektaşlarımdan biri bunu yapmak için tc kullanıyor. Daha fazla bilgi için kılavuz sayfasına bakınız. Kullanımının bir örneğini burada görebilirsiniz .


Bence iptables kullanımı daha kolay :)
c4f4t0r

emin, ama tc iptables çok daha hızlı
teknoraver

5

iptables (8) her nth paketi eşleştirmek için kullanılabilecek bir istatistik eşleme modülüne sahiptir. Bu paketi bırakmak için -j DROP ekleyin .



1

Kendim denemedim, ancak bu sayfada Linux'un yerleşik iptables IP filtreleme sisteminde çalışan eklenti modüllerinin bir listesi var. Modüllerden birine "n." Denir ve paketlerin yapılandırılabilir bir oranını düşürecek bir kural belirlemenize izin verir. En azından başlamak için iyi bir yer olabilir.



1

Kullanımı kolay bir ağ hatası enjeksiyon aracı Saboteur'dur . Simüle edebilir:

  • Toplam ağ bölümü
  • Uzaktan servis öldü (beklenen bağlantı noktasını dinlemiyor)
  • gecikmeler
  • Paket kaybı -TCP bağlantısı zaman aşımı (iki sistem durum bilgisi olan bir güvenlik duvarı ile ayrıldığında sıklıkla görülür)

1
Ne yazık ki, bu projeye son taahhüt 28 Ağustos 2015'te, yani neredeyse 4 yıl önceydi. Açık konular şimdi 5 yaşında.
Ali

1

Bilim camiasında bu amaçla en çok kullanılan araçlardan biri DummyNet'tir . Eğer yükledikten sonra ipfw2 makineler arasında 50ms yayılma gecikmesi tanıtmak amacıyla, çekirdek modülü sadece bu komutları çalıştırın:

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

Ayrıca paket kayıplarının% 50'sini sunmak için:

./ipfw pipe 1 config plr 0.5

İşte daha fazla ayrıntı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.