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?
Bağlantı noktası 80'de httpd bulunan bir Ubuntu 12.04 sunucumuz var ve sınırlamak istiyoruz:
Bunu iptables ile nasıl yapabiliriz?
Yanıtlar:
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.
-m conntrack --ctstate
yerine kullanmayı da düşünebilirsiniz -m state --state
. Conntrack yeni ve gelişmiş durumdur.
NEW
bağlantılara eklemek için yukarıdaki yorum - bunu yapma - INPUT
zincirinizi etkin bir şekilde varsayılana çevirir accept
!!!
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.
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