Her IP adresi için maksimum bağlantıyı ve iptables ile saniyede yeni bağlantıları sınırlayın


37

Bağlantı noktası 80'de httpd bulunan bir Ubuntu 12.04 sunucumuz var ve sınırlamak istiyoruz:

  • IP adresi başına httpd - 10 olan maksimum bağlantı
  • saniyede maksimum yeni bağlantı sayısı httpd - 150

Bunu iptables ile nasıl yapabiliriz?

Yanıtlar:


48
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j REJECT --reject-with tcp-reset  

Bu, 15'in üzerindeki bağlantıları bir kaynak IP'sinden reddeder.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT  

Bu 160'ta, saniyede 150 YENİ bağlantı (paket) sınırı uygulanmadan önce yeni bağlantılara (gerçekten paketler) izin verilir.


1
Yukarıdakiler sadece 80 numaralı limana değil, tüm limanlar üzerinde çalışacak şekilde ayarlanabilir mi?
EminezArtus

1
Bunun IP başına olduğuna emin misin?
LatinSuD

2
Bu kuralı tüm bağlantı noktalarına koymak için, --dport 80 komutunu kaldırmanız yeterlidir.
Dan Pritts

5
İkinci kural "yeni bağlantılar" üzerinde çalışmıyor. Mevcut ("KURULAN") bağlantıları açıkça etkiler. Yeni bağlantılar yapmak için şunu istersiniz: - YENİ. Bunun -m conntrack --ctstateyerine kullanmayı da düşünebilirsiniz -m state --state. Conntrack yeni ve gelişmiş durumdur.
Dan Pritts

2
2. kuralı NEWbağlantılara eklemek için yukarıdaki yorum - bunu yapma - INPUTzincirinizi etkin bir şekilde varsayılana çevirir accept!!!
Stuart Cardall

8

Iptables'ınızdaki aşağıdaki kuralları sorunuzdaki her iki gereksinimi de cevaplamasını istersiniz:

iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT

iptables -t filter -I INPUT -p tcp --dport 80 -m state \
  --state RELATED,ESTABLISHED -j ACCEPT

# Adjust "--connlimit-above NN" to limit the maximum connections per IP
#   that you need.
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
  --connlimit-above 10 --connlimit-mask 32 -j DROP

# Adjust "--connlimit-above NNN" to the maximum total connections you
#   want your web server to support
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
  --connlimit-above 150 -j DROP

-I kullandığımız için (OP isteğine göre) bunları ters sırayla yapmalıyız, bu yüzden aşağıdan yukarıya 'oku'.

Aynı zamanda --connlimit-mask NN'in 32'den 24'e değişmesini de düşünmeyi öneriyorum. Hizmetinizin nasıl kullanılabileceğini düşündüğünüze bağlı olarak, 22 veya 30 gibi herhangi bir diğer sınıfsız numarayı da kullanabilirsiniz.

Ayrıca istemci davranmasını istiyorum nasıl bağlı olarak, belki iki kural yukarıda yerine "-j DROP" nin "REDDET -j --reject-ile tcp-reset" kullanmak istiyorum, hatta sadece 150 bağlantıları max içinde kural.

Bağlantıyı reddederseniz, bağlantı noktası 80'i kullanan tarayıcı veya yazılım hemen "kullanılamaz" durumu gösterir, ancak DROP seçeneği, müşterinin siteyi kullanılabilir olmadığını bildirmeden önce birkaç kez beklemesine ve yeniden denemesine neden olur. Çevrimdışı bir sunucudan daha kötü bir bağlantı gibi davrandığından DROP'a kendimi yaslama eğilimindeyim.

Ayrıca, bağlantı sınırı hala denenirken 150 (veya 10) seviyesinin altına düşerse, o zaman sunucunuza geçer.

REJECT seçeneği sitenize daha az trafik çekmesine neden olur, çünkü DROP yeniden denemeye başladığında ek paketler göndermesine neden olur. Muhtemelen bütün bunlarla alakalı değil.

Öte yandan, 80 numaralı bağlantı noktanız bir kümenin parçasıysa, REJECT küme denetleyicisine kapalı olduğunu söyler ve yeniden deneme zaman aşımı süresi boyunca kendisine trafik göndermeyi durdurur.

İLGİLİ, KURULUŞ kuralı, varsayılan kuralınızın tüm trafiği engellemek olduğu varsayımı altındadır (iptables -t filter -P INPUT DROP). Bu sadece kabul edilen bağlantılara ait diğer paketleri kabul eder.

Ayrıca --syn, TCP bağlantısı kuran paketlere dikkat etmesini (veya saymasını) söyler.


Bu emirlerin önemsizliğini incelediğiniz için teşekkür ederiz.
txyoji

Bütün bir aralığı değil, yalnızca bu belirli IP adresini engellemek için bir bağlantı maskesi alabilir miyim?
Analog,

--Connlimit-mask 32 , tek bir adres sınırıdır. Yani, bir / 32 ağ maskesi gibi. Daha az olan herhangi bir şey, 24 gibi a / 24 ağ maskesi gibidir, alt 8 bit'i görmezden gelir.
Ian Macintosh

5

connlimitİstemci IP adresi (veya adres bloğu) başına bir sunucuya paralel TCP bağlantısı sayısını kısıtlamanıza izin veren modülleri kullanmanız gerekir .

/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
      --connlimit-above 10 -j DROP

Cevabınızı güncelledim, umarım hala tamamdır (neden "--syn" gereklidir?). + Ve "Saniyedeki maksimum bağlantı (port 80, tcp) - 150" ye ne dersiniz? Teşekkür ederim!
evachristine

--syn, kuralın yalnızca TCP paketlerine syn bayrağıyla baktığı anlamına gelir - bu, yeni bağlantılar anlamına gelir. -M state --state NEW ile kabaca aynı şeyi yapabilirsiniz, ancak bu muhtemelen daha hızlıdır.
Dan Pritts
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.