Bunu yapmak için filtrelerle tctek başına u32veya iptables işaretlemesiyle birlikte kullanabilirsiniz (karmaşık filtreler sözdizimini öğrenmek istemiyorsanız belki daha kolay olabilir). Aşağıdaki yazıda eski çözümü ayrıntılı olarak açıklayacağım.
Kurulumunuzu simüle etme
Örnek olarak, 10 Mbit / s sanal arabirim çalıştıran A, B, C ve D'yi ele alalım .
Temel olarak:
- A <==> B: 9 Çıkış için 9 Mbit / s şekillendirme
- A <==> C: Çıkış için 8 Mbit / s şekillendirme
Bunu simüle etmek için bir köprüye takılmış 4 ağ ad alanı ve sanal ethernet arayüzü oluşturacağım.
Tabii ki, sizin durumunuzda gerçek NIC'lerle çalışacaksınız ve köprü, altyapınıza bağlı olarak ağ geçidiniz veya bir anahtar olacaktır.
Simülasyonumda 10.0.0.0/24 ağında aşağıdaki kurulum gerçekleştirilecek:
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
İlk olarak, kurulum phasis'i, ne yapıldığını anlayabilmeniz için, aşina değilseniz atlayın, önemli değil. Bununla birlikte bilmeniz gerekenler, komutun ip netns exec <namespace> <command>bir ağ ad alanında (yani önceki çizimin kutusundan birinde) bir komutun yürütülmesine izin verdiğidir. Bu, bir sonraki bölümde de kullanılacaktır.
# 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
Bu noktada, daha önce açıklanan düzene sahibiz.
Trafiği şekillendirme
İstediğinizi elde etmek için trafik kontrolüne geçme zamanı. tcAracı kuyruk disiplinlerini eklemenizi sağlar:
- Çıkış için: çekirdeğin paket göndermesi gerektiğinde ve NIC sürücüsüne erişmeden önce.
- Giriş için: NIC sürücüsüne eriştikten sonra ve çekirdek rutinleri alınan paketler üzerinde çalıştırılmadan önce.
3 kavram ile gelir: qdisc , sınıflar ve filtreler . Bu kavramlar, karmaşık paket akış yönetimini ayarlamak ve trafiği istediğiniz ölçüt / ölçütlere göre önceliklendirmek için kullanılabilir.
Kısaca :
- Qdisk'ler, paketlerin yaratıcı bir şekilde sıralanacağı / ayıklandığı yapılar.
- Sınıflar, belirli davranışlarla hareket eden qdisk'ler için kaplardır.
- Filtreler paketleri sınıflar arasında yönlendirmenin bir yoludur, bunların birçoğu aynı giriş noktasında işleme sırasında önceliklerle tanımlanabilir.
Tüm bunlar genellikle yaprakların qdiscs ve sınıfların düğüm olduğu bir ağaç olarak çalışır. Bir ağacın veya alt ağacın kökü olarak <id>:ve alt düğümleri olarak bildirilir <parent_id>:<children_id>. Bu sözdizimini unutmayın.
Sizin durumunuz için, A'yı alalım ve kurmak istediğiniz ağacı oluşturalım tc:
1:
|
|
|
1:1
/ | \
/ | \
/ | \
1:10 1:20 1:30
| | |
| | |
:10 :20 :30
Açıklama:
1:vethA aygıtına bağlı kök qdisc ise, htbHiyerarşi Jetonu Kovası'nda olduğu gibi açık bir şekilde alınacaktır (bir cihazın varsayılan qdisc'i pfifoveya pfifo_fastişletim sistemine bağlı olarak). Bant genişliği yönetimi için özellikle uygundur. Bu düzeyde tanımlanan filtrelerle eşleşmeyen paketler 1:30sınıfa gider .
1:1htbcihazın tüm trafiğini 10 Mbit / s ile sınırlayan bir sınıf olacaktır .
1:10htbçıkış trafiğini 9 Mbit / s ile sınırlayan bir sınıf olacaktır (10 Mbit / s'nin% 90'ı).
1:20htbçıkış trafiğini 8 Mbit / s ile sınırlayan bir sınıf olacaktır (10 Mbit / s'nin% 80'i).
1:30htbtrafiği 10 Mbit / s ile sınırlayan bir sınıf olacaktır (yedek).
:10, :20, :30Hangi sfqStokastik Adil Queuing için qdisc. Başka bir deyişle, bu qdisk'ler akışlara dayalı iletim zamanlamasında adaleti sağlayacaktır.
Tüm bunlar aşağıdaki komutlarla ayarlanır:
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
İhtiyacımız olan son şey, hedef IP eşit B'ye 1:10sahip IP paketlerinin sınıfa ve hedef IP eşit C'ye sahip IP paketlerinin sınıfa gitmesi için filtreler eklemektir 1:20:
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
Şimdi fikri anladığınıza göre, tcB ve C'ye benzer kurallar eklemeniz gerekecek, böylece bu teçhizatlardan A'ya aktarımlar da şekillenecek.
Test yapmak
Şimdi test edelim. Bunun için ben şahsen oynamak için alışkınım iperf, sadece bir istemci veya sunucu olarak çalıştırılabilen ve her iki ana bilgisayar arasında mümkün olduğunca fazla trafik gönderecek tek bir ikili dosyadan oluşur.
A ve B arasında :
$ 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
9 Mbit / s bant genişliği sınırımızı alıyoruz .
A ve C arasında:
$ 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
8 Mbit / s bant genişliği sınırımızı alıyoruz .
A ve D arasında:
$ 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
Burada 10 Mbit / s hıza ulaşan sanal arayüze sahibiz .
Her çalışmanın ilk ölçümünün patlamasının htb, yeterli parametre ayarlanarak sınıflarda daha iyi ele alınabileceğini unutmayın .
Temizlemek
Ayırmak :
- Öncelik 1 filtre
1:: tc filter del dev vethA parent 1: prio 1 u32.
- Tüm üstünde filtreler
1:: tc filter del dev vethA parent 1:.
- Sınıf
1:20ve alt öğeleri: tc class del dev vethA parent 1:1 classid
1:20.
- Bütün ağacı:
tc qdisc del dev vethA.
Simülasyon setini temizlemek için:
# 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