iptables टिप्स और ट्रिक्स [बंद]


60

मुझे यकीन है कि लिनक्स sysadmins पैकेट-फ़िल्टरिंग ढांचे के iptablesलिए उपयोगकर्ता के इंटरफ़ेस से काफी परिचित हैं netfilter

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

जवाबों:


26

श्वेतसूची और ब्लैक लिस्ट का उपयोग 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

ब्लॉक स्मर्फ हमले

# 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

ब्लॉक ICMP (उर्फ पिंग)

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

4
"स्पूफ़्ड" टिप्पणियों में एक टिप्पणी जोड़ने पर विचार करें, ताकि कम अनुभवी उपयोगकर्ताओं को पता हो कि स्रोत पते को स्पूफ क्यों माना जाता है ... (वान इंटरफ़ेस पर पहुंचने पर)।
3molo

1
अच्छा निर्णय :-)। किया हुआ।
बार्ट डी वोस

रुको। नहीं है ब्लॉक ICMP (उर्फ पिंग) लाइन बेतुका ब्लॉक करने के लिए smurf हमले लाइन: iptables-INPUT -p icmp -m icmp -j DROP?
स्टान

2
श्वेतसूची स्क्रिप्ट को पुन: iptablesपंक्ति 8 पर Theres , और फिर $IPTABLESबाद में। क्या यह iptablesहर जगह उपयोग करने के लिए पर्याप्त है? अन्यथा मुझे लगता है कि आपको कुछ IPTABLES=/sbin/iptablesसही पसंद करने की आवश्यकता होगी ?
UpTheCreek

1
मैं बंदरगाहों को उस तरह से ब्लॉक नहीं करूंगा। इसके बजाय कुछ ऐसा है जो tcp / udp कनेक्शन स्वीकार करेगा और कई संबंधित पैकेट की तलाश करेगा। टीसीपी आसान है, बस उन बंदरगाहों के लिए स्थापित की तलाश करें। कुछ भी, दूसरों के लिए यह खराब पैकेट के साथ परीक्षण कर सकते हैं और आपके द्वारा गेटवे जैसे श्वेतसूची में कुछ भी अवरुद्ध नहीं किया जा सकता है।
हारून

25

नेटफिल्टर के प्रदर्शन का उपयोग करके अनुकूलन करें ipset

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

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

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

इसका मतलब है कि 192.168.251.177 के स्रोत पते के साथ एक पैकेट को पहले ACCEPT के फैसले को प्राप्त करने से पहले सैकड़ों नियमों को पार करना होगा ।

बेशक, अनुभवी 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) आईपी के लिए IP सेट के खिलाफ एक बहुत तेज बिटमैप खोज करेगा Allowed_Hosts। 192.168.0.0/16 से आने वाले सभी पैकेट एक नियम का अनुभव करेंगे । और मुझे विश्वास है कि एक बिटमैप की खोज सैकड़ों iptables नियम-जाँच की तुलना में तेज़ी से कम से कम दो क्रमों का परिमाण है।

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

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

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

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

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

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

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


3
यह एक वास्तविक दया है जो इसे डेबियन और उबंटू पर डिफ़ॉल्ट रूप से समर्थित नहीं है। मुझे लगा कि आप कुछ
अस्पष्ट विकृतियों

@UpTheCreek मैंने अपना उत्तर संपादित कर लिया है ... उत्तर पोस्ट करने के समय 'विशेष नोट' लागू था, लेकिन अब लागू नहीं है।
पेपोलुआन

21

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

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

16

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

निम्नलिखित नियम जोड़ें, अधिमानतः में -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- फाइनल हमला
  • SYN-RST हमला
  • एक्स-मास का दौरा
  • nmap फिन स्कैन
  • NULLflags हमला
  • एलेफ्लैग्स पर हमला

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


4
-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हर पैकेट यह ब्लॉक सकता पकड़ लेंगे।

4
Security.stackexchange.com/questions/4603/… के अनुसार । "अमान्य या विकृत पैकेटों को छोड़ने की कोई आवश्यकता नहीं है, ये सभी हमले एक दशक पुराने हैं। लिनक्स कर्नेल देव आपके बारे में की तुलना में बहुत अधिक अद्यतित हैं कि किस तरह के पैकेट वैध हैं और कौन से नहीं। भविष्य के दोषों के बारे में क्या है।" , कुछ लोग तर्क दे सकते हैं। आप कैसे जानते हैं कि भविष्य का दोष टीसीपी हैंडलर में होगा न कि टीसीपी पार्सर में?
मैट

1
@VlastimilBurian सैद्धांतिक रूप से उन्हें अब ज़रूरत नहीं है। लेकिन नियमों के इन सेटों को जोड़ने से न तो नेटवर्क धीमा होता है और न ही सीपीयू लोड बढ़ता है, इसलिए मुझे कोई कारण नहीं दिखता कि मैं उन्हें न जोड़ूं और उनके बारे में भूल
जाऊं them

7

NAT सक्षम करना

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

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


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

6

ICMP के हमलों को रोकें

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

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

पहला नियम सभी ICMP पैकेट्स को ब्लॉक करता है जिनका "विखंडन ध्वज" 0. नहीं है (ICMP को कभी खंडित नहीं किया जाना चाहिए; उन्हें छोटे पेलोड ले जाना चाहिए)

दूसरे नियम के ब्लॉक अप्रमाणित ICMP पैकेटों की देखरेख करते हैं।


क्या वह ब्रेक एमटीयू डिस्कवरी का रास्ता नहीं होगा?
मैट

@Matt नहीं, क्योंकि पथ MTU खोज केवल ईथरनेट पेलोड आकार, यानी 1500 बाइट्स के रूप में पैकेट का उपयोग करती है, जिनमें से 8 बाइट्स आईपी हेडर और आईसीएमपी हेडर द्वारा उपयोग किए जाते हैं।
पेपोलुआन

स्पष्टीकरण के लिए धन्यवाद, लेकिन 1492-64k? ऐसा क्यों नहीं 1500-65k है। मैं PPPoE के लिए 1492 समझ सकता हूं लेकिन सीधे ईथरनेट।
मैट

क्या यह अभी भी लागू है?
LinuxSecurityFreak

@VlastimilBurian मैं हाँ कहूँगा। अभी भी ओवरस्पीड आईसीएमपी पैकेटों की जरूरत नहीं है।
पेपोलुआन

4

फायरहोल का उपयोग - सुविधाजनक iptables आवरण

मुझे यह प्रत्यक्ष iptables कमांड की तुलना में बहुत अधिक सहज लगा। विशेष रूप से अन्य फायरवॉल वाले पिछले अनुभव वाले लोगों के लिए:

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


2
मैं Shorewall को पसंद करता हूं जो सक्रिय रूप से विकसित है, IPv4 और IPv6 का समर्थन करता है, और अन्य iptables सिस्टम के लिए फ़ायरवॉल उत्पन्न कर सकता है।
बिलथोर

4

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

पोर्ट 22 (SSH) पर समान IP से नए कनेक्शन के बीच iptables 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

1
समान, लेकिन प्रयासों की गिनती के साथ:-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
एलेक्सम

3

IPTABLES वीडियो ट्यूटोरियल

एपिसोड 1 http://www.youtube.com/watch?v=ldB8kDEtTZA&feature=player_embedf

एपिसोड 2 http://www.youtube.com/watch?v=aDaEXxRHeXY&feature=related

अंतिम एपिसोड

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

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


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

3

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

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

नीचे उपयोग संकेतन

क्योंकि ipsetमैं द्वारा पढ़ी ipset restoreऔर लिखी गई संकेतन का उपयोग करूँगा ipset save

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

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

उन्नत IP सेट

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

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

उदाहरण के लिए आप केवल आईपी पते ही नहीं बल्कि पोर्ट नंबर से भी मेल खा सकते हैं ।

के रूप में iptables-saveऔर के साथ आईपी सेट को सहेजना और पुनर्स्थापित करनाiptables-restore

आप बल्क में IP सेट घोषणाएँ बना सकते हैं और उन्हें पाइपिंग द्वारा आयात कर सकते हैं 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

यहाँ एक सेट IPv4 ( dns4) और एक IPv6 ( dns6) के लिए बनाया गया है।

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

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

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

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ताकि यह निर्देश दिया जा सके कि यह मौजूदा प्रविष्टियों के बारे में शिकायत न करें।

iptablesनियमों से IP सेट करना

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

इस प्रश्न के उत्तर में उदाहरण के लिए आपके पास:

-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से मिलान करने के लिए कहता है ( ) srcssh_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। अधिक विकल्पों के लिए मैनुअल से परामर्श करें।

सेट के सेट

आईपी ​​सेट में अन्य सेट हो सकते हैं। अब यदि आप इस लेख को यहाँ तक फॉलो करते हैं तो आपको आश्चर्य होगा कि क्या सेट्स को संयोजित करना संभव है। और निश्चित ही यह है। ऊपर से IP सेट के लिए हम दो संयुक्त सेट बना सकते हैं ssh_dynblockऔर ssh_loggedonक्रमशः IPv4-only और IPv6- केवल सेट शामिल करने के लिए:

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

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

यह सब एक साथ रखना: SSH जानवर बल रक्षा

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

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

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

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

-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उप-सेटों में कनेक्टिंग आईपी पता कैसे समाप्त होता है । तो पढ़िए ...

बोनस: SSH लॉगऑन के दौरान आपके द्वारा लॉग इन किया गया IP जोड़ना

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

में /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उपयोगिता नेटफिल्टर के बिल्ट-इन स्मार्टस में नहीं लगती है। इसलिए हमें अपनी प्रविष्टि जोड़ते समय IPv4 और IPv6 IP सेट के बीच अंतर करने की आवश्यकता है। अन्यथा ipsetमान लेंगे कि हम आईपी ​​के बजाय सेट के सेट में एक और सेट जोड़ना चाहते हैं । और निश्चित रूप से यह संभावना नहीं है कि एक आईपी के नाम पर एक सेट होगा :)

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

समाप्त।


2

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

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

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


1

यूआईडी के साथ आउटगोइंग कनेक्शन लॉग करें

iptables -A OUTPUT -m state --state NEW -m tcp -p tcp -m limit --limit 5/m -j LOG --log-uid --log-prefix="outgoing connection: "

पोर्ट / कनेक्शन अग्रेषण:

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.1.7:80
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -i eth1 -j ACCEPT

1
मैं NFLOGलक्ष्य पसंद करता हूं । यह एक लंबी लाइन उपसर्ग की अनुमति देता है और उपयोगकर्ता मोड डेमन डेटाबेस में भी लॉग इन कर सकता है।
0xC0000022L

1

वाइल्डकार्ड के साथ कई इंटरफ़ेस नामों का मिलान करें

उदाहरण: आपके पास है eth0 और eth1 उनके बीच किसी भी यातायात की अनुमति देना चाहेंगे?

iptables -A FORWARD -i eth+ -o eth+ -j ACCEPT

मैंने अतीत में इसका उपयोग veth<something>एलएक्ससी द्वारा गतिशील रूप से निर्मित और नामित किए गए इंटरफेस से मिलान करने के लिए किया है। इसलिए मैं एक साथ सभी मैच कर सकता हूं veth+

मैंने जानबूझकर _<something>मैच के खिलाफ कुछ इंटरफेस का नाम भी दिया _+


1

असामान्य एमएसएस मूल्यों को ब्लॉक करें

iptables -t mangle -A PREROUTING -p tcp \
-m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

DDOS सुरक्षा के लिए SYNPROXY लक्ष्य

इस लक्ष्य का उद्देश्य यह होस्ट करना है कि भेजा गया SYN पैकेट कनेक्शन स्थापित करता है या SYN कनेक्शन आरंभ करने के बाद कुछ भी नहीं करता है। यदि यह कुछ नहीं करता है, तो यह पैकेट को न्यूनतम प्रयास के साथ छोड़ देता है।

ट्रैकिंग तालिका को कच्ची तालिका में जोड़ने के लिए सिंक पैकेट सेट करें

iptables -t raw -A PREROUTING -p tcp -m tcp --dport 80 --syn -j CT --notrack

Http सर्वर के लिए synproxy सक्षम करें:

iptables -A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate INVALID,UNTRACKED \
-j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460

संसाधन: RHEL ब्लॉग से SYNPROXY लक्ष्य


1

आईपी ​​सेट के साथ एक आउटबाउंड बैंडविड्थ कोटा के लिए सभी व्यक्तिगत आईपी पते को सीमित करना

आप अपने सर्वर को केवल प्रति व्यक्ति बैंडविड्थ उपयोग के प्रत्येक IP 15GiByte को अनुमति देने के लिए कॉन्फ़िगर करने की उम्मीद कर सकते हैं, एक बैंडविड्थ उपयोग हमले को प्रतिबिंबित करने या चकमा देने के लिए, शायद आपके ISP पर अपने बैंडविड्थ बैंडविड्थ कोटा के लिए। इसे निम्नलिखित के रूप में पूरा किया जा सकता है:

पहले IPv4 और IPv6 के लिए IP सेट बनाएँ:

ipset create IP_QUOTA_SET_OUT hash:ip timeout 345600 counters
ipset create IP_QUOTA_SET_OUT_INET6 hash:ip timeout 345600 counters family inet6

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

iptables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT dst -j SET --add-set IP_QUOTA_SET_OUT dst --timeout 345600
iptables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT dst --bytes-gt 16106127360 -j DROP

ip6tables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT_INET6 src -j SET --add-set IP_QUOTA_SET_OUT_INET6 src --timeout 345600
ip6tables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT_INET6 src --bytes-gt 16106127360 -j DROP

यह हमलों को रोक देगा जैसे कि उपयोगकर्ता आपके वेबसर्वर से बड़ी फ़ाइल का अनुरोध करने के लिए लंबे समय तक, या उस मामले के लिए किसी भी सेवा से। उसी को INPUT श्रृंखला के लिए किया जा सकता है।


0

जो कुछ मैं करता हूं, मुख्य रूप से एक अधिक सुरुचिपूर्ण समाधान की मेरी अज्ञानता के कारण, प्रत्येक 4 घंटे में मैन्युअल रूप से मेरे नगीनेक्स लॉग की जांच करना है और व्यक्तिगत आईपी द्वारा अत्यधिक पहुंच के लिए मेल सर्वर हर 2 मिनट में लॉग करता है। मैं कुछ स्क्रिप्ट्स एक साथ चलाता हूं:

  1. चेक करें access.logऔर सर्वर से कितने हिट हैं, इसके द्वारा शीर्ष 10 आईपी के आयोजन को सूचीबद्ध करें
  2. परिणाम को एक लॉग फ़ाइल में डंप करें
  3. उस लॉग फ़ाइल पर एक और स्क्रिप्ट देखें और किसी भी IP पर प्रतिबंध लगा दें जो पिछले X घंटों में X राशि से अधिक बार सर्वर से टकराया हो
  4. मेरा बचाओ iptables.save

यहाँ यह कैसा दिखता है:

autoBanIPs_mail.sh
#!/bin/bash

# This script checks the last 2 minutes of log entries to see if any 
# IP has made over 99 connections

now=$(date +"%m_%d_%Y")

/root/bin/checkBadIPs_mail.sh > /home/ipChecker/ipcheckMAIL_$now.txt
cat /home/ipChecker/ipcheckMAIL_$now.txt | \
    grep " \\(\\([9][9]\\)\\|\\([0-9][0-9][0-9]\\+\\)\\) " | \
    awk '{print $2}' > /home/ipChecker/badMailIPs_$now.sh
sed -i "s/^/\/usr\/local\/sbin\/blockIP /g" /home/ipChecker/badMailIPs_$now.sh
/bin/bash /home/ipChecker/badMailIPs_$now.sh
cat /home/ipChecker/ipcheckMAIL_$now.txt >> /home/ipChecker/ipcheckMAIL_$now.log
rm /home/ipChecker/ipcheckMAIL_$now.txt
rm /home/ipChecker/badMailIPs_$now.sh
checkBadIPs_mail.sh

यहां एक बात जो बहुत महत्वपूर्ण है, वह यह है कि आप एक श्वेतसूची स्थापित करने के लिए आवश्यक हैं या आप सर्वर से बहुत सारे प्रामाणिक आईपी को अवरुद्ध करना शुरू करने जा रहे हैं, जिसे आप सिर्फ ईमेल से या अन्य लॉग के मामले में, बहुत से ईमेल प्राप्त करते हैं। बस वैध कारणों से आपके सर्वर को बहुत मारा। मेरे श्वेत सूची सिर्फ सही के बाद ग्रेप पाइप जोड़कर इस स्क्रिप्ट में बनाया गया है | grep ']' | कुछ इस तरह दिखता है "grep -v 127.0 |"
आपको अपने सर्वर को सिखाने के लिए समय निकालना होगा जो उच्च ट्रैफ़िक आईपी के वैध हैं और जो नहीं हैं। मेरे लिए इसका मतलब यह था कि मुझे पहले हफ़्ते बिताने थे या इसलिए हर दो घंटे में मैन्युअल रूप से अपने लॉग्स की जाँच करना, iplocation.net पर उच्च ट्रैफ़िक आईपी देखना और फिर amazon, box.com या यहाँ तक कि मेरे घर / कार्यालय जैसे वैध को जोड़ना। आईपी ​​इस श्वेतसूची में होता है। यदि आप नहीं करते हैं, तो संभवत: आप अपने स्वयं के सर्वर से अवरुद्ध हो जाएंगे या आप कानूनी मेल / वेब सर्वर को ब्लॉक करना शुरू कर देंगे और ईमेल या ट्रैफ़िक में रुकावट पैदा करेंगे।

cat /var/log/mail.log | awk \
    -v d1="$(date --date="-2 min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v 127.0 | \
    awk '{print $1}' | sort | uniq -c | sort -n | tail -10
BlockIP
#!/bin/bash
sudo iptables -I INPUT -s $1 -j DROP
sudo bash -c "iptables-save > /etc/network/iptables.save"

फिर से मुझे पता है कि यह नरक के रूप में कच्चा है और शायद एक अच्छा साफ कुशल प्रोटोकॉल है जो यह सब करता है लेकिन मुझे इसके बारे में नहीं पता था और यह बात अब एक या दो साल से चल रही है और बुरे लोगों को खाड़ी में रख रही है। एक बात जो मैं बहुत गंभीरता से सुझाऊँगा कि आपके पास पंखों में एक प्रॉक्सी या दूसरा सर्वर है जिसका उपयोग आप अपने मुख्य सर्वर तक पहुँचने के लिए कर सकते हैं। इसका कारण यह है कि यदि आप एक दिन नीले रंग से वेब विकास कर रहे हैं और आप कुछ परीक्षण के लिए 5 घंटे में अपने आप को 2000 बार पिंग करें ताकि आप छद्म को छोड़कर किसी भी तरह से अवरुद्ध न हो सकें।

आप देख सकते हैं कि checkBadIPs.shमैंने grep -v 127.0 डाला है और अपनी वास्तविक फाइलों में मेरे अपने आईपी और अन्य विश्वसनीय आईपी रेंजों के लिए नियमों की अनदेखी करने का एक टन है, लेकिन कभी-कभी आपका आईपी बदल जाता है, आप अपडेट करना भूल जाते हैं और फिर आप लॉक हो जाते हैं अपने खुद के सर्वर से बाहर।

वैसे भी, उम्मीद है कि मदद करता है।

अपडेट करें

मैंने चीजों को थोड़ा बदल दिया है ताकि अब हर दो घंटे की जाँच करने के बजाय हर 2 मिनट में कुछ लॉग्स की जाँच हो, मुख्य रूप से मेरे ssh ऑर्टिकल लॉग और मेल लॉग के रूप में वे पाउंड किए जा रहे थे :(।

मैं प्रत्येक लॉग फ़ाइल के लिए विशिष्ट स्क्रिप्ट सेटअप करता हूं, हालांकि यह मैन्युअल स्क्रिप्ट से काफी आसान होगा, जिसका उपयोग मैं स्वयं लॉग का निरीक्षण करने के लिए करना चाहता हूं। इस तरह दिखता है:

#!/bin/bash

log=$1 time=$2

cat /var/log/${log} | awk \
    -v d1="$(date --date="-${time} min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \
    sort | uniq -c | sort -n | tail -10

इसे चलाने के लिए 2 इनपुट की आवश्यकता होती है, वह लॉग फ़ाइल जिसे आप स्कैन करना चाहते हैं और जिस अतीत को आप स्कैन करना चाहते हैं, उसमें कितनी दूर है।

इसलिए अगर मैं मेल की जाँच करना चाहता था। आईपी मायने रखता है कि मैं चला जाएगा अतीत में 75 मिनट के लिए मायने रखता है:

$ sudo script.sh mail.log 75


1
अच्छा! मैं ipsetiptables श्रृंखला को बढ़ाने के बजाय उपयोग करूंगा , लेकिन विचार बहुत अच्छा है और मुझे लगता है कि मैं उन्हें अपने उत्पादन सर्वर पर लागू करूंगा। साझा करने के लिए धन्यवाद!
पेपोलुआन

2
मैंने अभी दूसरे दिन पहली बार ipset के बारे में पढ़ा और यह जानकर बहुत खुशी हुई कि यह क्या करता है .. मैं इसे लागू करने से थोड़ा डरता हूँ क्योंकि शायद मैं इसे शुरू में ही मिटा दूँगा और सर्वर को बंद कर दूंगा लेकिन यह यहाँ सीखने के लिए मेरी चीजों की सूची में है। कहा जा रहा है कि मेरी iptable चेन लगभग 30-40 आइटम है और केवल 1 या हर दिन एक नया मिलता है, तो यह एक बिंदु पर नहीं है कि मैं अत्यधिक चिंतित हूं।
19:00 पर अनियंत्रित

क्या आपने विफलता 2ban पर विचार किया है?
चूजों

0

मैं ipsets और tcp झंडे के बारे में टिप्पणियों से सहमत हूं, लेकिन अभी भी बहुत कुछ गायब है:

देश सूचियों के लिए ipsets के बजाय xtables-addons geoip मैच का उपयोग करें। जियोइप डेटा को नियमित रूप से अपडेट करें (प्रति माह कम से कम एक बार)। डेटा अधिक गतिशील है कि एक आग और भूल ipset सूची।

टीसी झंडे के साथ कनेक्शन राज्य ट्रैकिंग पर विचार करें। उदाहरण के लिए, एक tcp RST या ACK केवल एक स्थापित कनेक्शन के लिए समझ में आता है। SYN केवल नए और संबंधित कनेक्शन के लिए समझ में आता है। एक स्थापित कनेक्शन के लिए एक SYN का मतलब है कि या तो आपका SYN + ACK खो गया था या एक हैक प्रयास था और इसे रीसेट किया जाना चाहिए क्योंकि कनेक्शन के दोनों पक्ष राज्य के रूप में सहमत नहीं हैं।

हालाँकि, कोई भी, SYN + RST और FIN + RST अवैध संयोजन नहीं हैं, SYN + FIN अब टीसीपी फास्ट-ओपन (टीसीपी विकल्प 34) के तहत मान्य है, खासकर DNS के लिए। SYN पैकेट, फास्ट-ओपन के साथ भी, खंडित नहीं होना चाहिए। मैं PSH और URG झंडे वाले नियमों को उपयोगी नहीं मानता। टीसीपी राज्य के साथ कनेक्शन ट्रैकिंग राज्य को भ्रमित न करें: ट्रैकिंग उद्देश्यों के लिए SYN पैकेट पर एक RST प्रतिक्रिया स्थापित की जाती है।

SYNPROXY फॉरवर्ड पैकेट के लिए है और सिंकुकी समर्थन से परे स्थानीय रूप से वितरित लोगों के लिए कुछ भी नहीं जोड़ता है।

ICMP त्रुटि पैकेट हमेशा संबंधित स्थिति में और लंबाई 48: 576 की होगी यदि वे वैध हैं। लंबाई 84: आईपीवी 6 के लिए 1280। बाकी सभी को नजरअंदाज करना चाहिए। जैसा कि उनका अधिकतम आकार भी न्यूनतम एमटीयू है, उन्हें कभी भी खंडित नहीं किया जाना चाहिए। ICMP अनुरोध (पिंग्स, टाइमस्टैम्प आदि) हमेशा नए होंगे, और उत्तर स्थापित होंगे। अन्य राज्यों में ICMP पैकेट गिराएं।

हाल ही की सूची के साथ SSH उदाहरण और केवल बाद के SYN पैकेट स्वीकार करने के लिए, SMTP के लिए भी ऐसा ही किया जाना चाहिए, और अकेले IP पते डेटम पर "greylisting" के समान है।

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

अंत में, आँख बंद करके नियमों की नकल न करें जब तक कि आप वास्तव में यह नहीं समझते कि वे क्या करते हैं। नियमों की बहुत सी समान सूचियाँ ऐसा करती हैं, और अधिकांश समय, परिणाम हँसने योग्य होता है।


-2
#!/bin/bash
# The following iptables/ip6tables configurations have
# been kindly shared with us from ArckWiki. There are
# a few additions apart from what has been defined.
#
#=================Flush current definitions==============
    iptables -F
    ip6tables -F
    iptables -X
    ip6tables -X

#
#=================Chains=================================
#
#----Define chains for opened ports
    iptables -N TCP
    ip6tables -N TCP
    iptables -N UDP
    ip6tables -N UDP

#
#----Setting up the filter table for NAT
#   iptables -N fw-interfaces
#   ip6tables -N fw-interfaces
#   iptables -N fw-open
#   ip6tables -N fw-open

#
#================Default Chain reactions=================
#
#----Default FORWARD reaction
    iptables -P FORWARD DROP
    ip6tables -P FORWARD DROP

#
#----Default OUTPUT reaction
    iptables -P OUTPUT ACCEPT
    ip6tables -P OUTPUT ACCEPT

#
#----Shellshock
    iptables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP
    ip6tables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP

#
#----Default INPUT reaction
    iptables -P INPUT DROP
    ip6tables -P INPUT DROP
#
#----Drop spoofing packets
    iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan1 -s 127.0.0.0/8 -j DROP
    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 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

#
#================Ping rate limiting globally=============
    iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 30/min --limit-burst 8 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 --match limit --limit-burst 8 -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type 8 -j DROP
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 -j DROP

#
#----flooding RST packets, smurf attack Rejection
    iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Bogus packet DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP

#
#================RELATED,ESTABLISHED reaction============
    iptables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#
#================unfetered loopback======================
    iptables -A INPUT -i lo -j ACCEPT
    ip6tables -A INPUT -i lo -j ACCEPT

#
#================INVALID catagory of packets=============
    iptables -A INPUT -p 41 -j ACCEPT
    iptables -A INPUT --match conntrack --ctstate INVALID -j DROP
    ip6tables -A INPUT --match conntrack --ctstate INVALID -j DROP

#
#================IPv6 reactions and definitions==========
    ip6tables -A INPUT -s fe80::/10 -p icmpv6 -j ACCEPT
    ip6tables -t raw -A PREROUTING -p icmpv6 -s fe80::/10 -j ACCEPT
    ip6tables -t raw -A PREROUTING --match rpfilter -j ACCEPT
    ip6tables -t raw -A PREROUTING -j DROP
#
#=======Acceptable INVALIDs and a curteous response======
    iptables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    ip6tables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    iptables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP
    ip6tables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP

#
#================Defining the TCP and UDP chains
#
#########################################################
#            Notes for port open definitions            #
# It is important to note that this should be config-   #
# ured differently if you're providing any routing      #
# activity for any purpose. it is up to you to actively #
# define what suites your needs to get the job done.    #
# In this example, I'm exempting IPv6 from being able   #
# to interact with SSH protocols for two reasons. The   #
# first is because it is generally easier and more com- #
# for internal networks to be deployed with IPv4. The   #
# second reason is, IPv6 can be deployed globally.      #
#########################################################
#
#----SSH configured for eth0
    iptables -A TCP -i eth0 -p tcp --dport ssh -j ACCEPT

#!---Blocking SSH interactions in IPv6
    ip6tables -A TCP -p tcp --dport ssh -j DROP

#!---Leave commented for end service device
#   iptables -A TCP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 80 -j ACCEPT
#   iptables -A TCP -p tcp --dport 443 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 443 -j ACCEPT
#
#!---Uncomment for remote service to this device
#   iptables -A TCP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 22 -j ACCEPT
#
#!---Uncomment if you're providing routing services
#   iptables -A UDP -p udp 53 -j ACCEPT
#   ip6tables -A UDP -p udp 53 -j ACCEPT
#
#=================Tricking port scanners=================
#
#----SYN scans
    iptables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    ip6tables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    iptables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP
    ip6tables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP

#
#----UDP scans
    iptables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    ip6tables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    iptables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP
    ip6tables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP

#
#----For SMURF attack protection
    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 limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Ending all other undefined connections
    iptables -A INPUT -j DROP
    ip6tables -A INPUT -j DROP

#
#=======Defining the IN_SSH chain for bruteforce of SSH==
#
#!---I've elected to keep IPv6 out of this realm for
#!---ease of use
    iptables -N IN_SSH
    iptables -A INPUT -p tcp --dport ssh --match conntrack --ctstate NEW -j IN_SSH
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 4 --seconds 1800 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --set -j ACCEPT
    iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH

#
#==================Setting up a NAT gateway==============
#
#########################################################
#                                                       #
# I commented this half out because it's not something  #
# that will apply to all setups. Make note of all par-  #
# tinate interfaces and what exactly is going on.       #
#                                                       #
#########################################################
#
#----Setting up the FORWARD chain
#   iptables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#   ip6tables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#
#
#----Defining the fw-interfaces/open chains for FORWARD
#   iptables -A FORWARD -j fw-interfaces
#   ip6tables -A FORWARD -j fw-interfaces
#   iptables -A FORWARD -j fw-open
#   ip6tables -A FORWARD -j fw-open
#   iptables -A FORWARD -j DROP # Should be REJECT. But, fuck them
#   ip6tables -A FORWARD -j DROP
#   iptables -P FORWARD DROP
#   ip6tables -P FORWARD DROP
#
#
#----Setting up the nat table
#   iptables -A fw-interfaces -i ### -j ACCEPT
#   ip6tables -A fw-interfaces -i ### -j ACCEPT
#   iptables -t nat -A POSTROUTING -s w.x.y.z/S -o ppp0 -j MASQUERADE
#   ip6tables -t nat -A POSTROUTING -s fe::/10 -o ppp0 -j MASQUERADE
#----The above lines should be repeated specifically for EACH interface
#
#----Setting up the PREROUTING chain
#
#######################################################
#                             #
# The PREROUTING chain will redirect either port      #
# targets to be redirected. This can also redirect    #
# traffic inbound to your network from the gateway    #
# to this machine. This can be useful if you're using #
# a honeypot or have any service within your network  #
# that you want to be pointed to a specific device.   #
#                             #
#######################################################
#
#----SSH honeypot server
#   iptables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#----With intuition, you can configure the above to also direct specific
#----requests to other devices providing those services. The bellow will
#----be for a squid server
#   iptables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#   ip6tables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#
#===============Declare configurations=================
    iptables -nvL
    ip6tables -nvL

1
सभी चिल्लाते हुए, मैं आपके पोस्ट के संदेश को समझ नहीं सकता।
हिरण हंटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.