ฉันจะลบกฎเฉพาะออกจาก iptables ได้อย่างไร


334

ฉันโฮสต์บริการ HTTP และ HTTPS พิเศษบนพอร์ต 8006 และ 8007 ตามลำดับ ฉันใช้ 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วางกฎไว้ที่จุดเริ่มต้น
Mark Lakata

คำตอบ:


471

ดำเนินการคำสั่งเดียวกัน แต่แทนที่ "-A" ด้วย "-D" ตัวอย่างเช่น:

iptables -A ...

กลายเป็น

iptables -D ...

7
หากคุณมีกฎหลายข้อมันจะไม่ลบกฎทั้งหมด
ETech

4
พยายามเรียกใช้งานคำสั่ง -D นี้หลายครั้งและจะลบทั้งหมด
Zhenyu Li

4
ฉันรันคำสั่งเดียวกัน แต่ใช้ -D แทน -I แต่ฉันได้รับ BAD RULE (มีกฎการจับคู่อยู่หรือไม่) ...
Ben

4
หากคุณเพิ่มกฎด้วย-Iหรือคุณยังสามารถลบมันด้วย-R -D
David Xia Xia

เพียงแค่ทราบ ฉันสร้างกฎด้วย 'iptables -A ... ' และกฎปรากฏขึ้น แต่ไม่มีประสิทธิภาพ เมื่อใช้ 'iptables -D ...' การตอบสนองเป็นกฎที่ไม่ดี ถึงกระนั้นกฎก็ถูกลบไป กฎนั้นปรากฏด้วย 'sudo iptables -nvL' ห่วงโซ่ที่ฉันใช้คือ 'อินพุต'
Ben Paz

446

คุณอาจใช้หมายเลขของกฎ ( - หมายเลขบรรทัด ):

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

ปรับปรุง

หากคุณใช้ (d) ตารางเฉพาะ (เช่น nat) คุณจะต้องเพิ่มลงในคำสั่งลบ (ขอบคุณไปยัง @ThorSummoner สำหรับความคิดเห็น)

sudo iptables -t nat -D PREROUTING 1

4
ทั้งสองวิธีแก้ปัญหาได้ดี แต่วิธีนี้ไม่สามารถใช้งานได้ในการตั้งค่าสคริปต์เมื่อไม่ทราบหมายเลขบรรทัด ดังนั้นวิธีแก้ปัญหาอื่นจึงกว้างกว่าและถูกต้องกว่า IMO
Jeroen

2
ดีถ้าคุณไม่ทราบวงเงินที่คุณอาจจะใช้ความคิดเห็น (เหมือนคำตอบในหมู่) หรือทำ grep สำหรับกฎของคุณ:iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
domi27

6
นี่เป็นเรื่องปกติถ้าตารางไม่สามารถแทรกกฎได้ตลอดเวลา มิฉะนั้นหมายเลขบรรทัดอาจเปลี่ยนแปลงระหว่างการสังเกตพวกเขาและดำเนินการตามกฎการลบ ในกรณีเช่นนี้มันไม่ปลอดภัยที่จะสันนิษฐานว่าช่วงเวลานั้นสั้นจนไม่น่าจะเกิดขึ้นได้
Nick

14
โปรดจำไว้ว่าถ้าคุณลบกฎหนึ่งหมายเลขบรรทัดของการเปลี่ยนแปลงที่เหลือ ดังนั้นหากคุณต้องการลบกฎ 5, 10 และ 12 ... ลบออก 12, 10 จากนั้น 5
TomOnTime

2
เมื่อพยายามลบกฎ PREROUTING ที่ฉันต้องระบุ-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

ดังนั้นคุณจะลบกฎทั้งหมดที่ตรงกับความคิดเห็นของ $ 100 และออกจากสายอื่น ๆ ที่ไม่มีใครแตะต้อง โซลูชันนี้ใช้งานได้ 2 เดือนล่าสุดโดยมีการเปลี่ยนแปลงกฎประมาณ 100 ข้อต่อวัน - ไม่มีปัญหาหวังว่าจะช่วยได้


2
ในกรณีที่คุณไม่มี iptables-save / restore:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
Mansour

สำหรับการใช้งานในชีวิตจริง: CRON 1) ลบspamhausiptables แบนเก่า2) คว้าspamhaus.org/drop , 3) grep สำหรับ CIDR IP และiptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
Xeoncross

2
@Mourour Or iptables -S | sed "/$comment/s/-A/iptables -D/e";) แบบนี้
hek2mgl

@ hek2mgl sed ไม่ยอมแพ้ใช่ไหม? =] ขอบคุณฉันจะใช้ความสามารถนี้ในใจ (ฉันจะลืมไวยากรณ์ในหนึ่งวัน)
Mansour

sed ใช้เพื่อลบ "-" จาก uuid ไม่ว่าในกรณีใดเมื่อคุณได้รับซินแทกซ์แล้วมันจะไม่มีวันลืม ))
ETech

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 อื่น ๆ ทุกคำสั่งจะใช้กับตารางที่ระบุ (ตัวกรองคือค่าเริ่มต้น)" ดังนั้นในกรณีที่ใช้สวิตช์นี้ - ควรทำซ้ำสำหรับตารางทั้งหมด: nat, mangle ฯลฯ
pmod

1
ในกรณีของฉันฉันได้iptables: Bad rule (does a matching rule exist in that chain?).อะไรตอนนี้
Abdull

อ่าคิดออก - คำสั่งลบของฉันไม่มีข้อมูลจำเพาะตาราง ดังนั้นในกรณีที่คุณแสดงรายการกฎทั้งหมดจากตารางnatด้วยsudo iptables -S -t natและคุณต้องการลบหนึ่งในกฎที่ส่งคืนการคัดลอกไม่เพียงพอ คุณจะต้องเพิ่มเช่น-t nat sudo iptables -D ... -t nat
Abdull

เข้าใจง่าย!
sknight

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

ฉันพบอันนี้ด้วย --line-number ที่ดีที่สุด
Davuz

ใช่ สุดยอด! ไม่ต้องการทั้งหมดiptables -F
Dev Anand Sadasivam

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

หากคุณต้องการที่จะลบกฎ nat ออกจาก 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.