Mensimulasikan koneksi lambat antara dua mesin server ubuntu


9

Saya ingin mensimulasikan skenario berikut: mengingat bahwa saya memiliki 4 mesin server ubuntu A, B, C dan D. Saya ingin mengurangi bandwidth jaringan sebesar 20% antara mesin A dan mesin C dan 10% antara A dan B. Cara apakah ini menggunakan alat simulasi jaringan / pelambatan?


iptables mungkin memiliki kemampuan pelambatan. Saya tidak pernah menggunakannya, tetapi layak untuk dilihat.
Michael Martinez

@MichaelMartinez Tidak, tidak. tctidak ketika digunakan dengan tanda iptables.
Xavier Lucas

@XavierLucas senang tahu!
Michael Martinez

Jawaban:


15

Untuk melakukan ini, Anda dapat menggunakan tcsendiri dengan u32filter atau dikombinasikan dengan tanda iptables (mungkin lebih mudah jika Anda tidak ingin mempelajari sintaksis filter kompleks). Saya akan di posting berikut merinci solusi sebelumnya.


Mensimulasikan pengaturan Anda

Sebagai contoh, mari kita pertimbangkan A, B, C dan D yang menjalankan antarmuka virtual 10 Mbit / s .

Anda pada dasarnya ingin:

  • A <==> B: 9 Mbit / s membentuk untuk jalan keluar
  • A <==> C: 8 Mbit / s membentuk untuk keluar

Untuk mensimulasikan ini, saya akan membuat 4 ruang nama jaringan dan antarmuka ethernet virtual dicolokkan ke jembatan.

Tentu saja, dalam kasus Anda, Anda akan bekerja dengan NIC nyata dan jembatan akan menjadi gateway atau switch Anda tergantung pada infrastruktur Anda.

Jadi dalam simulasi saya, kami akan memiliki pengaturan berikut, dalam jaringan 10.0.0.0/24:

                                  10.0.0.254            

                                  +-------+                     
                                  |       |                     
                                  |  br0  |                     
                                  |       |                   
                                  +---+---+                     
                                      |                         
                                      | veth{A..D}.peer        
                                      |                      
                  +------------+------+-----+------------+     
                  |            |            |            |      
            vethA |      vethB |      vethC |      vethD |      
              +---+---+    +---+---+    +---+---+    +---+---+  
              |       |    |       |    |       |    |       |   
              |   A   |    |   B   |    |   C   |    |   D   |   
              |       |    |       |    |       |    |       |  
              +-------+    +-------+    +-------+    +-------+    

              10.0.0.1      10.0.0.2     10.0.0.3     10.0.0.4           

Pertama, tahap persiapan agar Anda dapat memahami apa itu terbuat, lewati jika Anda tidak terbiasa dengan itu, bukan masalah besar. Namun yang harus Anda ketahui adalah bahwa perintah ip netns exec <namespace> <command>memungkinkan untuk mengeksekusi perintah di namespace jaringan (yaitu di salah satu kotak gambar sebelumnya). Ini akan digunakan di bagian selanjutnya juga.

# Create the bridge
ip link add br0 type bridge

# Create network namespaces and veth interfaces and plug them into the bridge
for host in {A..D} ; do 
    ip link netns add ${host}
    ip link add veth${host} type veth peer name veth${host}.peer
    ip link set dev veth${host}.peer master br0
    ip link set dev veth${host} netns ${host}
    ip netns exec ${host} ip link set veth${host} up
done

# Assign IPs
ip addr add 10.0.0.254/24 dev br0
ip netns exec A ip addr add 10.0.0.1/24 dev vethA
ip netns exec B ip addr add 10.0.0.2/24 dev vethB
ip netns exec C ip addr add 10.0.0.3/24 dev vethC
ip netns exec D ip addr add 10.0.0.4/24 dev vethD

Jadi pada titik ini kita memiliki pengaturan yang dijelaskan sebelumnya.


Membentuk traffic

Sudah waktunya untuk masuk ke kontrol lalu lintas untuk mendapatkan apa yang Anda inginkan. The tcalat memungkinkan Anda untuk menambahkan disiplin antrian:

  • Untuk keluar: sekali kernel perlu mengirim paket dan sebelum mengakses driver NIC.
  • Untuk masuknya: setelah mengakses driver NIC dan sebelum rutin kernel dijalankan lebih dari paket yang diterima.

Muncul dengan 3 gagasan: qdisc , kelas dan filter . Gagasan tersebut dapat digunakan untuk mengatur manajemen aliran paket yang kompleks dan memprioritaskan lalu lintas berdasarkan kriteria / kriteria apa pun yang Anda inginkan.

Singkatnya:

  • Qdiscs adalah struktur di mana paket akan enqueued / dequeued.
  • Kelas adalah wadah untuk qdiscs yang bertindak dengan perilaku tertentu.
  • Filter adalah cara untuk merutekan paket antar kelas, beberapa di antaranya dapat ditentukan pada titik masuk yang sama dengan prioritas selama pemrosesan.

Semua ini biasanya berfungsi sebagai pohon di mana daun adalah qdisc dan kelas adalah simpul. Akar pohon atau subtree akan dinyatakan sebagai <id>:dan simpul anak-anak akan dinyatakan sebagai <parent_id>:<children_id>. Ingat sintaks ini.

Untuk kasus Anda, mari kita ambil A dan render pohon yang ingin Anda atur tc:

                                     1:
                                      |
                                      |
                                      |
                                     1:1
                                   /  |  \
                                  /   |   \
                                 /    |    \
                               1:10  1:20  1:30
                                |     |     |
                                |     |     |
                               :10   :20   :30

Penjelasan:

  • 1:adalah qdisc root yang terpasang pada perangkat vethA, itu akan diambil secara eksplisit seperti htbuntuk Hierarchy Token Bucket (qdisc default perangkat adalah pfifoatau pfifo_fasttergantung pada OS). Ini secara khusus sesuai untuk manajemen bandwidth. Paket yang tidak cocok dengan filter yang ditentukan pada level ini akan masuk ke 1:30kelas.
  • 1:1akan menjadi htbkelas yang membatasi seluruh lalu lintas perangkat hingga 10 Mbit / s.
  • 1:10akan menjadi htbkelas yang membatasi lalu lintas keluaran hingga 9 Mbit / detik (90% dari 10 Mbit / detik).
  • 1:20akan menjadi htbkelas yang membatasi lalu lintas keluaran hingga 8 Mbit / detik (80% dari 10 Mbit / detik).
  • 1:30akan menjadi htbkelas yang membatasi lalu lintas hingga 10 Mbit / s (mundur).
  • :10, :20, :30adalah sfqqdisc untuk Antrian Stochastic Justice. Dengan kata lain qdiscs ini akan memastikan keadilan dalam jadwal transmisi berdasarkan arus.

Semua ini diatur oleh perintah berikut:

ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30
ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k
ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10

Hal terakhir yang kita butuhkan adalah menambahkan filter sehingga paket IP dengan IP tujuan sama dengan B akan masuk ke 1:10kelas dan paket IP dengan IP tujuan sama dengan C akan masuk ke 1:20kelas:

ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20

Sekarang setelah Anda mendapatkan idenya, Anda perlu menambahkan tcaturan serupa ke B dan C sehingga transmisi menuju A dari rig ini juga dibentuk.


Pengujian

Sekarang mari kita coba. Untuk ini saya secara pribadi digunakan untuk bermain iperf, itu hanya terdiri dari biner tunggal yang dapat dijalankan sebagai klien atau server dan secara otomatis akan mengirimkan lalu lintas sebanyak mungkin antara kedua host.

Antara A dan B:

 $ ip netns exec B iperf -s -p 8001
  ...
 $ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  2.0- 4.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  4.0- 6.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  6.0- 8.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  8.0-10.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  0.0-10.1 sec  10.8 MBytes  8.91 Mbits/sec

Kami mendapatkan batas bandwidth 9 Mbit / s kami .

Antara A dan C:

$ ip netns exec C iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.3, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  2.0- 4.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  4.0- 6.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  6.0- 8.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  8.0-10.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  0.0-10.1 sec  9.62 MBytes  7.98 Mbits/sec

Kami mendapatkan batas bandwidth 8 Mbit / s kami .

Antara A dan D:

$ ip netns exec D iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.4, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.62 MBytes  11.0 Mbits/sec
[  5]  2.0- 4.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  4.0- 6.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  6.0- 8.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  8.0-10.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  0.0-10.2 sec  12.0 MBytes  9.89 Mbits/sec

Di sini kita memiliki antarmuka virtual kecepatan penuh 10 Mbit / s tercapai.

Perhatikan bahwa ledakan ukuran pertama dari setiap proses dapat ditangani dengan lebih baik di htbkelas dengan menyesuaikan parameter yang memadai.


Membersihkan

Untuk menghapus :

  • Filter prioritas 1 pada 1:: tc filter del dev vethA parent 1: prio 1 u32.
  • Semua filter pada 1:: tc filter del dev vethA parent 1:.
  • Kelas 1:20dan anak-anaknya: tc class del dev vethA parent 1:1 classid 1:20.
  • Seluruh pohon: tc qdisc del dev vethA.

Untuk membersihkan set simulasi:

# Remove veth pairs and network namespaces
for host in {A..D} ; do
    ip link del dev veth${host}.peer
    ip netns del ${host}
done

# Remove the bridge
ip link del dev br0

1
Terima kasih banyak atas balasan Anda yang luar biasa. Jika memungkinkan, bisakah Anda menambahkan perintah untuk menghapus filter? kalau-kalau ada yang ingin mengembalikan pengaturan ini dengan aman setelah simulasi.
Yehia Elshater

1
@YahiaZakaria Saya baru saja menambahkan informasi ini di bagian akhir posting saya.
Xavier Lucas

0

Ubuntu memiliki IPFW porting dari FreeBSD, dan IPFW memiliki DUMMYNET yang memungkinkan untuk mengelola berbagai parameter jaringan - bandwidth, penundaan, tingkat kehilangan paket, dll.


0

Yang terbaik adalah menggunakan alat tc dengan modul netem yang sekarang terintegrasi (setidaknya dalam server Ubuntu). Anda dapat menemukan lebih banyak info di artikel ini dari Stackoverflow .


Netem adalah tentang persaingan dan kemacetan, bukan tentang bandwidth.
Xavier Lucas

1
@ XavierLucas, Anda benar, untuk bandwidth Anda hanya perlu tc, bahkan tanpa netem.
Luc Stepniewski

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.