अपनी 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