Menggunakan tc untuk menunda paket hanya ke satu alamat IP

20

Saya baru menggunakan tc dan netem . Saya ingin menunda paket yang dikirim ke alamat IP tertentu. Namun, perintah di bawah ini menyebabkan semua paket pada sistem tertunda, bukan hanya ke alamat IP 1.2.3.4:

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

Dugaan saya adalah bahwa saya memerlukan beberapa filter catch-all di akhir untuk menentukan bahwa semua lalu lintas yang tersisa tidak boleh melalui netem. Tapi saya tidak bisa mendapatkan apa pun untuk bekerja. Bagaimana saya bisa membuatnya bekerja?

Matt White
sumber

Jawaban:

14

Ok, saya memecahkan masalah saya sendiri. Ternyata jika Anda menjalankan 3 baris pertama di atas ("tc qdisc"), itu akan menunda semua paket karena belum ada filter. Baris ke-4 mengubahnya hanya untuk menunda paket dari alamat IP tunggal itu. Baris filter tambahan dapat ditambahkan untuk menambahkan alamat IP tambahan ke daftar "tertunda". Jadi: jangan buat baris "netem delay" tanpa filter yang menunjuk ke sana.

Matt White
sumber
Terima kasih telah kembali dan memposting jawabannya. Anehnya saya menemukan bahwa itu bekerja dengan baik dua arah, tetapi toh. Saya menulis skrip pembungkus di sekitar tiga perintah untuk membantu pengujian, hanya berpikir saya akan memberikan sedikit kembali :)
Arran Cudbard-Bell
13

Jawaban yang dipilih salah / tidak lengkap. Saya menghadapi masalah yang sama, jawaban yang dipilih memberikan bantuan, tetapi tidak cukup.

Pertama, perintah berikut ini tidak benar-benar dibutuhkan.

tc qdisc del dev eth0 root

Ini akan 'menghapus' root qdisc, tetapi secara tidak langsung akan diganti dengan yang pfifo_fast (sehingga Anda tidak kehilangan konektivitas).

Perintah kedua:

tc qdisc menambahkan dev eth0 root handle 1: prio

Akan mengganti qdisc pfifo_fast dengan yang prio. Secara default, antrian prio memiliki 3 band (0, 1, 2) masing-masing dikelola oleh satu kelas (1: 1, 1: 2 dan 1: 3).

Paket akan dikirim ke salah satu band tersebut menggunakan bidang TOS dari paket IP. Konfigurasi ini ditampilkan ketika Anda menjalankan:

tc qdisc ls

melihat nilai-nilai 'priomap'.

Kemudian, Anda menambahkan qdisc netem:

tc qdisc menambahkan dev eth0 induk 1: 1 handle 2: netem delay 500ms

Dengan perintah ini, Anda menunda semua lalu lintas menuju pita 1: 1 (hingga filter tersedia).

Tetapi ada dua peringatan:

  • Lalu lintas Anda dapat memiliki nilai TOS yang berbeda dan kemudian dikirim ke band lain.
  • Pridio qdisc dapat dikonfigurasi sehingga lalu lintas pergi ke band lain.

Berikut ini memecahkan masalah saya agar tidak terpengaruh oleh netem saat filter tidak diterapkan. Alih-alih langkah-langkah di atas, saya melakukan:

tc qdisc menambahkan dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Ini akan mengirim semua lalu lintas secara default ke band 1: 3.

Lalu, saya menambahkan aturan untuk menunda lalu lintas:

tc qdisc menambahkan dev eth0 induk 1: 1 handle 10: netem delay 100ms 10ms

Ini menciptakan qdisc di band 0, tetapi karena semua traffic menuju ke band 3, itu tidak mempengaruhi saya.

Setelah itu, saya menambahkan filter:

tc filter menambahkan dev eth0 protokol ip parent 1: 0 prio 1 u32 pertandingan ip dst 10.0.0.1/32 pertandingan ip dport 80 0xffff flowid 1: 1

Sekarang dengan filter, hanya IP / port yang dipilih yang akan terpengaruh, karena kami mengarahkan lalu lintas yang dipilih ke band 0.

Semua lalu lintas lainnya terus tidak terpengaruh karena terus mengalir ke band 3.

Pengetuk kawat
sumber
apa "ip dst 10.0.0.1/32"? Apakah itu ip tujuan? apakah itu berarti ada "ip src xxx.yyy.zz.www / aa"?
Zach Folwick
Ya, itu adalah IP tujuan dalam contoh saya. Dan ya, ada opsi 'ip src'.
Telegrapher
Alasan untuk perintah pertama (tc qdisc del) adalah untuk menghapus status sebelumnya - seperti yang mungkin Anda miliki jika Anda bereksperimen mencoba membuat pekerjaan ini. FWIW jawaban yang diterima Berfungsi untukku.
Dan Pritts
Terima kasih, jawaban ini BENAR-BENAR membantu.
PepeHands
1

Contoh sederhana dari https://wiki.linuxfoundation.org/networking/netem yang memungkinkan Anda menunda paket ke IP yang diberikan tanpa memengaruhi lalu lintas lain, bahkan selama konfigurasi:

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
NeilenMarais
sumber
Saya harus menambahkan peringatan, kelihatannya penundaan diterapkan secara lebih luas yang saya harapkan dan saya tidak bisa sampai ke dasarnya. Namun tidak semua lalu lintas tampak tertunda.
NeilenMarais
0

Saya belum berhasil menunda lalu lintas ke satu IP sambil menjaga lalu lintas normal ke yang lain IP normal dengan metode yang dijelaskan dalam utas ini.

Namun, saya berhasil melakukannya dengan menggunakan perintah berikut.

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

Untuk menunda 15001mslalu lintas ke IP 1.2.3.4dari host tempat perintah dijalankan. Perintah hostname -Iini digunakan untuk mendapatkan IP utama dari host tetapi nilainya dapat diganti langsung di dalam perintah.

Saya harus menambahkan filter lain dengan 0mspenundaan agar sesuai dengan lalu lintas yang datang dari tuan rumah. Pasti tidak elegan tapi saya belum berhasil memiliki sesuatu yang lebih bagus.

Perintah terakhir dapat diganti untuk mencocokkan satu port.

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

Untuk menunda lalu lintas ke port 18583alih-alih IP 1.2.3.4.


Saya juga menemukan metode kedua pada jawaban ini untuk menunda lalu lintas 1.2.3.4:18583tanpa berdampak pada lalu lintas lainnya.

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
Nicolas Henneaux
sumber