मैं iptables से विशिष्ट नियम कैसे निकाल सकता हूं?


334

मैं पोर्ट्स 8006 और 8007 पर क्रमशः विशेष HTTP और HTTPS सेवाओं की मेजबानी कर रहा हूं। मैं सर्वर को "सक्रिय" करने के लिए iptables का उपयोग करता हूं; आने वाले HTTP और HTTPS पोर्ट को रूट करने के लिए:

iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8006 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8007 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8006 
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8007  
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8006
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-ports 8007 

यह एक आकर्षण की तरह काम करता है। हालाँकि मैं एक और स्क्रिप्ट बनाना चाहूंगा जो मेरे सर्वर को फिर से निष्क्रिय कर दे; ऊपर की पंक्तियों को चलाने से पहले राज्य को iptables बहाल करना। हालाँकि मुझे इन नियमों को हटाने के लिए सिंटैक्स का पता लगाने में मुश्किल समय आ रहा है। काम करने के लिए लगता है कि केवल एक ही चीज़ है:

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

लेकिन यह भी अन्य iptables नियमों को हटा देगा जो अवांछित है।


2
मैंने पाया है कि यह उपयोग करने के लिए बेहतर है -Iके बजाय -Aके लिए ACCEPTलाइनों। ऐसा इसलिए है क्योंकि आम तौर पर, अंतिम पंक्ति ( INPUTउदाहरण के लिए श्रृंखला) एक DROPया है REJECTऔर आप चाहते हैं कि इससे पहले आपका नियम आए। -Aनए नियम को अंतिम नियम के बाद -Iरखता है , जबकि इसे शुरू में रखता है।
मार्क लकाटा जूल

जवाबों:


471

समान आदेशों को निष्पादित करें लेकिन "-ए" को "-D" के साथ बदलें। उदाहरण के लिए:

iptables -A ...

हो जाता है

iptables -D ...

7
यदि आपके पास एक तरह के कई नियम हैं, तो यह उन सभी को नहीं हटाएगा।
ईटेक

4
इस -D कमांड को कई बार निष्पादित करने का प्रयास करें, और यह उन सभी को हटा देगा।
झेनयु ली

4
मैं एक ही कमांड को अंजाम दिया, लेकिन -I के बजाय -D के साथ। लेकिन मुझे BAD RULE (एक मेल नियम मौजूद है) ...
बेन

4
यदि आपने एक नियम जोड़ा है -Iया -R, आप अभी भी इसे हटा सकते हैं -D
डेविड ज़िया

सिर्फ एक नोट। मैं 'iptables -A ...' के साथ एक नियम बनाता हूं और नियम दिखाई दिया लेकिन प्रभावी नहीं था। 'Iptables -D ...' का उपयोग करने पर प्रतिक्रिया खराब नियम थी । यहां तक ​​कि नियम को हटा दिया गया था। नियम 'sudo iptables -nvL' के साथ दिखाई दे रहा था। मेरे द्वारा इस्तेमाल की जाने वाली श्रृंखला 'INPUT' थी।
बेन पाज़

446

आप नियम के नंबर ( --line- नंबर ) का भी उपयोग कर सकते हैं :

iptables -L INPUT --line-numbers

उदाहरण आउटपुट:

Chain INPUT (policy ACCEPT) 
    num  target prot opt source destination
    1    ACCEPT     udp  --  anywhere  anywhere             udp dpt:domain 
    2    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:domain 
    3    ACCEPT     udp  --  anywhere  anywhere             udp dpt:bootps 
    4    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:bootps

इसलिए यदि आप दूसरा नियम हटाना चाहते हैं:

iptables -D INPUT 2

अपडेट करें

यदि आप एक विशिष्ट तालिका (जैसे nat) का उपयोग करते हैं, तो आपको इसे डिलीट कमांड में जोड़ना होगा (टिप्पणी के लिए @ThorSummoner पर)

sudo iptables -t nat -D PREROUTING 1

4
दोनों समाधान अच्छे हैं, लेकिन लाइन नंबर अज्ञात होने पर यह स्क्रिप्टेड सेटिंग में काम नहीं करेगा। तो अन्य समाधान अधिक सामान्य है, और इसलिए अधिक सही, आईएमओ।
जेरोएन

2
यदि आप उस पंक्ति को नहीं जानते हैं जो आप टिप्पणी का उपयोग कर सकते हैं (जैसे उत्तर के बीच) या अपने नियम के लिए एक iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
संक्षिप्त विवरण करें

6
यह तभी ठीक होता है जब तालिका में किसी भी समय नियम सम्मिलित नहीं किए जा सकते। अन्यथा लाइन नंबर उन्हें देखने और हटाने नियम को निष्पादित करने के बीच बदल सकते हैं। ऐसे मामले में, यह मानना ​​असुरक्षित है कि समय खिड़की इतनी कम है कि "यह कभी होने की संभावना नहीं है"।
निक

14
याद रखें कि यदि आप एक नियम को हटाते हैं, तो शेष संख्याओं की रेखा संख्या बदल जाती है। इसलिए, यदि आपको नियम 5, 10, और 12 को हटाने की आवश्यकता है ... उन्हें 12, 10 हटाएं, तो 5.
टॉमऑन टाइम

2
जब मेरे द्वारा निर्दिष्ट नियमों को हटाने की कोशिश की जा रही थी -t nat, उदाहरण के लिए: sudo iptables -t nat --line-numbers -Lऔर उन्हें -t natभी हटा दें, जैसे: sudo iptables -t nat -D PREROUTING 1(जवाब में जोड़ने लायक हो सकता है?)
ThorSummoner

31

सबसे अच्छा समाधान जो बिना किसी समस्या के मेरे लिए काम करता है वह इस तरह दिखता है:
1. कुछ टिप्पणी के साथ अस्थायी नियम जोड़ें:

comment=$(cat /proc/sys/kernel/random/uuid | sed 's/\-//g')
iptables -A ..... -m comment --comment "${comment}" -j REQUIRED_ACTION

2. जब नियम जोड़ा गया और आप इसे हटाना चाहते हैं (या इस टिप्पणी के साथ सब कुछ), करें:

iptables-save | grep -v "${comment}" | iptables-restore

इसलिए, आप $ टिप्पणी से मेल खाने वाले सभी नियमों को हटा देंगे और अन्य पंक्तियों को अछूता नहीं छोड़ेंगे। यह समाधान पिछले 2 महीनों के लिए प्रति दिन लगभग 100 नियमों के परिवर्तन के साथ काम करता है - कोई समस्या नहीं। हालांकि, यह मदद करता है


2
यदि आपके पास iptables-save / restore नहीं है:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
Mansour

क्रॉन 1) हटाने वर्ष: एक वास्तविक जीवन के उपयोग के लिए spamhausiptables प्रतिबंध, 2) हड़पने spamhaus.org/drop , 3) सीआईडीआर आईपी के लिए ग्रेप औरiptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
Xeoncross

2
@ मंसूर या iptables -S | sed "/$comment/s/-A/iptables -D/e";) इस
hek2mgl

@ hek2mgl sed नहीं देता है, क्या यह? =] धन्यवाद, मैं इस क्षमता को ध्यान में रखूंगा (मैं एक दिन में वाक्यविन्यास को भूल जाऊंगा)।
मंसूर

यूडिड से "-" को हटाने के लिए sed का उपयोग किया जाता है। किसी भी मामले में, एक बार जब आप sed सिंटैक्स प्राप्त कर लेते हैं - तो इसे कभी नहीं भुलाया जा सकता है। ))
ईटेक

11

इस आदेश के साथ सभी iptables नियमों को पहले सूचीबद्ध करें:

iptables -S

यह इस तरह सूचीबद्ध करता है:

-A XYZ -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

फिर वांछित लाइन की प्रतिलिपि बनाएँ, और इसे हटाने के लिए बस प्रतिस्थापित -Aकरें -D:

iptables -D XYZ -p ...

2
जागरूक रहें! यह अधूरा जवाब है। "-S" के बारे में मैनुअल से: "हर दूसरे iptables कमांड की तरह, यह निर्दिष्ट तालिका पर लागू होता है (फ़िल्टर डिफ़ॉल्ट है)।" तो, इस स्विच का उपयोग करने के मामले में - सभी तालिकाओं के लिए दोहराया जाना चाहिए: नट, मैंगल, आदि
pmod

1
मेरे मामले में, मुझे iptables: Bad rule (does a matching rule exist in that chain?).अब क्या मिलेगा ?
अब्दुल

आह, यह समझ से बाहर - मेरे हटाए गए आदेश तालिका विनिर्देश गायब था। इसलिए यदि आप तालिका से सभी नियमों को सूचीबद्ध natकरते हैं sudo iptables -S -t natऔर आप लौटे नियमों में से एक को हटाना चाहते हैं, तो कॉपी करना पर्याप्त नहीं है। आपको जोड़ना होगा -t nat, जैसे sudo iptables -D ... -t nat
अब्दुल

समझने में आसान!
रात

5

-Dआदेश का उपयोग करें , यह है कि manपृष्ठ इसे कैसे समझाता है:

-D, --delete chain rule-specification
-D, --delete chain rulenum
    Delete  one  or more rules from the selected chain.  
    There are two versions of this command: 
    the rule can be specified as a number in the chain (starting at 1 for the first rule) or a rule to match.

इस आदेश को महसूस करें, जैसे कि अन्य सभी कमांड ( -A, -I) निश्चित तालिका पर काम करते हैं। यदि आप डिफ़ॉल्ट तालिका ( filterतालिका) पर काम नहीं कर रहे हैं , तो -t TABLENAMEउस लक्ष्य तालिका को निर्दिष्ट करने के लिए उपयोग करें।

मिलान करने के लिए एक नियम हटाएं

iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

नोट: यह केवल मिलान किए गए पहले नियम को हटाता है। यदि आपके पास कई नियम हैं (यह iptables में हो सकता है), तो इसे कई बार चलाएं।

एक संख्या के रूप में निर्दिष्ट नियम हटाएं

iptables -D INPUT 2

संख्या की गिनती के अलावा आप --line-numberपैरामीटर के साथ लाइन-संख्या को सूचीबद्ध कर सकते हैं , उदाहरण के लिए:

iptables -t nat -nL --line-number

मैंने पाया कि इसके साथ - लाइन-नंबर सबसे अच्छा है
दावुज

हाँ! उत्तम! संपूर्ण नहीं चाहते हैंiptables -F
देव आनंद सदाशिवम

2

मान लें कि, यदि आप NAT नियम हटाना चाहते हैं,

नीचे दिए गए कमांड का उपयोग करके संलग्न IPtables की सूची बनाएं,

# sudo iptables -L -t nat -v

Chain PREROUTING (policy ACCEPT 18 packets, 1382 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    7   420 DNAT       tcp  --  any    any     anywhere             saltmaster           tcp dpt:http to:172.31.5.207:80
    0     0 DNAT       tcp  --  eth0   any     anywhere             anywhere             tcp dpt:http to:172.31.5.207:8080

यदि आप IPtables से नेट नियम को निकालना चाहते हैं, तो बस कमांड निष्पादित करें,

# sudo iptables -F -t nat -v

Flushing chain `PREROUTING'
Flushing chain `INPUT'
Flushing chain `OUTPUT'
Flushing chain `POSTROUTING'

फिर, आप यह सत्यापित कर सकते हैं कि,

# sudo iptables -L -t nat -v
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.