Paketleri yalnızca tek bir IP adresine geciktirmek için tc kullanma


20

Ben kullanmaya yeni duyuyorum tc ve netem . Belirli bir IP adresine gönderilen paketleri ertelemek istiyorum. Ancak, aşağıdaki komutlar, yalnızca IP adresi 1.2.3.4 yerine sistemdeki tüm paketlerin gecikmesine neden olur:

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1

Benim tahminim, tüm kalan trafiğin netem üzerinden geçmemesi gerektiğini belirtmek için sonunda bir tür yakalama filtresine ihtiyacım var. Ama çalışacak bir şey bulamıyorum. Bunu nasıl çalıştırabilirim?

Yanıtlar:


14

Tamam, kendi sorunumu çözdüm. Yukarıdaki ilk 3 satırı ("tc qdisc" olanlar) yürütürseniz, henüz filtre olmadığı için tüm paketleri geciktireceği ortaya çıkıyor. 4. satır, yalnızca bu tek IP adresinden gelen paketleri geciktirir. "Gecikmeli" listeye ek IP adresleri eklemek için ek filtre hatları eklenebilir. Yani: filtreyi göstermeden "netem gecikmesi" satırı oluşturmayın.


Geri gelip cevabı gönderdiğin için teşekkür ederim. Garip bir şekilde, her iki şekilde de iyi çalıştı buldum, ama yine de. Test etmek için bu üç komutun etrafına bir sarıcı komut dosyası yazdım, sadece biraz geri vereceğimi düşündüm :)
Arran Cudbard-Bell

13

Seçilen cevap yanlış / eksik. Benzer bir sorunla karşılaştım, seçilen cevap biraz yardım etti, ancak yeterli değil.

İlk olarak, aşağıdaki komut gerçekten gerekli değildir.

tc qdisc del dev eth0 kökü

Kök qdisc'i 'silecek', ancak bir pfifo_fast ile değiştirilecektir (böylece bağlantıyı kaybetmezsiniz).

İkinci komut:

tc qdisc dev eth0 kök kolu 1 ekleyin: prio

Pfifo_fast qdisc'i prio ile değiştirir. Varsayılan olarak, prio kuyruğunun her biri bir sınıf tarafından yönetilen 3 bant (0, 1, 2) vardır (1: 1, 1: 2 ve 1: 3).

Paketler, IP paketinin TOS alanı kullanılarak bu bantlardan birine gönderilir. Bu yapılandırma, yürüttüğünüzde gösterilir:

tc qdisc ls

'priomap' değerlerine bakıyoruz.

Sonra bir netem qdisc ekleyin:

tc qdisc add dev eth0 parent 1: 1 tanıtıcı 2: netem gecikmesi 500ms

Bu komutla 1: 1 bandına giden tüm trafiği geciktirirsiniz (filtre yerine oturana kadar).

Ancak iki uyarı var:

  • Trafiğinizin farklı bir TOS değeri olabilir ve daha sonra başka bir banda gönderilebilir.
  • Prio qdisc, trafik başka bir banda gidecek şekilde yapılandırılabilir.

Aşağıdakiler, filtre uygulanmadığında ağımdan etkilenmeme sorunumu çözdü. Yukarıdaki adımlar yerine, yaptım:

tc qdisc dev et0 kök sapı 1 ekle: prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Bu, tüm trafiği varsayılan olarak 1: 3 bandına gönderir.

Sonra trafiği geciktirmek için kural ekledim:

tc qdisc dev et0 eklemek ebeveyn 1: 1 kolu 10: netem gecikme 100ms 10ms

Bu, bant 0'da qdisc'i oluşturur, ancak tüm trafik bant 3'e gittiğinden beni etkilemedi.

Daha sonra filtreyi ekledim:

tc filtresi dev eth0 protokolü ekle ip üst 1: 0 prio 1 u32 maç ip dst 10.0.0.1/32 maç ip dport 80 0xffff akışkan 1: 1

Şimdi filtreyle birlikte, seçilen trafiği 0 bandına yönlendirdiğimiz için yalnızca seçilen IP / bağlantı noktası etkilenecektir.

Diğer tüm trafik bant 3'e akmaya devam ettiğinden etkilenmez.


"ip dst 10.0.0.1/32" nedir? Hedef ip bu mu? Bu bir "ip src xxx.yyy.zz.www / aa" olduğu anlamına mı geliyor?
Zach Folwick

Evet, benim örneğimdeki hedef IP. Ve evet, bir 'ip src' seçeneği var.
Telgrafçı

İlk komutun nedeni (tc qdisc del) önceki durumları temizlemektir - bu işi yapmaya çalışıyorsanız deneyebileceğiniz gibi. Kabul edilen cevabı FWIW Benim için çalıştı.
Dan Pritts

Teşekkürler, bu cevap gerçekten yardımcı oldu.
PepeHands

1

Https://wiki.linuxfoundation.org/networking/netem adresinden , yapılandırma sırasında bile başka bir trafiği etkilemeden paketleri belirli bir IP'ye geciktirmenize olanak tanıyan basit bir örnek :

tc qdisc del dev eth0 root # Ensure you start from a clean slate
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 500ms
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
   match ip dst 192.168.1.2 flowid 1:3

Bir uyarı eklemeliyim, daha sonra beklediğimden daha geniş bir şekilde uygulanan gecikme gibi görünüyordu ve dibe ulaşamadım. Tüm trafik gecikmiş gibi görünmüyordu.
NeilenMarais

0

Bu iş parçacığında açıklanan yöntemle trafiği başka bir IP'ye normal tutarken bir IP trafiğini geciktirmeyi başaramadım.

Ancak, aşağıdaki komutları kullanarak bunu başarabilirim.

tc qdisc add dev eth0 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
tc qdisc add dev eth0 parent 1:2 handle 20: netem delay 0ms
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip src `hostname -I` flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 15001ms
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 1.2.3.4 flowid 1:1

Komutun yürütüldüğü ana bilgisayardan 15001msIP'ye 1.2.3.4giden trafiği geciktirmek için . Komut hostname -I, ana bilgisayarın ana IP'sini almak için kullanılır, ancak değer doğrudan komutun içinde değiştirilebilir.

0msAna bilgisayardan gelen trafiği eşleştirmek için gecikmeli başka bir filtre eklemek zorunda kaldım . Herhalde zarif değil ama daha güzel bir şey yapmayı başaramadım.

Son komut tek bir bağlantı noktasına uyacak şekilde değiştirilebilir.

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 18583 0xffff flowid 1:1

18583IP yerine bağlantı noktasına giden trafiği geciktirmek için 1.2.3.4.


Bu yanıta , trafiği diğer trafiği etkilemeden ertelemek için ikinci bir yöntem buldum .1.2.3.4:18583

tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip  parent 1: prio 1 u32 match ip dst 1.2.3.4 match ip dport 18583 0xffff flowid 1:1
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip protocol 1 0xff flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10ms
tc qdisc add dev eth0 parent 1:2 handle 20: sfq
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.