Untuk melakukan ini, Anda dapat menggunakan tc
sendiri dengan u32
filter 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 tc
alat 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 htb
untuk Hierarchy Token Bucket (qdisc default perangkat adalah pfifo
atau pfifo_fast
tergantung pada OS). Ini secara khusus sesuai untuk manajemen bandwidth. Paket yang tidak cocok dengan filter yang ditentukan pada level ini akan masuk ke 1:30
kelas.
1:1
akan menjadi htb
kelas yang membatasi seluruh lalu lintas perangkat hingga 10 Mbit / s.
1:10
akan menjadi htb
kelas yang membatasi lalu lintas keluaran hingga 9 Mbit / detik (90% dari 10 Mbit / detik).
1:20
akan menjadi htb
kelas yang membatasi lalu lintas keluaran hingga 8 Mbit / detik (80% dari 10 Mbit / detik).
1:30
akan menjadi htb
kelas yang membatasi lalu lintas hingga 10 Mbit / s (mundur).
:10, :20, :30
adalah sfq
qdisc 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:10
kelas dan paket IP dengan IP tujuan sama dengan C akan masuk ke 1:20
kelas:
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 tc
aturan 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 htb
kelas 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:20
dan 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