IP पते के प्रति अधिकतम कनेक्शन और iptables के साथ प्रति सेकंड नए कनेक्शन को सीमित करें


37

हमारे पास Ubuntu 12.04 सर्वर है जिसमें httpd 80 पोर्ट पर है और हम इसे सीमित करना चाहते हैं:

  • http से 10 तक प्रति आईपी पते का अधिकतम कनेक्शन
  • httpd से 150 तक प्रति सेकंड अधिकतम नए कनेक्शन

हम iptables के साथ यह कैसे कर सकते हैं?

जवाबों:


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

यह एक स्रोत आईपी से 15 से ऊपर के कनेक्शन को अस्वीकार कर देगा।

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

इसमें 150 नए कनेक्शन (पैकेट) प्रति सेकंड लागू होने से पहले 160 नए कनेक्शन (पैकेट वास्तव में) की अनुमति है।


1
क्या उपरोक्त सभी बंदरगाहों पर काम करने के लिए सेट अप किया जा सकता है, न कि केवल पोर्ट 80 पर?
एमिनेज़आर्टस

1
क्या आप सुनिश्चित हैं कि यह प्रति आईपी है?
लैटिनसुद

2
सभी बंदरगाहों के लिए इस नियम को सेट करने के लिए, बस --dport 80 को हटा दें।
Dan Pritts

5
दूसरा नियम "नए कनेक्शन" पर काम नहीं करता है। यह मौजूदा ("स्थापित") कनेक्शनों को स्पष्ट रूप से प्रभावित करता है। नए कनेक्शन करने के लिए, आप चाहेंगे - नया। आप इसके -m conntrack --ctstateस्थान पर उपयोग करने पर भी विचार कर सकते हैं -m state --state। कंवर्ट नया और बेहतर बनाम राज्य है।
दान प्रिट्ट्स

2
NEWकनेक्शन के लिए 2 नियम जोड़ने के लिए ऊपर टिप्पणी - ऐसा मत करो - यह प्रभावी रूप से आपकी INPUTश्रृंखला को डिफ़ॉल्ट रूप से बदल देता है accept!!!
स्टुअर्ट कार्डल

8

आप अपने प्रश्न में दोनों आवश्यकताओं का जवाब देने के लिए अपने iptables में निम्नलिखित नियम चाहते हैं:

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 (ओपी अनुरोध के अनुसार) हमें उन्हें उल्टे क्रम में करना है इसलिए उन्हें नीचे से ऊपर 'पढ़ें'।

मैं यह भी विचार करने का सुझाव देता हूं - 32 से 24 तक -Nnnnitit- मास्क NN परिवर्तन। यह एक पूर्ण श्रेणी-सी नेटवर्क (एक ही सीमा में अधिकतम 256 आईपी पते) को 10 कनेक्शनों तक सीमित कर देगा। आप किसी अन्य वर्गहीन संख्या जैसे 22 या 30 का उपयोग इस आधार पर भी कर सकते हैं कि आपको लगता है कि आपकी सेवा का उपयोग कैसे किया जा सकता है।

इसके अलावा, आप कैसे ग्राहक व्यवहार करने के लिए चाहते हैं पर निर्भर करता है, तो आप कर सकते हैं इसके बाद के संस्करण दो नियमों में "-j ड्रॉप" के बजाय का उपयोग करने के लिए "-j अस्वीकार --reject-साथ टीसीपी-रीसेट" या यहाँ तक कि केवल 150 कनेक्शन अधिकतम में चाहते हैं, राज करते हैं।

यदि आप कनेक्शन को कनेक्ट करते हैं तो पोर्ट 80 का उपयोग करने वाला ब्राउज़र या सॉफ़्टवेयर तुरंत "उपलब्ध नहीं" स्थिति दिखाएगा, लेकिन DROP विकल्प ग्राहक को साइट उपलब्ध नहीं होने से पहले रिपोर्ट करने से पहले कुछ समय इंतजार करने और पुन: प्रयास करने का कारण होगा। मैं स्वयं डीआरओपी की ओर झुकाव करता हूं क्योंकि यह एक ऑफ़लाइन सर्वर की तुलना में खराब कनेक्शन की तरह व्यवहार करता है।

इसके अलावा, यदि कनेक्शन सीमा 150 से नीचे (या 10) से कम हो जाती है, जबकि यह अभी भी पुन: प्रयास कर रहा है, तो यह अंत में आपके सर्वर से मिलेगा।

REJECT विकल्प से आपकी साइट पर कुछ हद तक ट्रैफ़िक कम हो जाएगा, क्योंकि DROP के कारण अतिरिक्त पैकेट भेजना होगा जबकि यह पुन: प्रयास करता है। शायद यह सब प्रासंगिक नहीं है।

यदि दूसरी तरफ आपका पोर्ट 80 ट्रैफ़िक क्लस्टर का हिस्सा है, तो REJECT क्लस्टर कंट्रोलर को बताएगा कि यह डाउन है और इसे रिट्रीट टाइमआउट की अवधि के लिए ट्रैफ़िक भेजना बंद करना है।

संबंधित, स्थापित नियम यह है कि इस धारणा के तहत कि आपका डिफ़ॉल्ट नियम सभी ट्रैफ़िक को रोकना है (iptables -t filter -P INPUT DROP)। यह सिर्फ स्वीकार किए गए कनेक्शन से संबंधित फ्यूचर पैकेट को स्वीकार करता है।

इसके अलावा - एसएसएन इसे टीसीपी कनेक्शन स्थापित करने वाले पैकेट पर ध्यान देना (या गिनना) बताता है।


इन आदेशों के minutia के माध्यम से चलने के लिए धन्यवाद।
txyoji

क्या मैं --connlimit-मास्क को केवल उस विशिष्ट IP पते को ब्लॉक कर सकता हूं और पूरी रेंज को नहीं?
एनालॉग

--Connlimit-मुखौटा 32 है एक ही पते सीमा। यानी, यह / 32 नेटमैस्क की तरह है। कुछ भी कम, जैसे 24/24 नेटमैस्क की तरह होता है, निचले 8 बिट्स को अनदेखा करता है।
इयान मैकिंटोश

5

आपको उन connlimitमॉड्यूल का उपयोग करने की आवश्यकता है जो आपको क्लाइंट आईपी पते (या एड्रेस ब्लॉक) पर सर्वर के समानांतर टीसीपी कनेक्शन की संख्या को प्रतिबंधित करने की अनुमति देता है।

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

मैंने आपके उत्तर को अपडेट किया, मुझे आशा है कि यह अभी भी ठीक है ("--syn" की आवश्यकता क्यों है?)। + और कैसे "प्रति सेकंड अधिकतम कनेक्शन (पोर्ट 80, टीसीपी) से 150" के बारे में? धन्यवाद!
इवाक्रिस्टाइन

- एसआईएन का मतलब है कि नियम केवल सिंबल फ्लैग के साथ टीसीपी पैकेट को देखता है - जिसका अर्थ है नए कनेक्शन। आप मोटे तौर पर एम राज्य के साथ ही नया कर सकते हैं, लेकिन यह शायद तेज है।
डेन प्रिट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.