2008-09-20 38 views
36

मुझे मौजूदा नियमों के साथ-साथ नियमों को आसानी से जोड़ने और हटाने में सक्षम होने की आवश्यकता है। मुझे ऐसा करने के लिए कोई एपीआई नहीं मिला है। क्या ऐसा कुछ है जो मुझे याद आ रहा है?मैं फ्लाई पर iptables नियमों को प्रोग्रामेटिक रूप से प्रबंधित कैसे कर सकता हूं?

मैं समाधान के लिए निकटतम हूं iptables-save | iptables-xml का उपयोग कर क्वेरीिंग और मैन्युअल रूप से नियमों को जोड़ने/हटाने के लिए iptables कमांड को कॉल करने के लिए उपयोग कर रहा है। मैंने जो एक और समाधान माना है, वह पूरे नियम को अपने एप्लिकेशन के डेटाबेस से बाहर कर रहा है और पूरी श्रृंखला को फ्लश कर रहा है, फिर इसे फिर से लागू कर रहा है। लेकिन मैं इससे बचना चाहता हूं क्योंकि मैं किसी भी पैकेट को नहीं छोड़ना चाहता - जब तक परमाणु रूप से ऐसा करने का कोई तरीका न हो। मैं सोच रहा हूं कि कोई बेहतर तरीका है या नहीं।

सी में एक एपीआई बहुत अच्छा होगा; हालांकि, जैसा कि मैं इसे स्टैंड-अलोन सूड प्रोग्राम में बनाने की योजना बना रहा हूं, पुस्तकालय जो किसी भी भाषा में ऐसा करते हैं, ठीक भी हैं।

+0

स्पष्ट रूप से एक्सएमएल से iptables में जाना संभव है- 'xsltproc iptables.xslt my-iptables.xml को पुनर्स्थापित करें। iptables-restore'। 'Iptables-xml' का मैनपेज देखें। – CMCDragonkai

उत्तर

3

जानबूझकर इन नियमों का प्रबंधन करने के लिए कोई एपीआई नहीं है। आपको ऐसा नहीं करना है। या कुछ और।

  • "हाल का" मैच या आईपी सेट मिलान की तरह कुछ का उपयोग करना:

    आप नियमों जो पर्याप्त रूप से गतिशील आप को क्रियान्वित/sbin/iptables के प्रदर्शन के बारे में परवाह कर रहे हैं की जरूरत है, वहाँ यह करने के लिए अन्य तरीके हैं , आप नियम सेट को बदले बिना काले/सफेद सूचियों से आईपी पते जोड़/निकाल सकते हैं।

  • आप NFQUEUE
+4

यह मुझे मूर्खतापूर्ण लगता है कि इसके लिए कोई एपीआई नहीं है। मुझे वास्तव में इस तरह के प्रदर्शन की परवाह नहीं है, लेकिन आईपीटीबल्स को कॉल करना चीजों को करने का एक बेहद हैकी तरीका लगता है। – Ycros

+0

हम्म, मैं ipsets का उपयोग कर सकता हूं - और एक प्रदर्शन परिप्रेक्ष्य से यह वास्तव में एक अच्छा विचार है। दुर्भाग्य से मुझे अपना कर्नेल रोल करना होगा, और यह संभव नहीं है क्योंकि इस सॉफ़्टवेयर को चलाने वाले कुछ स्थानों पर वीएम पर है जहां मैं आसानी से कर्नेल से गड़बड़ नहीं कर सकता। और वे अभी भी एक अच्छा एपीआई प्रदान नहीं करते हैं। – Ycros

+0

ipt_recent एक मानक iptables मिलान लक्ष्य है जो आपको नियमों को बदलने के बिना/proc में फ़ाइल में लिखकर एक सेट से आईपी पते को गतिशील रूप से जोड़ने/निकालने की अनुमति देता है। दूसरी ओर, यह आईपी के बड़े सेट के लिए नहीं है और लगता है कि एक निश्चित अधिकतम सीमा है। – MarkR

0

MarkR के अधिकार का उपयोग कर फ़िल्टर करने के लिए यूज़रस्पेस में पैकेट पारित कर सकते हैं, तो आप ऐसा करने के लिए नहीं करना पड़ेगा। स्क्रिप्ट से iptables को कॉल करने या iptables कॉन्फ़िगरेशन लिखने और इसे 'पुनर्स्थापित' करने का सबसे आसान तरीका है।

फिर भी, यदि आप चाहते हैं, iptables के स्रोत को पढ़ें। iptables साझा वस्तुओं के रूप में मैचों और तालिकाओं का उपयोग करता है। आप स्रोत या उनका उपयोग कर सकते हैं।

लिनक्स नेटफिल्टर में कुछ/usr/include/netfilter * के अंतर्गत फ़ाइलें शामिल हैं। ये कुछ हद तक निम्न स्तर के कार्य हैं। यह iptables का उपयोग करता है। यह एपीआई के पास है क्योंकि कोई iptables के बिना प्राप्त कर सकता है।

लेकिन यह एपीआई 'गन्दा' है। ध्यान रखें कि इसे केवल iptables द्वारा उपयोग करने के लिए डिज़ाइन किया गया था। यह बहुत अच्छी तरह से प्रलेखित नहीं है, आप बहुत विशिष्ट समस्याओं को मार सकते हैं, एपीआई बिना किसी चेतावनी के काफी तेज़ी से बदल सकता है, इसलिए एक अपग्रेड आपके कोड को तोड़ देगा, आदि

+2

मैं स्वीकार कर सकता हूं कि आंतरिक एपीआई का उपयोग करना बुरा है, लेकिन यह इतना बुरा क्यों है कि वे जानबूझकर सार्वजनिक एपीआई शामिल नहीं करेंगे? अगर मैं एक श्रृंखला की बहाली कर सकता हूं तो मैं पुनर्स्थापना करने के साथ जा सकता हूं - मुझे कुछ परीक्षण करना होगा। – Ycros

+0

हां, आप एक श्रृंखला को पुनर्स्थापित कर सकते हैं। :-) –

+0

उत्तर में, जवाब में। – terminus

4

जहां तक ​​मैं समझता हूं (हालांकि कोई संदर्भ उल्लेख नहीं करता है यह), iptables-restore परमाणु है। अंत में, COMMIT लाइन पढ़ी जाती है, iptablesiptc_commitlibiptc (जो एक आंतरिक इंटरफ़ेस में उपयोग नहीं किया जाता है) में कॉल करता है, जो आपके नए नियमों के साथ setsockopt(SO_SET_REPLACE) पर कॉल करता है।

जैसा कि आप प्राप्त कर सकते हैं परमाणु के बारे में लगता है: एक कर्नेल कॉल के साथ। हालांकि, इस पर विवाद के लिए अधिक जानकार पार्टियों को आमंत्रित किया जाता है। :-)

संपादित करें: मैं पुष्टि कर सकता हूं कि आपका विवरण सही है। iptables-restore कर्नेल में परमाणु संचालन के रूप में किया जाता है।

और भी विशिष्ट ऑपरेशन "केवल" प्रति CPU आधार पर परमाणु है। चूंकि हम प्रति सीपीयू पूरे नियमसेट ब्लॉब को स्टोर करते हैं (कैश ऑप्टिमाइज़ेशन के कारण)।

16

netfilter FAQ से:

जवाब दुर्भाग्य है: नहीं

अब आप सोच सकते हैं 'लेकिन क्या libiptc के बारे में?'। जैसा कि मेलिंगलिस्ट पर कई बार बताया गया है, libiptc कभी सार्वजनिक इंटरफ़ेस के रूप में उपयोग करने के लिए नहीं था। हम एक स्थिर इंटरफेस की गारंटी नहीं देते हैं, और इसे लिनक्स पैकेट फ़िल्टरिंग के अगले अवतार में हटाने की योजना है। libiptc वैसे भी काफी कम परत का उपयोग किया जा सकता है वैसे भी।

हम अच्छी तरह से जानते हैं कि ऐसी एपीआई के लिए मूलभूत कमी है, और हम उस स्थिति में सुधार करने के लिए काम कर रहे हैं। तब तक, या तो सिस्टम() का उपयोग करने या iptables-restore के stdin में एक पाइप खोलने की अनुशंसा की जाती है। उत्तरार्द्ध आपको बेहतर प्रदर्शन प्रदान करेगा।

+0

मुझे आश्चर्य है कि एफएक्यू परमाणुता के मुद्दे को क्यों संबोधित नहीं किया जाता है। यह होना चाहिए; मैं आईपीटीबल्स के कार्यान्वयन को देखने की परेशानी में गया हूं- यह सुनिश्चित करने के लिए कि यह परमाणु है, पुनर्स्थापित करें। ओपी के लिए यह महत्वपूर्ण है, और मेरे पास एक परियोजना है जिसके लिए भी इसकी आवश्यकता है। –

+1

यह नेटफिल्टर मेलिंग सूची पोस्ट कहता है iptables-restore परमाणु है: http://www.mail-archive.com/[email protected]/msg00456।एचटीएमएल –

+0

बहुत बहादुर के लिए जो अभी भी ऐसा करना चाहते हैं, यहां कुछ जानकारी है: http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-4.html#ss4.2 – Roman

12

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

हालांकि, मुझे यह इंगित करना चाहिए कि एक ऐसा उपकरण है जिसका आप उपयोग कर सकते हैं जो iptables को अधिक आसान बनाएगा। सबसे गतिशील rulesets वास्तव में यही नियम इस तरह के रूप में कई बार दोहराया जाता है:

iptables -A INPUT -s 1.1.1.1 -p tcp -m --dport 22 -j ACCEPT 
iptables -A INPUT -s 2.2.2.0/24 -p tcp -m --dport 22 -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT 

(, कहते हैं के लिए उपयोगी बंदरगाह दस्तक) उन नियमों हर बार जब आप क्या बंदरगाहों बंदरगाह 22 तक पहुँच सकते हैं परिवर्तित करना चाहते हैं की जगह के बजाय, आप कर सकते हैं ipsets का उपयोग करें। उदाहरण:

ipset -N ssh_allowed nethash 
iptables -A ssh_allowed -m set --set ssh_allowed src -p tcp -m --dport 22 -j ACCEPT 
ipset -A ssh_allowed 1.1.1.1 
ipset -A ssh_allowed 2.2.2.0/24 

सेट आईपी पते, नेटवर्क, बंदरगाहों, मैक पते, और उनके रिकॉर्ड पर टाइमआउट रख सकते हैं। (कभी सिर्फ एक घंटे के लिए कुछ जोड़ना चाहता था?)।

एक सेट को दूसरे के साथ स्वैप करने का एक परमाणु तरीका भी है, इसलिए रीफ्रेश का मतलब है कि एक नया अस्थायी सेट बनाना, फिर मौजूदा सेट के नाम के रूप में इसे स्वैप करना।

+0

ऐ, शीर्ष उत्तर का उल्लेख ipsets, लेकिन जैसा कि मैंने वहां एक टिप्पणी में कहा - इसके लिए एक कर्नेल मॉड्यूल की आवश्यकता है जो डिफ़ॉल्ट रूप से उबंटू में नहीं है, और ऐसा कुछ नहीं है जिसे मैं उपयोग करने वाले किसी भी वीएम पर स्थापित कर सकता हूं। – Ycros

+1

हां, मैंने जनवरी 2007 में उस बग की सूचना दी। https://bugs.launchpad.net/ubuntu/+source/ipset/+bug/79182 – Jerub

+2

उबंटू अब पर्याप्त रूप से इप्ससेट का समर्थन करता है। – Jerub

1

आज सुबह मैं यह पता चला कि रूस से सेवा का अस्वीकार (डीओएस) हमला हो रहा था। वे मुझे दर्जनों आईपी ब्लॉक से मार रहे थे। उनके पास या तो आईपी का एक बड़ा पूल या कुछ प्रकार की प्रॉक्सी सूची/सेवा होनी चाहिए। हर बार जब मैंने एक आईपी अवरुद्ध किया, तो दूसरा एक पॉप अप हो गया। अंत में, मैंने एक स्क्रिप्ट की तलाश की, और पाया कि मुझे अपना खुद का समाधान लिखने की जरूरत है। निम्नलिखित थोड़ा आक्रामक है, लेकिन वे 200 से अधिक के लिए मेरा टॉप लोड लेवल चला रहे थे।

यहां एक त्वरित लिपि है जिसे मैंने रीयलटाइम में डॉस को अवरुद्ध करने के लिए लिखा था।

cat **"output of the logs"** | php ipchains.php **"something unique in the logs"** 

==> पीएचपी स्क्रिप्ट:

<?php 

$ip_arr = array(); 

while(1) 
{ 
    $line = trim(fgets(STDIN)); // reads one line from STDIN 
    $ip = trim(strtok($line, " ")); 

    if(!array_key_exists($ip, $ip_arr)) 
     $ip_arr[$ip] = 0; 

    $regex = sprintf("/%s/", $argv[1]); 

    $cnt = preg_match_all($regex, $line); 

    if($cnt < 1) continue; 

    $ip_arr[$ip] += 1; 

    if($ip_arr[$ip] == 1 ) 
    { 
//  printf("%s\n", $argv[1]); 
//  printf("%d\n", $cnt); 
//  printf("%s\n", $line); 

     printf("-A BLOCK1 -s %s/24 -j DROP\n", $ip); 

     $cmd = sprintf("/sbin/iptables -I BLOCK1 -d %s/24 -j DROP", $ip); 
     system($cmd); 
    } 
} 

?> 

अनुमान:

1) BLOCK1 is a Chain already created. 
2) BLOCK1 is a Chain that is run/called from the INPUT CHAIN 
3) Periodically you will need to run "ipchains -S BLOCK1" and put output in /etc/sysconfig file. 
4) You are familiar with PHP 
5) You understand web log line items/fields and output. 
0

इस गतिशील रूप से CentOS पर sshd कोस हैकर्स ब्लॉक करने के लिए पार्टी और iptables का उपयोग करने का एक उदाहरण है । इस मामले में, मैंने पासवर्ड लॉगिन को अनुमति देने के लिए sshd को कॉन्फ़िगर किया है (कुंजी की अनुमति देता है)। मैं "अलविदा" की प्रविष्टियों के लिए/var/log/secure में देखता हूं, जो fsh off कहने के sshd का विनम्र तरीका है ...

IP=$(awk '/Bye Bye/{print $9}' /var/log/secure | 
    sed 's/://g' |sort -u | head -n 1) 

[[ "$IP" < "123" ]] || { 

    echo "Found $IP - blocking it..." >> /var/log/hacker.log 

    /sbin/iptables -A INPUT -s $IP -j DROP 

    service iptables save 

    sed -i "/$IP/d" /var/log/secure 

} 

मैं इसे हर सेकेंड, या मिनट में लूप में चलाता हूं, या जो भी मुझे खुश करता है। मैं यह सत्यापित करने के लिए $ आईपी के मूल्य का परीक्षण करता हूं कि यह एक उपयोगी मान पाता है, यदि ऐसा है तो मैं इसे छोड़ने के लिए iptables का आह्वान करता हूं, और मैं $ IP की लॉग फ़ाइल को शुद्ध करने के लिए sed का उपयोग करता हूं, इसलिए प्रविष्टि को फिर से जोड़ा नहीं जाता है।

मैं सफेद सूची में कुछ पूर्व-प्रोसेसिंग (दिखाया नहीं गया) कुछ महत्वपूर्ण आईपी करता हूं जो हमेशा वैध होते हैं और उन्हें कनेक्ट करने में समस्या हो सकती है (उपयोगकर्ता त्रुटि के कारण)।

समय-समय पर मैं iptables फ़िल्टर सूची को सॉर्ट करता हूं और उनसे आईपी श्रेणियां बनाता हूं (एक अलग स्क्रिप्ट का उपयोग करके - और जब चेक किया जाता है, तो वे आम तौर पर भारत, चीन और रूस से आईपी श्रेणियां हैं)। इस प्रकार, मेरे समग्र iptables फ़िल्टर नियम सेट 50 और 500 प्रविष्टियों के बीच रहता है; ipset वास्तव में कम सूची में बहुत अधिक सुधार नहीं करता है।

+1

संख्या 123 का महत्व क्या है? यदि आप यह जांचना चाहते हैं कि आपके पास पहले ऑक्टेट के मूल्य की जांच करके एक वैध आईपी पता है, तो मुझे विश्वास है कि यह 223 तक कुछ भी हो सकता है। – tripleee

+0

यह किसी भी ऑक्टेट का परीक्षण नहीं है। यदि पार्सिंग/var/log/secure को आप खाली या भ्रष्ट फ़ील्ड के साथ समाप्त करते हैं, तो आप iptables कमांड को चलाने के लिए मान का परीक्षण नहीं करते हैं। '123' मान काफी मनमाना था। इसे थोड़ा और परीक्षण करने में, मैंने पाया कि आपको शायद '123' को '1' के साथ प्रतिस्थापित करना चाहिए ताकि एक पूर्ण आईपी रेंज शामिल हो सके। '123' से कम आईपी का परीक्षण करते समय, यह 2.0.0.0 से 255.255.255.255 तक आईपी पते के लिए सच होगा, इसलिए यह 1.x.x.x रेंज में आईपी को अवरुद्ध नहीं करेगा। जब आईपी परीक्षण '1' से कम होता है, तो यह 0.0.0.1 से 255.255.255.255 से मेल खाता है। – Andrew

5

आप rfw का उपयोग करने पर विचार कर सकते हैं जो iptables के लिए REST API है। यह विभिन्न संभावित समवर्ती स्रोतों से iptables आदेशों को क्रमबद्ध कर रहा है और फ्लाई पर दूरस्थ रूप से iptables निष्पादित करता है।

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

नमूना आदेश:

PUT /drop/input/eth0/11.22.33.44 

जो से मेल खाती है:

iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP 

आप सम्मिलित करें और JSON प्रारूप में मौजूदा नियमों प्राप्त करने के लिए वर्तमान स्थिति के लिए नियमों के साथ-साथ क्वेरी हटा सकते हैं:

GET /list/input 

अस्वीकरण: मैंने उस प्रोजेक्ट को शुरू किया। यह एमआईटी लाइसेंस के तहत खुला स्रोत है।

+0

यदि यह HTTP से अधिक है, तो क्या यह फ़ायरवॉल के लिए खतरनाक नहीं है? –

+0

ऊपर बताए अनुसार, डिफ़ॉल्ट HTTPS है। एसएसएल को अक्षम करने और सादे HTTP का उपयोग करने का एक विकल्प है, जो एकल उपयोगकर्ता वातावरण में लोकहोस्ट पर चलते समय उपयोगी होता है। –

+0

फ़ायरवॉल "प्रोग्रामेटिकली"/दूरस्थ रूप से और/या स्वचालित रूप से फ़ायरवॉल में हेरफेर करने वाला कुछ भी खतरनाक है। हालांकि, जगह पर उचित सुरक्षा इसे कम कर सकती है, यानी एपीआई गेटवे (जैसे कॉंग) के पीछे एसएसओ टोकन/2 एफए सुरक्षा आवश्यकताओं को पूरा करने के लिए एक लंबा रास्ता तय करेगा। –