Iptables: कॉनट्रैक और मालिक के साथ आउटगोइंग ट्रैफ़िक का मिलान। अजीब बूंदों के साथ काम करता है


11

अपनी iptables स्क्रिप्ट में मैं यथासंभव बारीक से बारीक नियमों को लिखने के साथ प्रयोग कर रहा हूं। मैं सीमित करता हूं कि उपयोगकर्ताओं को कौन सी सेवाओं का उपयोग करने की अनुमति है, आंशिक रूप से सुरक्षा के लिए और आंशिक रूप से सीखने के अभ्यास के रूप में।

डेबियन 6.0.6 पर iptables v1.4.16.2 का उपयोग कर 3.6.2 कर्नेल चला रहे हैं।

हालांकि मैंने एक ऐसा मुद्दा मारा है, जो मुझे अभी तक समझ में नहीं आया है।

सभी उपयोगकर्ताओं के लिए आउटगोइंग पोर्ट

यह पूरी तरह से ठीक काम करता है। मेरे पास कोई सामान्य राज्य ट्रैकिंग नियम नहीं हैं।

## आउटगोइंग पोर्ट 81
$ IPTABLES-OUTPUT -p tcp --dport 81 -m conntrack --ctstate NEW, ESTABLISHED -j ACCEPT
$ IPTABLES-A INPUT -p tcp --sport 81 -s $ MYIP -m कॉनट्रैक --ctstate ESTABLISHED -j ACCEPT

उपयोगकर्ता मिलान के साथ आउटगोइंग पोर्ट

## यूजरकाउंट के लिए आउटगोइंग पोर्ट 80
US
$ IPTABLES-A INPUT -p tcp --sport 80 --dport 1024: 65535 -d $ MYIP -m कॉनट्रैक --ctstate ESTABLISHED -j ACCEPT

यह केवल खाते के लिए "useraccount" पोर्ट 80 को अनुमति देता है, लेकिन टीसीपी ट्रैफिक के लिए इस तरह के नियमों में समस्याएं हैं।

## डिफ़ॉल्ट आउटगोइंग लॉग + ब्लॉक नियम
$ IPTABLES-OUTPUT -j लॉग - लॉग-प्रीफ़िक्स "BAD OUTGOING" --log-ip-options --log-tcp-options --log-uid
$ IPTABLES-OUTPUT -j DROP

समस्या

ऊपर काम करता है, उपयोगकर्ता "useraccount" फ़ाइलों को पूरी तरह से ठीक मिल सकता है। सिस्टम पर कोई भी अन्य उपयोगकर्ता आउटगोइंग कनेक्शन को पोर्ट 80 पर नहीं कर सकता है।

useraccount @ होस्ट: $ wget http://cachefly.cachefly.net/10mb.test

लेकिन ऊपर wget x7 मेरे syslog में प्रविष्टियों को छोड़ दिया:

Oct 18 02:00:35 xxxx कर्नेल: BUT OUTGOING IN = OUT = eth0 SRC = xx.xx.xx.xx DST = 205.234.175 LEN = 40 TOS = 0x00 PRTR = 0x00 TTL = 64 ID = 12170 DF PROTO = TCP = SPT = 37792 DPT = 80 SEQ = 164520678 ACK = 3997126942 WINDOW = 979 RES = 0x00 ACK URGP = 0  

मुझे यूडीपी ट्रैफिक के समान नियमों के लिए ये ड्रॉप्स नहीं मिले हैं। मेरे पास पहले से ही ऐसे नियम हैं जो उपयोगकर्ता DNS अनुरोधों को सीमित कर सकते हैं।

बाहर जाने वाले ACK पैकेट रूट खाते (URGP = 0) से आ रहे हैं जो मुझे समझ नहीं आ रहे हैं। यहां तक ​​कि जब मैं रूट के लिए useraccount स्वैप करता हूं।

मेरा मानना ​​है कि ACK पैकेट को नए के रूप में वर्गीकृत किया गया है क्योंकि 3 मार्ग के 3 चरण के बाद कनेक्शन ट्रैक करना शुरू कर देता है, लेकिन क्यों गिराए जा रहे हैं?

क्या इन बूंदों को सुरक्षित रूप से अनदेखा किया जा सकता है?

संपादित करें

इसलिए मैं अक्सर इन नियमों को देखता हूं, जो मेरे लिए ठीक काम करते हैं:

$ IPTABLES-OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m राज्य --state NEW, ESTABLISHED -j ACCEPT
$ IPTABLES-A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m राज्य --स्टेट इस्टैब्लिशड -j ACCEPT

मैंने "-एम स्टेट --स्टेट" की अदला-बदली की "-एम कॉनट्रैक - आर्कस्टेट" के रूप में स्टेट मैच जाहिर तौर पर अप्रचलित है।

क्या जेनेरिक स्टेट ट्रैकिंग नियमों का पालन करना सबसे अच्छा अभ्यास है? क्या उपरोक्त नियमों को सही नहीं माना जाता है?

आउटगोइंग यूजर्स कनेक्शन पर कड़े नियंत्रण के लिए कुछ इस तरह से बेहतर होगा?

$ IPTABLES -ए INPUT -m कॉनट्रैक - आर्कटिक एस्टाब्लिश -j ACCEPT
$ IPTABLES-OUTPUT -m कॉनट्रैक --ctstate ESTABLISHED -j ACCEPT

$ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m कॉनट्रैक - नई स्थित -m स्वामी - उपयोगकर्ता-स्वामी useraccount -j ACCEPT

$ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m कॉनट्रैक - नई आई-एम मालिक --uid-owner otheraccount -j ACCEPT

यदि यह होस्ट लैन से ट्रैफ़िक को रूट कर रहा है, तो क्या आप कृपया फ़ॉरवर्ड चेन और नेट टेबल सहित सभी नियमों को पोस्ट कर सकते हैं।
सर्ज

यह होस्ट कोई रूटिंग नहीं कर रहा है, इन नियमों के साथ मशीन से ट्रैफ़िक की उत्पत्ति होती है। मैंने केवल विशिष्ट आउटगोइंग ट्रैफ़िक के लिए प्रासंगिक नियमों को पोस्ट किया है।
आर्क

जवाबों:


16

एक लंबी कहानी को छोटा करने के लिए, उस ACK को भेजा गया था जब सॉकेट किसी के पास नहीं था। पैकेट की अनुमति के बजाय जो उपयोगकर्ता xसे संबंधित सॉकेट से संबंधित है, पैकेट को उस कनेक्शन से संबंधित है जो उपयोगकर्ता से सॉकेट द्वारा शुरू किया गया था x

लम्बी कहानी।

समस्या को समझने के लिए, यह समझने में मदद करता है कि कैसे wgetऔर HTTP सामान्य रूप से काम करते हैं।

में

wget http://cachefly.cachefly.net/10mb.test

wgetएक टीसीपी कनेक्शन स्थापित करता है cachefly.cachefly.net, और एक बार स्थापित HTTP प्रोटोकॉल में एक अनुरोध भेजता है जो कहता है: "कृपया /10mb.test( GET /10mb.test HTTP/1.1और) की सामग्री मुझे भेजें ( वैसे, क्या आप कनेक्शन पूरा होने के बाद कृपया बंद नहीं कर सकते Connection: Keep-alive) ( )। ऐसा इसलिए होता है क्योंकि यदि सर्वर उसी IP पते पर URL के लिए पुनर्निर्देशन का जवाब देता है, तो वह कनेक्शन का पुन: उपयोग कर सकता है।

अब सर्वर या तो उत्तर दे सकता है, "यहां आपके द्वारा अनुरोधित डेटा आता है, सावधान रहें यह 10 एमबी बड़ा है ( Content-Length: 10485760), और हाँ ठीक है, मैं कनेक्शन खुला छोड़ दूंगा"। या अगर यह डेटा के आकार को नहीं जानता है, "यहां डेटा है, तो माफ करना मैं कनेक्शन को खुला नहीं छोड़ सकता लेकिन मैं बताऊंगा कि आप कनेक्शन के मेरे अंत को बंद करके डेटा डाउनलोड करना कब बंद कर सकते हैं"।

उपरोक्त URL में, हम पहले मामले में हैं।

तो, जैसे ही wgetप्रतिक्रिया के लिए हेडर प्राप्त किया है, यह जानता है कि इसका काम एक बार किया जाता है जब उसने 10MB डेटा डाउनलोड किया हो।

मूल रूप से, wget10MB तक डेटा प्राप्त होता है और बाहर निकल जाता है। लेकिन उस बिंदु पर, और भी बहुत कुछ किया जाना है। सर्वर के बारे में क्या? यह कहा गया है कि कनेक्शन को खुला छोड़ दें।

बाहर निकलने से पहले, सॉकेट के लिए फ़ाइल डिस्क्रिप्टर को wgetबंद कर देता है ( closeसिस्टम कॉल)। पर, closeसिस्टम, सर्वर द्वारा भेजे गए डेटा को स्वीकार करते हुए समाप्त कर देता है और FINकहता है: "मैं कोई और डेटा नहीं भेजूंगा"। उस बिंदु पर closeलौटता है और wgetबाहर निकलता है। अब टीसीपी कनेक्शन से जुड़ा कोई सॉकेट नहीं है (कम से कम किसी भी उपयोगकर्ता के स्वामित्व में नहीं है)। हालाँकि यह अभी समाप्त नहीं हुआ है। इसे प्राप्त करने पर FIN, क्लाइंट से अगला अनुरोध पढ़ने पर HTTP सर्वर एंड-ऑफ-फ़ाइल देखता है । HTTP में, जिसका अर्थ है "अधिक अनुरोध नहीं, मैं अपना अंत बंद कर दूंगा"। तो यह अपने फिन को भी भेजता है, यह कहने के लिए, "मैं कुछ भी नहीं भेज रहा हूं, वह कनेक्शन दूर जा रहा है"।

उस फिन को प्राप्त करने पर, ग्राहक एक "ACK" भेजता है। लेकिन, उस बिंदु पर, wgetलंबे समय से चला गया है, ताकि एसीके किसी भी उपयोगकर्ता से न हो। यही कारण है कि यह आपके फ़ायरवॉल द्वारा अवरुद्ध है। क्योंकि सर्वर ACK को प्राप्त नहीं करता है, यह तब तक फिन को बार-बार भेजने जा रहा है, जब तक कि यह छोड़ नहीं देता है और आपको अधिक गिरा हुआ ACK दिखाई देगा। इसका मतलब यह भी है कि उन ACK को छोड़ने से, आपको सर्वर के संसाधनों का उपयोग करने में अनावश्यक रूप से (जो कि LAST-ACK राज्य में एक सॉकेट को बनाए रखने की आवश्यकता है) काफी समय के लिए उपयोग किया जाता है।

व्यवहार अलग होता अगर क्लाइंट ने "की-लाइव" का अनुरोध नहीं किया होता या सर्वर ने "की-लाइव" के साथ जवाब नहीं दिया होता।

जैसा कि पहले ही उल्लेख किया गया है, यदि आप कनेक्शन ट्रैकर का उपयोग कर रहे हैं, तो आप जो करना चाहते हैं, वह प्रत्येक पैकेट को इस्टैब्लिश्ड और रिलेटेड स्टेट्स के माध्यम से और केवल NEWपैकेट के बारे में चिंता करने दें ।

यदि आप NEWउपयोगकर्ता से पैकेट की अनुमति देते हैं, xलेकिन उपयोगकर्ता से पैकेट नहीं लेते हैं y, तो उपयोगकर्ता द्वारा स्थापित कनेक्शन के लिए अन्य पैकेट xसे गुजरना होगा, और क्योंकि उपयोगकर्ता द्वारा कनेक्शन स्थापित नहीं किया जा सकता है y(क्योंकि हम NEWपैकेट को अवरुद्ध कर रहे हैं जो कनेक्शन स्थापित करेगा), उपयोगकर्ता yकनेक्शन के लिए कोई पैकेट नहीं होगा ।


3

यह केवल खाते के लिए "useraccount" पोर्ट 80 की अनुमति देता है

- ठीक है, कम से कम आपके द्वारा दिखाए गए नियम वास्तव में इसका मतलब नहीं है।

सलाह के लिए एक कमरा भी है - उपयोगकर्ता को एस्टेब्लिश्ड धाराओं पर चेकिंग न करें, बस उस नए पर चेकिंग करें। मुझे आने वाले ESTABLISHED की जाँच करते समय स्रोत पोर्ट की जाँच करने में एक बिंदु भी दिखाई नहीं देता है, यह क्या अंतर है कि यह कौन सा पोर्ट था, यह पहले से ही ESTABLISHED स्थिति में है जो कि कॉनट्रैक के PoV से है। फ़ायरवॉल जितना संभव हो उतना सरल लेकिन अभी तक कुशल होना चाहिए, इसलिए ओक्टम का रेजर दृष्टिकोण सबसे अच्छा है।


1
सलाह के लिए धन्यवाद। आमतौर पर मैं सभी सादगी के लिए हूं लेकिन यह इस विशेष अभ्यास की बात नहीं है।
आर्कएक्स

1
@arX, यह अभ्यास बहुत जटिल और असंगत होने के कारण विफल हो सकता है - IOW, जो व्यवहार आप देख रहे हैं वह नेटफिल्टर इंटर्नल (बग, quirks) के कारण नहीं हो सकता है, लेकिन जिस तरह से आप इसका उपयोग करते हैं। पहले नियम को सरल बनाने का प्रयास करें…
11
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.