IPTABLES - Belirli bir gelen IP’nin limit oranı


103

Belirli bir hizmetin oranını sınırlamak istemiyorum. Hedeflerim, yalnızca gelen IP adresine göre oranı sınırlamak. Örneğin sözde kural kullanma:

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'ları kullanarak sınırı nasıl değerlendirebilirim?

Yanıtlar:


165

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.


3
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 zamandan beri bunu araştırmaya başladım. Tekrar teşekkürler!
James,

Oh ve bağlantıyı kaybetme gelince. VPS sistemimden ana makineye geçmeden önce konfigürasyonun yapıldığından emin oluyorum. Ayrıca, ETH0'daki özel ağa VPN erişimim var. Sadece ETH1 üzerinde çalışacağım, bu yüzden teoride problemim olmayacak. Ancak uyarı duydum!
James,

2
Sana kaç kere benzer dersler okuduğumu söyleyemem, bu ilk mantıklı
olanıdır

5
Bir sidenote olarak, cpu, bellek, IO ve ağ üzerindeki uygulama başına limitleri merkezileştirilmiş bir “ilke deposunda” belirleyebildiğiniz için, kontrol gruplarında bunun gibi kaynak sınırlandırması yapmak daha uygun olur '. Ancak henüz böyle bir soruyu yanıtlamak için davet edildiğini görmedim.
Matthew Ife

2
Eğer tcsentaksı beğenmiyorsan, tcng'yetc komut üreten biraz daha kullanıcı dostu bir dil ekleyen bir dene . Ben kabuk script içindeki sevmeye kullandık: echo '... multi line tcng configuration ...' | tcng | sh.
Mattias Wadman

5

Hız sınırlayıcı bir kural almak ve -sanahtarı eklemek kadar basit . -sAnahtar gelen IP'leri ile eşleşir. Örneğin iptables -A INPUT -s 1.1.1.1ve daha sonra bu kural için tercih ettiğiniz oran sınırlama yöntemini tamamlayın.


Hızlı cevabınız için teşekkürler. Maalesef asıl sorunum ikinci yarısı. Sınırlı olarak baktım ve KB / s'ye göre sınırlandırmama izin veren hiçbir şey görmedim - bana yönlendirebileceğiniz herhangi bir yöne baktınız mı?
James,

1
@ James size geri dönecektim ama bir arkadaşımın evine gitmek zorunda kaldım. Daha yeni döndüm ve MIfe'nin oldukça iyi bir iş çıkardığını görüyorum. =)
Wesley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.