सवाल iptables युक्तियाँ और चालें


मुझे यकीन है कि लिनक्स sysadmins काफी परिचित हैं iptables, यूजरलैंड इंटरफेस के लिए netfilter पैकेट फ़िल्टरिंग ढांचे।

अब, यह "प्रश्न" एक होना है सामुदायिक विकी विभिन्न बिट्स-एन-टुकड़ों को इकट्ठा करने के लिए iptables बुद्धिमत्ता। कुछ भी बहुत आम या बहुत अस्पष्ट नहीं है। जो भी आप जानते हैं उसे पोस्ट करें जो दूसरों को अधिक से अधिक बनाने में मदद करेगा iptables


57
2018-03-10 14:15


मूल




जवाब:


Iptables के साथ श्वेतसूची और कालीसूची का उपयोग करना

#!/bin/bash

WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt

#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F

#
## Whitelist
#

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
        echo "Permitting $x..."
        $IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done

#
## Blacklist
#

for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
        echo "Denying $x..."
        $IPTABLES -A INPUT -t filter -s $x -j DROP
done

बंदरगाहों को खोलने के लिए स्क्रिप्ट

#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"

#
## Permitted Ports
#

for port in $ALLOWEDTCP; do
       echo "Accepting port TCP $port..."
       $IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done

for port in $ALLOWEDUDP; do
        echo "Accepting port UDP $port..."
        $IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done

बंदरगाहों को अवरुद्ध करना

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

स्पूफ़ेड / अमान्य पैकेट्स

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

ब्लॉक Smurf हमलों

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

ब्लॉक आईसीएमपी (उर्फ पिंग)

# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

25



"स्पूफेड" टिप्पणियों पर एक टिप्पणी जोड़ने पर विचार करें, ताकि कम अनुभवी उपयोगकर्ताओं को पता चले कि क्यों स्रोत पते को धोखा दिया जाता है (... जब एक वैन इंटरफ़ेस पर पहुंचते हैं)। - 3molo
अच्छा निर्णय :-)। किया हुआ। - Bart De Vos
रुकिए। ब्लॉक आईआरएमपी (उर्फ पिंग) लाइन को ब्लॉक करने के लिए अनावश्यक ब्लॉक ब्लॉक नहीं है: iptables -A INPUT -p icmp -m icmp -j ड्रॉप? - Stann
भी - यहां वर्णित कई वस्तुओं के लिए स्पष्टीकरण यहां दिया गया है: newartisans.com/2007/09/neat-tricks-with-iptables.html - Stann
श्वेतसूची लिपि: थेरेस iptables लाइन 8 पर, और फिर $IPTABLES बाद में। क्या यह सिर्फ उपयोग करने के लिए पर्याप्त है iptables हर जगह? अन्यथा मुझे लगता है कि आपको कुछ असाइन करना होगा IPTABLES=/sbin/iptables सही? - UpTheCreek


नेटफिल्टर के प्रदर्शन का अनुकूलन अनुकूलित करें ipset

यदि आप एक लिखते हैं बहुत केवल आईपी, बंदरगाह, या दोनों के आधार पर समान नियमों का उपयोग करने पर विचार करें ipset netfilter के प्रदर्शन को अनुकूलित करने के लिए।

उदाहरण के लिए:

iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT

इसका मतलब है कि 1 9 2.168.251.177 के स्रोत पते वाला एक पैकेट पहले ट्रैवर्स होना चाहिए सैकड़ों नियमों से पहले इसे एसीसीईपीटी का फैसला प्राप्त हो सकता है।

बेशक, अनुभवी sysadmins सबनेट द्वारा नियमों को विभाजित करेंगे। किन्तु वह फिर भी सैकड़ों नियमों का मतलब है।

ipset बचाव के लिए!

सबसे पहले, एक आईपी सेट परिभाषित करें ipmap प्रकार:

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

फिर, पते के साथ इसे पॉप्युलेट करें:

for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done

अंत में, उपरोक्त सैकड़ों iptables नियमों को प्रतिस्थापित करें एक नियम:

iptables -m set --match-set Allowed_Hosts src -j ACCEPT

जब एक पैकेट आता है, नेटफिल्टर एक प्रदर्शन करेगा जल्दी से पैकेट के स्रोत (src) आईपी के लिए बिटमैप खोज Allowed_Hosts आईपी ​​सेट 1 9 2.168.0.0/16 से आने वाले सभी पैकेट अनुभव करेंगे एक राज करते हैं। और मेरा विश्वास करो कि बिटमैप खोजना सैकड़ों iptables नियम-जांच करने की तुलना में तेजी से परिमाण के दो क्रम है।

ipset आईपी ​​पते तक ही सीमित नहीं है। यह बंदरगाहों, आईपी-पोर्ट टुपल, नेटवर्क / सबनेट पते, आईपी-मैक ट्यूपल, और इसी तरह के आधार पर भी मिल सकता है। और यह उन मानदंडों को स्रोत या गंतव्य या दोनों के मिश्रण (टुपल्स के मामले में) के रूप में मिलान कर सकता है।

और अंत में, के साथ ipset आप स्वचालित रूप से ब्लैकलिस्ट / श्वेतसूची में आईपी पते डाल सकते हैं। ये ब्लैकलिस्ट / श्वेतसूची भी 'आयु' कर सकती हैं, इस प्रकार कॉन्फ़िगर करने योग्य समय बीतने के बाद स्वचालित रूप से आईपी पता हटाया जा सकता है।

कृपया देखें ipsetमैन पेज अधिक जानकारी के लिए।

बहुत महत्वपूर्ण नोट:

कुछ लिनक्स distros हो सकता है नहीं के लिए 'आउट ऑफ़ द बॉक्स' समर्थन है ipset (उदाहरण के लिए उबंटू 10.04 में यह समस्या थी)। इन प्रणालियों पर एक विधि स्थापित करना है ipset स्रोत कोड से।

इसके बजाय, डाउनलोड करें ipsetइसकी वेबसाइट से स्रोत: http://ipset.netfilter.org/install.html

वैकल्पिक रूप से, यदि आप उपयोग करते हैं xtables-addons, ipset है इसके स्रोत में शामिल है: http://xtables-addons.sourceforge.net/


23



यह एक वास्तविक दयालुता है जिसे डेबियन और उबंटू पर डिफ़ॉल्ट रूप से समर्थित नहीं है। मैंने सोचा था कि आप कुछ अस्पष्ट distros सूचीबद्ध करने जा रहे थे: / - UpTheCreek
@UpTheCreek मैंने अपना जवाब संपादित कर दिया है ... उत्तर पोस्ट करने के समय 'विशेष नोट' लागू था, लेकिन अब लागू नहीं है। - pepoluan


अपने नियमों में टिप्पणियां जोड़ें:

-m comment --comment "Comments help to read output of iptables -nvL"

21





अच्छी तरह से ज्ञात टीसीपी हमलों को ब्लॉक करें

अधिमानतः निम्नलिखित नियम जोड़ें -t raw -A PREROUTING

-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP

अवरुद्ध किए जा रहे हमले क्रमशः हैं:

  • SYN-FIN हमला
  • एसवाईएन-आरएसटी हमला
  • एक्स-मास हमला
  • एनएमएपी फिन स्कैन
  • NULLflags हमला
  • ऑलफ्लैग हमले

(उपरोक्त हमलों के नामों को संपादित करने के लिए स्वतंत्र महसूस करें)


16



-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP के रूप में हटाया जा सकता है -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP हर ब्लॉक को पकड़ देगा जो इसे ब्लॉक कर सकता है। - Ael Ombreglace
इसके अनुसार security.stackexchange.com/questions/4603/...। "अमान्य या विकृत पैकेट को छोड़ने की कोई आवश्यकता नहीं है, ये सभी हमले एक दशक पुराने हैं। लिनक्स कर्नेल देव आपके बारे में अधिक अद्यतित हैं, इस बात के बारे में कि किस प्रकार के पैकेट वैध हैं और कौन नहीं।" भविष्य की खामियों के बारे में क्या " , कुछ तर्क दे सकते हैं। ठीक है, आप कैसे जानते हैं कि भविष्य की खामियां टीसीपी हैंडलर में होंगी और आईपीटीबल्स टीसीपी पार्सर में नहीं? " - Matt
क्या यह अभी भी लागू है? - Vlastimil
@VlastimilBurian सैद्धांतिक रूप से अब उनकी आवश्यकता नहीं है। लेकिन नियमों के इन सेट को जोड़ने से न तो नेटवर्क धीमा हो जाता है और न ही CPU लोड में वृद्धि होती है, इसलिए मुझे कोई कारण नहीं दिखता है कि वे उन्हें जोड़ दें और उनके बारे में भूल जाएं - pepoluan


एनएटी सक्षम करना

  1. echo 1 > /proc/sys/net/ipv4/ip_forward 
  2. /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

चरण 1 आईपी अग्रेषण की अनुमति देने के लिए कर्नेल पैरामीटर सेट करता है, चरण 2 एक iptables नियम सेट करता है जो इंटरफ़ेस eth0 पर NAT को सक्षम करता है।


7



यह एक रिबूट के माध्यम से लगातार नहीं होगा, है ना? आपको संपादित करने की जरूरत है /etc/sysctl.conf  net.ipv4.ip_forward = 1। (Red Hat या व्युत्पन्न मानते हैं।) - Aaron Copley


ब्लॉक आईसीएमपी हमलों

अधिमानतः निम्नलिखित नियम जोड़ें -t raw -A PREROUTING

-p icmp -m u32 ! --u32 "4&0x3FFF=0"   -j DROP
-p icmp -m length --length 1492:65535 -j DROP

पहला नियम सभी आईसीएमपी पैकेट को अवरुद्ध करता है जिनके "विखंडन ध्वज" 0 नहीं है (आईसीएमपी चाहिए कभी नहीँ खंडित हो; उन्हें छोटे पेलोड ले जाना चाहिए)

दूसरा नियम oversized unfragmented आईसीएमपी पैकेट ब्लॉक करता है।


6



क्या एमटीयू डिस्कवरी पथ तोड़ नहीं होगा? - Matt
@ मैट नो, क्योंकि पथ एमटीयू डिस्कवरी केवल ईथरनेट पेलोड आकार के रूप में पैकेट का उपयोग करती है, यानी 1500 बाइट्स, जिनमें से 8 बाइट आईपी हेडर और आईसीएमपी हेडर द्वारा उपयोग किए जाते हैं। - pepoluan
स्पष्टीकरण के लिए धन्यवाद, लेकिन 1492-64k? वह 1500-65k क्यों नहीं है। मैं पीपीपीओई के लिए 14 9 2 को समझ सकता हूं लेकिन सीधे ईथरनेट। - Matt
क्या यह अभी भी लागू है? - Vlastimil
@VlastimilBurian मैं हाँ कहूंगा। Oversized आईसीएमपी पैकेट के लिए अभी भी कोई ज़रूरत नहीं है। - pepoluan


का उपयोग करते हुए FireHOL सुविधाजनक iptables wrapper

मैंने इसे सीधे iptables आदेशों से अधिक सहज ज्ञान युक्त पाया। विशेष रूप से अन्य फ़ायरवॉल के साथ पिछले अनुभव वाले लोगों के लिए:

फायरहोल एक iptables फ़ायरवॉल है   जनरेटर राज्यव्यापी iptables उत्पादन   लिनक्स पर पैकेट फ़िल्टरिंग फ़ायरवॉल   किसी भी संख्या के साथ मेजबान और राउटर   नेटवर्क इंटरफेस, किसी भी संख्या में   मार्ग, सेवा की किसी भी संख्या परोसा जाता है,   बीच में जटिलता की कोई संख्या   सेवाओं के बदलाव (सहित   सकारात्मक और नकारात्मक अभिव्यक्ति)।


4



मैं शोरवाल पसंद करता हूं जो सक्रिय रूप से विकसित होता है, आईपीवी 4 और आईपीवी 6 का समर्थन करता है, और अन्य iptables सिस्टम के लिए फ़ायरवॉल उत्पन्न कर सकता है। - BillThor
@ बिलटोर एक अच्छे उपकरण की तरह लगता है - धन्यवाद - Ophir Yoktan


(मेरी iptables_tricks.txt फ़ाइल से, कई स्थानों से पुनः संकलित: पी)

आईपीटीबल्स पोर्ट 22 (एसएसएच) पर एक ही आईपी से नए कनेक्शन के बीच 15 सेकंड इंतजार करता है:

 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

4



वही, लेकिन प्रयासों की गिनती के साथ: -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH  -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP - alexm


आईपटेबल्स वीडियो ट्यूटोरियल

अध्याय 1 http://www.youtube.com/watch?v=ldB8kDEtTZA&feature=player_embedded

कड़ी 2 http://www.youtube.com/watch?v=aDaEXxRHeXY&feature=related

अंतिम एपिसोड

http://www.youtube.com/watch?v=JojqHKcSxpo&feature=player_embedded

किसी भी नौसिखिया के लिए एक अच्छी शुरुआत होगी।


3



बहुत अच्छा ट्यूटोरियल - Stann


आईपी ​​सेट पुनरीक्षित

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

नोटेशन नीचे इस्तेमाल किया गया

के लिये ipset मैं पढ़ा नोटेशन का उपयोग करेंगे ipset restore और द्वारा लिखित ipset save

इसके लिए अनुरूप है iptables (तथा ip6tables) नियम मैं पढ़ते हुए नोटेशन का उपयोग करेंगे iptables-restore और द्वारा लिखित iptables-save। यह एक छोटे से नोटेशन के लिए बनाता है और यह मुझे संभावित आईपीवी 4-केवल हाइलाइट करने की अनुमति देता है (prefixed -4) या आईपीवी 6-केवल (उपसर्ग -6) नियम।

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

उन्नत आईपी सेट

आईपी ​​सेट में उल्लेख किया गया था उससे कहीं अधिक कर सकते हैं दूसरा जवाब और आपको निश्चित रूप से आईपी सेट दस्तावेज पढ़ना चाहिए (ipset(8)) साथ में iptables-extensions(8) यहां इस संक्षिप्त प्रविष्टि के अलावा।

उदाहरण के लिए मैं मुख्य रूप से तीन सेट प्रकारों पर ध्यान केंद्रित करूंगा: hash:ip, hash:net तथा list:set, लेकिन उनसे अधिक हैं और उनके सभी के पास वैध उपयोग के मामले हैं।

उदाहरण के लिए आप भी मिलान कर सकते हैं बंदरगाह संख्या, सिर्फ आईपी पते नहीं

आईपी ​​सेट को सहेजना और बहाल करना iptables-save तथा iptables-restore

आप थोक में आईपी सेट घोषणाएं बना सकते हैं और उन्हें पाइप करके आयात कर सकते हैं ipset restore। यदि आप पहले से मौजूद मौजूदा प्रविष्टियों के खिलाफ अपना कमांड अधिक लचीला बनाना चाहते हैं, तो इसका उपयोग करें ipset -exist restore

यदि आपके नियम एक फ़ाइल में हैं default.set आप इसका उपयोग करेंगे:

ipset -exist restore < default.set

इस तरह की एक फ़ाइल में प्रविष्टियां हो सकती हैं create सेट और करने के लिए add उनमें प्रविष्टियां। लेकिन आमतौर पर कमांड लाइन के अधिकांश आदेश फ़ाइलों में एक समान संस्करण प्रतीत होता है। उदाहरण (DNS सर्वर का एक सेट बनाना):

create dns4 hash:ip family inet
create dns6 hash:ip family inet6
# Google DNS servers
add dns4 8.8.8.8
add dns4 8.8.4.4
add dns6 2001:4860:4860::8888
add dns6 2001:4860:4860::8844

यहां एक सेट आईपीवी 4 के लिए बनाया गया है (dns4) और आईपीवी 6 के लिए एक (dns6)।

आईपी ​​सेट पर टाइमआउट्स

आईपी ​​सेट में टाइमआउट डिफ़ॉल्ट प्रति सेट और प्रति प्रविष्टि के रूप में सेट किया जा सकता है। यह उन परिदृश्यों के लिए बहुत उपयोगी है जहां आप किसी को अस्थायी रूप से अवरुद्ध करना चाहते हैं (उदा। पोर्ट-स्कैनिंग के लिए या अपने एसएसएच सर्वर को बलपूर्वक बल देने का प्रयास करना)।

इस तरह से काम करता है इस प्रकार है (आईपी सेट के निर्माण के दौरान डिफ़ॉल्ट):

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800

हम नीचे दिए गए इन विशेष सेटों और तर्क के बारे में बताएंगे कि वे किस तरह से सेट हैं।

यदि आप किसी विशेष आईपी पते के लिए अपना टाइमआउट सेट करना चाहते हैं, तो आप बस कह सकते हैं:

add ssh_dynblock4 1.2.3.4 timeout 7200

(सेट) डिफ़ॉल्ट आधे घंटे के बजाय दो घंटे के लिए आईपी 1.2.3.4 को ब्लॉक करने के लिए।

यदि आप इसे देखना चाहते थे ipset save ssh_dynblock4 थोड़ी देर के बाद, आप कुछ के साथ कुछ देखेंगे:

create ssh_dynblock4 hash:ip family inet hashsize 1024 maxelem 65536 timeout 1800
add ssh_dynblock4 1.2.3.4 timeout 6954

टाइमआउट चेतावनी

  • टाइमआउट किसी दिए गए सेट पर एक सुविधा है। अगर सेट नहीं था बनाया था टाइमआउट समर्थन के साथ आपको एक त्रुटि प्राप्त होगी (उदा। Kernel error received: Unknown error -1)।
  • टाइमआउट सेकंड में दिए जाते हैं। उदाहरण के लिए, मिनटों से सेकंड तक प्राप्त करने के लिए बैश अंकगणितीय अभिव्यक्तियों का उपयोग करें। उदा .: sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))

यह जांचना कि किसी दिए गए आईपी सेट में कोई प्रविष्टि मौजूद है या नहीं

आपकी स्क्रिप्ट के अंदर यह देखने के लिए उपयोगी हो सकता है कि कोई प्रविष्टि पहले से मौजूद है या नहीं। यह के साथ हासिल किया जा सकता है ipset test जो प्रविष्टि मौजूद है और गैर-शून्य अन्यथा शून्य लौटाता है। तो सामान्य चेक एक स्क्रिप्ट में लागू किया जा सकता है:

if ipset test dns4 8.8.8.8; then
  echo "Google DNS is in the set"
fi

हालांकि, कई मामलों में आप इसका उपयोग करना चाहते हैं -exist पर स्विच ipset मौजूदा प्रविष्टियों के बारे में शिकायत न करने के लिए इसे निर्देशित करने के लिए।

से आईपी सेट populating iptables नियम

यह मेरी राय में आईपी सेट की हत्यारा सुविधाओं में से एक है। न केवल आप आईपी सेट की प्रविष्टियों के खिलाफ मिल सकते हैं, आप मौजूदा आईपी सेट में नई प्रविष्टियां भी जोड़ सकते हैं।

उदाहरण के लिए यह जवाब इस प्रश्न के लिए आपके पास है:

-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

... एसएसएच (टीसीपी पोर्ट 22) के कनेक्शन प्रयासों को रेट-सीमित करने के इरादे से। प्रयुक्त मॉड्यूल recent हालिया कनेक्शन प्रयासों का ट्रैक रखता है। के स्थान पर state मॉड्यूल, मैं पसंद करते हैं conntrack मॉड्यूल, हालांकि।

# Say on your input chain of the filter table you have
   -A INPUT -i eth+ -p tcp --dport ssh -j SSH
# Then inside the SSH chain you can
# 1. create an entry in the recent list on new connections
   -A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
# 2. check whether 3 connection attempts were made within 2 minutes
#    and if so add or update an entry in the ssh_dynblock4 IP set
-4 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock4 src --exist
-6 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock6 src --exist
# 3. last but not least reject the packets if the source IP is in our
#    IP set
-4 -A SSH -m set --match-set ssh_dynblock4 src -j REJECT
-6 -A SSH -m set --match-set ssh_dynblock6 src -j REJECT

इस मामले में मैं प्रवाह को रीडायरेक्ट कर रहा हूं SSH श्रृंखला जैसे कि मुझे खुद को दोहराना नहीं है -p tcp --dport ssh हर एक नियम के लिए।

बार बार कहना:

  • -m set बनाता है iptables जानते हैं कि हम से स्विच का उपयोग कर रहे हैं set मॉड्यूल (जो आईपी सेट को संभालता है)
  • --match-set ssh_dynblock4 src बताता है iptablesमैच करने के लिए स्रोत (srcनामित सेट के खिलाफ पता)ssh_dynblock4)
    • यह अनुरूप है sudo ipset test ssh_dynblock4 $IP (कहा पे $IP पैकेट के लिए स्रोत आईपी पता शामिल है)
  • -j SET --add-set ssh_dynblock4 src --exist जोड़ता है या अद्यतन करता है स्रोत (src) पैकेट से आईपी सेट में पता ssh_dynblock4। अगर कोई प्रविष्टि मौजूद है (--exist) यह बस अद्यतन किया जाएगा।
    • यह अनुरूप है sudo ipset -exist add ssh_dynblock4 $IP (कहा पे $IP पैकेट के लिए स्रोत आईपी पता शामिल है)

यदि आप इसके बजाय लक्ष्य / गंतव्य पता से मेल खाना चाहते हैं, तो आप इसका उपयोग करेंगे dst के बजाय src। अधिक विकल्पों के लिए मैनुअल से परामर्श लें।

सेट के सेट

आईपी ​​सेट में अन्य सेट हो सकते हैं। अब यदि आप यहां तक ​​लेख का पालन करते हैं तो आप सोचेंगे कि सेट को गठबंधन करना संभव है या नहीं। और निश्चित रूप से यह है। ऊपर से आईपी सेट के लिए हम दो संयुक्त सेट बना सकते हैं ssh_dynblock तथा ssh_loggedon क्रमशः आईपीवी 4-केवल और आईपीवी 6-सेट सेट करने के लिए:

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800
# Sets of sets
create ssh_loggedon  list:set
create ssh_dynblock  list:set
# Populate the sets of sets
add ssh_loggedon ssh_loggedon4
add ssh_loggedon ssh_loggedon6
add ssh_dynblock ssh_dynblock4
add ssh_dynblock ssh_dynblock6

और अगला प्रश्न जो आपके दिमाग में पॉप अप होना चाहिए यह है कि यह हमें अनुमति देता है मैच और आईपी संस्करण-अज्ञेयवादी फैशन में आईपी सेट में हेरफेर करें।

और इसका जवाब एक शानदार है: हाँ! (हां, यह स्पष्ट रूप से पिछली बार मैंने जांच की थी)

नतीजतन पिछले खंड के नियमों को पढ़ने के लिए फिर से लिखा जा सकता है:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

जो बहुत अधिक संक्षेप में है। और हाँ, यह कोशिश की और परीक्षण किया गया है और एक आकर्षण की तरह काम करता है।

इसे सब एक साथ रखकर: एसएसएच ब्रूट-फोर्स रक्षा

मेरे सर्वर पर मेरे पास एक स्क्रिप्ट चलती है cron नौकरी जो मेजबान नामों का एक समूह लेती है और उनको आईपी पते पर हल करती है, फिर इसे "विश्वसनीय मेजबान" के लिए आईपी सेट में खिलाती है। विचार यह है कि विश्वसनीय मेजबान सर्वर में लॉग इन करने के अधिक प्रयास प्राप्त करते हैं और किसी और के लिए जरूरी नहीं है।

इसके विपरीत, मेरे पास विश्वसनीय एसएसएच सर्वर से कनेक्ट होने से पूरे देश को अवरुद्ध कर दिया गया है, भरोसेमंद मेजबान (संभावित नियमों के क्रम) के (संभावित) अपवाद के साथ।

हालांकि, यह पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है। यहां मैं एक साफ समाधान जोड़ना चाहता हूं जो इसमें निहित सेट का उपयोग करेगा ssh_loggedon बाद के कनेक्शन प्रयासों को सौंपने की अनुमति देने के लिए सेट करें और अन्य पैकेट के समान जांच के अधीन न हों।

90 मिनट के डिफ़ॉल्ट टाइमआउट को याद रखना महत्वपूर्ण है ssh_loggedon और 30 मिनट के लिए ssh_dynblock निम्नलिखित पर ध्यान देते समय iptables नियम:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m set --match-set ssh_loggedon src -j ACCEPT
-A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

अब तक आपको खुद से पूछना चाहिए कि कनेक्टिंग आईपी पता कैसे समाप्त होता है ssh_loggedon उप सेट। तो पढ़ें ...

बोनस: एसएसएच लॉगऑन के दौरान आप जिस आईपी को लॉग इन करते हैं उसे जोड़ते हैं

यदि आपने प्रयोग किया है sshrc और दोस्तों, आप इसकी कमियों के बारे में सीखा होगा। लेकिन पीएएम बचाव के लिए आता है। एक मॉड्यूल नामित pam_exec.so हमें उस बिंदु पर एसएसएच लॉगऑन के दौरान एक स्क्रिप्ट का आह्वान करने की अनुमति देता है जहां हम जानते हैं कि उपयोगकर्ता को भर्ती कराया गया है।

में /etc/pam.d/sshd नीचे pam_env तथा pam_selinux प्रविष्टियां निम्न पंक्ति जोड़ती हैं:

session    optional     pam_exec.so stdout /path/to/your/script

और सुनिश्चित करें कि स्क्रिप्ट का आपका संस्करण (/path/to/your/script ऊपर) मौजूद है और निष्पादन योग्य है।

पीएएम क्या हो रहा है संवाद करने के लिए पर्यावरण चर का उपयोग करता है, ताकि आप इस तरह की एक साधारण लिपि का उपयोग कर सकें:

#!/bin/bash
# When called via pam_exec.so ...
SETNAME=ssh_loggedon
if [[ "$PAM_TYPE" == "open_session" ]] && [[ -n "$PAM_RHOST" ]]; then
    [[ "x$PAM_RHOST" != "x${PAM_RHOST//:/}" ]] && SETNAME="${SETNAME}6" || SETNAME="${SETNAME}4"
    ipset -exist add $SETNAME "$PAM_RHOST"
fi

दुर्भाग्य से ipset उपयोगिता में नेटफिल्टर के अंतर्निर्मित स्मारक प्रतीत नहीं होते हैं। तो हमें अपनी प्रविष्टि जोड़ते समय आईपीवी 4 और आईपीवी 6 आईपी सेट के बीच अंतर करने की जरूरत है। अन्यथा ipset मान लेंगे कि हम एक और जोड़ना चाहते हैं सेट आईपी ​​के बजाय सेट के सेट पर। और निश्चित रूप से यह असंभव है कि आईपी के नाम पर एक सेट होगा :)

तो हम जांचते हैं : आईपी ​​पते में और संलग्न करें 6 इस तरह के मामले में सेट नाम के लिए और 4 अन्यथा।

समाप्त।


3





Iptables को कॉन्फ़िगर करने के लिए उपयोग किया जा सकता है कि एक और जीयूआई है फ़ायरवॉल बिल्डर। यह उपयोगकर्ताओं को डेटाबेस में ऑब्जेक्ट्स के रूप में नियम तत्व बनाने देता है और फिर वांछित फ़ायरवॉल नीति बनाने के लिए इन ऑब्जेक्ट्स को नियम संपादक में ड्रैग-एंड-ड्रॉप करता है। एप्लिकेशन तब नियमों को लागू करने के लिए आवश्यक सभी iptables आदेशों के साथ एक स्क्रिप्ट फ़ाइल उत्पन्न करता है।

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

पूर्ण प्रकटीकरण - मैं नेटसिटाडल का सह-संस्थापक हूं जो फ़ायरवॉल बिल्डर विकसित करने वाली कंपनी है।


2