IPTable'lar, bu kararları almak için çok ve çok sayıda paketin analiz edilmesi gereken işler için yapılmaz. IPTables kısmen olsa cevap!
Bunun asıl cevabı Linux'taki müthiş ve kullanılmayan trafik kontrol tesisleridir. Neler olup bittiğini bilmeden bununla dalga geçilmenin makineyle ağ bağlantısını kaybetmenize neden olabileceğini unutmayın! Uyarıldın!
Eth0 varsayalım, varsayılan olarak 'hızlı' sırasındaki çoğu trafiği çıkaran ve belirli bir kişi listesini 'yavaş' sırasına koyacak sınıf temelli bir trafik kontrol kuyruğu oluşturmak için ihtiyacınız olacak.
Bunun güzelliği, geçersiz bir sınıf bant genişliği istemediği sürece yavaş kullanıcı için çok fazla giden trafiğe izin verebileceğiniz bir durum oluşturabilirsiniz, ancak bu örnek bunu yapmaz (yavaş kullanıcılara her zaman 10kbps sağlayacaktır). Kuyruk sistemi şöyle görünecek:
Inbound traffic
+
|
|
v
+------------------+
| Class 1:1 |
|------------------|
| Root (all flows)|
| 100mbit |
+-----+-----+------+
| |
| |
| |
| |
| |
+----------+ | | +----------+
| 1:11 +-----+ +-----+ 1:12 |
|----------| |----------|
| Default | | Slow |
|100mb-80kb| | 80kb |
+----------+ +----------+
Bunu yapmak için, önce çekirdekte kuyruk disiplini kurmanız gerekir. Aşağıdakiler sizin için bunu yapacak .. Bunu bir bütün script olarak çalıştırmalısınız.
#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit
tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo
"Varsayılan 11", çekirdeğe sınıflandırılmamış trafikle ne yapması gerektiğini söylediğinden önemlidir.
Bu yapıldıktan sonra, belirli bir kritere uyan paketleri sınıflandırmak için iptables kuralını ayarlayabilirsiniz. Bu yavaş kurala çok ve çok sayıda insan koymayı planlıyorsanız, ipset kuralı daha uygundur (rhel6'da mevcut olması gerektiğine inanıyorum).
Yani, eşleşmeyi yapmak için bir ipset veritabanı oluşturun ...
ipset create slowips hash:ip,port
Sonra eşleşmeyi yapmak için iptables kuralını oluşturun ..
iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12
Bu, çekirdeğe, hedef IP'yi setteki kaynak port ile eşleştirirseniz, onu trafik kontrolüyle ayarladığınız yavaş kuyruğa sınıflandırmanız gerektiğini söyler.
Şimdi, nihayet bir IP'yi yavaşlatmak istediğinizde ipi aşağıdaki gibi sete eklemek için ipset komutunu kullanabilirsiniz:
ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...
"Tc-s class show dev eth0" komutunu kullanarak çalışıp çalışmadığını test edebilirsiniz ve burada paketleri yavaş kuyruğa yönlendirildiğini gösteren istatistikler göreceksiniz.
Bunun tek dezavantajı sadece yeniden başlatmalar hayatta kalmak yapmak olduğuna dikkat edin. Yeniden başlatmada dökümden ipset oluşturmak için kullanılabilen herhangi bir init betiği olduğunu sanmıyorum (ve ayrıca iptables kurallarından önce de oluşturulmaları gerekir ) ve yeniden başlatma sırasında trafik kontrol kurallarını sıfırlamak için init betiği olmadığından eminim. Rahatsız etmediyseniz, her şeyi rc.local'da bir betiği çağırmakla baştan yaratabilirsiniz.