नेटफिल्टर के प्रदर्शन में सुधार, ipset का उपयोग करना

iptables - लिनक्स फ़ायरवॉल के लिए इंटरफ़ेस ( नेटफिल्टर )। बड़ी संख्या में iptables नियमों के साथ, लोड काफी अधिक हो सकता है और समस्याएं पैदा कर सकता है। इस लेख में मैं यह वर्णन करने की कोशिश करूंगा कि iptables के प्रदर्शन को क्या प्रभावित करता है और इसे कैसे सुधारना है।

भार का मुख्य कारण


के साथ शुरू करने के लिए: क्या नियमों की एक बड़ी संख्या के साथ लोड का कारण बनता है? इस तथ्य के कारण कि कर्नेल द्वारा संसाधित प्रत्येक नेटवर्क पैकेट को प्रत्येक श्रृंखला के लिए नियमों की पूरी सूची की तुलना में गुजरना पड़ता है। यहां एक आरेख है जो नेटफिल्टर श्रृंखलाओं को दर्शाता है और क्रम जिसमें पैकेट उनके माध्यम से गुजरता है:



आरेख दिखाता है कि एक विशेष पैकेट किस श्रृंखला से गुजरेगा और आप लोड का मूल्यांकन कर सकते हैं। चलो एक सरल नियम लेते हैं:

-A INPUT -s 10.1.1.1/32 -p tcp --dport 25 -j DROP

यह नियम फ़ायरवॉल को आईपी पते 10.1.1.1 से सभी पैकेटों को स्थानीय मशीन के पोर्ट 25 पर छोड़ने के लिए कहता है। मैं तालिका (-t) निर्दिष्ट नहीं करता हूं, इसलिए डिफ़ॉल्ट (-t फ़िल्टर) का उपयोग किया जाएगा, जिसकी हमें आवश्यकता है। यह स्पष्ट है कि DROP कार्रवाई हमेशा प्रदर्शन से दूर है। हालांकि, स्रोत आईपी पते की तुलना स्थानीय मशीन में प्रवेश करने वाले किसी भी पैकेट पर होगी। और अगर इस तरह के एक हजार नियम हैं?

क्या करें?


अब आइए विचार करें कि फ़ायरवॉल को कैसे तेज किया जाए। पहला उत्तर स्पष्ट है - नियमों की संख्या कम करना। लेकिन यह संभावना नहीं है कि वे रिकॉर्डिंग को गंभीरता से अनुकूलित करने में सक्षम होंगे, खासकर यदि वे मूल रूप से सही ढंग से बनाए गए थे। कहीं-कहीं, कई IP पतों के लिए नियमों के बजाय, आप प्रति सबनेट एक नियम लिख सकते हैं। कहीं-कहीं, कई पोर्ट के नियमों के बजाय, आप -m multiport --dports और --dports / --dports --sports a,b,c (a, b, c पोर्ट नंबर हैं) का उपयोग कर सकते हैं। और इसी तरह।

शाखाएं नियम, अतिरिक्त श्रृंखलाएं


और एक और दूसरा विकल्प है - नियम शाखाओं का उपयोग। इसका सार यह है कि एक ही प्रकार के नियमों को एक अलग श्रृंखला में वर्गीकृत किया गया है, और मुख्य श्रृंखला में एक नियम बना हुआ है जो पैकेट के कुछ सामान्य विशेषता के आधार पर पैकेट को एक अलग श्रृंखला में पुनर्निर्देशित करता है। मैं एक उदाहरण दूंगा। तीन नियम हैं:

-A INPUT -s 10.1.1.1/32 -p icmp -j ACCEPT
-A INPUT -s 10.1.1.2/32 -p icmp -j ACCEPT
-A INPUT -s 10.1.1.3/32 -p icmp -j ACCEPT


इन नियमों को क्या एकजुट करता है? एक ही प्रोटोकॉल icmp है। इस आधार पर और समूह के नियमों के बारे में लेख। सामान्य तौर पर, इस मामले में यह ipset का उपयोग करने के लिए अधिक कुशल है, लेकिन बाद में उस पर अधिक। समूह के लिए, आपको एक नई श्रृंखला बनाने की आवश्यकता है, और फिर एक नियम बनाएं जो इस श्रृंखला को पैकेट भेजेगा।
श्रृंखला PROT_ICMP बनाएँ:

iptables -N PROT_ICMP

इस श्रृंखला में नियमों को परिभाषित करें:

-A PROT_ICMP -s 10.1.1.1/32 -j ACCEPT
-A PROT_ICMP -s 10.1.1.2/32 -j ACCEPT
-A PROT_ICMP -s 10.1.1.3/32 -j ACCEPT


जैसा कि आप देख सकते हैं, हम अब इस श्रृंखला में प्रोटोकॉल (-p) की जांच नहीं करते हैं, क्योंकि हम इस श्रृंखला में केवल ICMP पैकेट भेजेंगे। अंत में, इस श्रृंखला के सभी ICMP पैकेट भेजें:

-A INPUT -p icmp -g PROT_ICMP

अब आने वाला पैकेट, अगर यह ICMP नहीं है, तो तीन के बजाय केवल एक नियम से गुजरेगा।

ipset


अब मान लें कि निम्नलिखित स्थिति:

-A INPUT -s 10.1.1.1/32 -j DROP
-A INPUT -s 10.1.1.2/32 -j DROP
-A INPUT -s 10.1.1.3/32 -j DROP


एक ही प्रकार के कई नियम, लेकिन उन्हें समूह बनाना या एक अतिरिक्त श्रृंखला बनाना संभव नहीं है। ऐसे मामलों में, जब बड़ी संख्या में आईपी पते और / या बंदरगाहों की जांच करना आवश्यक होता है, तो ipset बचाव में आता है। ipset एक ip_set कर्नेल मॉड्यूल है , कई सहायक पुस्तकालय, और पैरामीटर सेट करने के लिए ipset उपयोगिता। निश्चित रूप से आपके वितरण के भंडार में हैं, इसलिए स्थापना के साथ कोई समस्या नहीं होनी चाहिए।
निम्नानुसार उपयोग किया जाता है:
* एक सूची बनाई गई है:

ipset -N dropips iphash
dropips - सूची का नाम, iphash - सूची प्रकार। आप मैन ipset में सूचियों के प्रकार देख सकते हैं, वे हर स्वाद के लिए हैं - आईपी-एड्रेस, सबनेट, पोर्ट, मैक-एड्रेस के साथ काम करने के लिए। IPhash का उपयोग IP पतों को संग्रहीत करने के लिए किया जाता है, हैशिंग का उपयोग डुप्लिकेट IP पतों को सूची में जोड़े जाने से रोकता है।
* आईपी पते को सूची में जोड़ा गया है:

ipset -A dropips 10.1.1.1

* सूची का उपयोग करने के लिए एक नियम बनाया गया है:

iptables -A INPUT -m set --set dropips src -j DROP
-m set ipset मॉड्यूल के उपयोग को इंगित करता है, --set dropips आईपी ​​पतों की एक सूची को इंगित करता है, src इंगित करता है कि केवल आईपी स्रोत को --set dropips करने की आवश्यकता --set dropips । इस प्रकार, ड्रॉप्स सूची में निर्दिष्ट आईपी पते के सभी पैकेटों को छोड़ दिया जाएगा।

लेख में मैंने कर्नेल के नेटवर्क मापदंडों के ट्यूनिंग का वर्णन नहीं किया है, लेकिन फ़ायरवॉल नियमों के तर्कसंगत संगठन पर ध्यान केंद्रित किया है। आप नेटवर्क पर ट्यूनिंग के बारे में बहुत सारी जानकारी प्राप्त कर सकते हैं, ये विभिन्न नेट हैं। * मेम *, बड़ी संख्या में कनेक्शन और कॉनट्रैक का उपयोग करने के मामले में - net.netfilter.nf_conntrack_max, net.netfilter.nf_conntrack * timeout, आदि।

आपका ध्यान देने के लिए धन्यवाद।
टाइपो को इंगित करने के लिए धन्यवाद ivlis

Source: https://habr.com/ru/post/In108691/


All Articles