Soru IPTABLES - Belirli bir gelen IP'nin limit oranı


Belirli bir hizmetin oranını sınırlamak istemiyorum. Hedeflerim, sadece gelen IP adresine göre oranı sınırlamaktır. Örneğin bir sözde kural kullanarak:

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

Gelen IP adreslerine göre IPTable kullanarak sınırı nasıl derecelendirebilirim?


101
2018-04-28 21:09


Menşei




Cevaplar:


Bu kararlar için çok sayıda paketin analiz edilmesi gereken bu tür çalışmalar için IPTable'lar yapılmamaktadır. IPTables kısmen cevap olsa!

Bunun gerçek cevabı Linux'un müthiş ve az kullanılan trafik kontrol tesisleri. Neler olup bittiğini bilmeden bununla uğraşmak, makineye ağ bağlantısını kaybetmenize neden olabilir! Uyarıldın!

Eth0'ın giden cihaz olduğunu varsaymak gerekirse, 'hızlı' sıraya göre çoğu trafiği çıkışa çıkaracak ve insanların belirli bir listesini 'yavaş' sıraya sokacak olan bir sınıf tabanlı trafik kontrol kuyruğu oluşturmanız gerekecektir.

Bunun güzel tarafı, bir overriding sınıfı bant genişliği istemedikçe yavaş kullanıcı için giden trafiğe izin verdiğiniz bir durum yaratabilirsiniz, ancak bu örnek bunu yapmaz (yavaş kullanıcılara her zaman 10kbps sağlayacaktır). Kuyruk sistemi böyle bir şeye benzeyecek:

                         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 yapacaktır .. bunu bir bütün betik 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 yapılacağını söylerken önemlidir.

Bu yapıldıktan sonra, belirli bir ölçütle eşleşen paketleri sınıflandırmak için bir iptables kuralı ayarlayabilirsiniz. Bu yavaş kuralı çok sayıda insanı bir araya getirmeyi planlıyorsanız, bir ipset kuralı daha uygundur (inanıyorum ki rhel6'da bulunmalıyım).

Yani, karşı 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ştur.

iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12

Bu, çekirdeğe, hedef IP'yi kaynak bağlantı noktasından setle eşleştirdiğinizde, onu trafik kontrolü ile kurduğunuz yavaş sıraya göre sınıflandırdığını bildirir.

Şimdi, sonunda 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
...

Bunu test edebilirsiniz "tc -s class show dev eth0" komutunu kullanarak çalışır ve orada paketleri yavaş sıraya yönlendiriliyor gösteren istatistikleri göreceksiniz.

Bunun tek gerçek dezavantajı, yeniden başlatmalardan kurtulduğunu gösteriyor. Yeniden başlatma sırasında ipsetlerin oluşturulmasını sağlayan herhangi bir init betiği olduğunu sanmıyorum (ve bunlar da oluşturulmalıdır) önce iptables kuralları) ve yeniden başlatıldığında trafik kontrol kurallarını sıfırlamak için init komutlarının bulunmadığından eminim. Rahatsız edilmediyse, rc.local dosyasında bir betiği çağırmaktan tüm şeyi yeniden oluşturabilirsiniz.


165
2018-04-28 23:35



Peki, sana yeterince teşekkür edemem. Bu çok açıklayıcı ve çok bilgilendirici. Daha sonra TC bilgisinin gerekli olacağını anladım ve o zamana bakmaya başladım. Tekrar teşekkürler! - James
Oh ve bağlantıyı kaybetmek için. VPS'mden ana makineye geçmeden önce konfigürasyonumun kapalı olduğundan emin oluyorum. Ayrıca, ETH0 üzerindeki özel ağa VPN erişimim var. Ben sadece ETH1 üzerinde çalışacağım, böylece teoride problemim olmayacak. Ama uyarı duyuldu! - James
Ne kadar çok öğretici okumuş olduğumu söyleyemem, ilk akla ilk gelen bu. - RC1140
Bir sidenote olarak, kontrol gruplarında tipik olarak daha uygun bir kaynak sınırlaması yapmak için daha uygun (yine, aynı zamanda mümkün ve de az kullanılan ve müthiş), cpu, bellek, IO ve ağ üzerinde merkezi bir 'politika deposunda uygulama sınırlarını tanımlayabilirsiniz. '. Ancak henüz bir cevap vermeyi bekleyen bir soru görmedim. - Matthew Ife
Hoşlanmıyorsan tc verebileceğin sözdizimi tcng Üreten biraz daha kullanıcı dostu dil ekleyen bir deneme tc emreder. Bunu kabuk betiğinde beğendim: echo '... multi line tcng configuration ...' | tcng | sh. - Mattias Wadman


Bir oran sınırlama kuralı almak ve -s geçin. -s geçiş, gelen IP'lerle eşleşir. Örneğin iptables -A INPUT -s 1.1.1.1 ve daha sonra bu kural için tercih ettiğiniz oran sınırlama yöntemiyle tamamlayın.


5
2018-04-28 21:12



Hızlı cevabınız için teşekkürler. Maalesef asıl problemim ikinci yarısı. Ben baktım - ve benim KB / s dayalı sınırlamak için izin veren herhangi bir şey görmedim - bana işaret edebilir herhangi bir yöne? - James
@James Sana geri dönecektim ama bir arkadaşının evine çıkmak zorunda kaldım. Sadece döndüm ve MIfe'nin oldukça iyi bir iş çıkardığını görüyorum. =) - Wesley