ลบ iptables chain ด้วยกฎทั้งหมด


31

ฉันมีห่วงโซ่ต่อท้ายด้วยกฎมากมายเช่น:

> :i_XXXXX_i - [0:0]
> -A INPUT -s 282.202.203.83/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.62.253/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.60.62/32 -j i_XXXXX_i 
> -A INPUT -s 224.93.27.235/32 -j i_XXXXX_i 
> -A OUTPUT -d 282.202.203.83/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.62.253/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.60.62/32 -j i_XXXXX_i 
> -A OUTPUT -d 224.93.27.235/32 -j i_XXXXX_i

เมื่อฉันพยายามลบห่วงโซ่นี้ด้วย:

iptables -X XXXX

แต่มีข้อผิดพลาดเช่น (ลอง iptables -F XXXXX มาก่อน):

iptables: มีลิงก์มากเกินไป

มีวิธีง่ายๆในการลบห่วงโซ่โดยคำสั่งครั้งเดียว?


2
ฉันไม่เห็น iptables barf แบบนั้นมาก่อนเมื่อพยายามจะล้างออก
Tom O'Connor

แค่อยากรู้ว่า ... "กฎ" มีกฎกี่ข้อ?
Ladadadada

1
2 มากมายเป็นจำนวนมาก :) ถ้าฉันพยายามลบกฎก่อนมันจะชอบพิมพ์หลายครั้ง: iptables -D OUTPUT -d XXX / 32 -j i_XXXXX__i
timy

3
ลองสิ่งนี้:iptables-save | grep -v i_XXXXX_i | iptables-restore
สตีเวนวันจันทร์

@StevenMonday ทำไมไม่เขียนเป็นคำตอบนี้เป็นหนึ่งที่มีประโยชน์มากที่สุด (ทางเลือกทำผ่านไฟล์และแก้ไขไฟล์) สิ่งเดียวที่มันไม่เอาเป็นตารางฉบับสมบูรณ์ ( "ดิบ" อยู่แล้ว)
nhed

คำตอบ:


38

คุณไม่สามารถลบเครือข่ายได้เมื่อกฎที่มี '-j CHAINTODELETE' กำลังอ้างอิงอยู่ คิดออกสิ่งที่อ้างอิงถึงห่วงโซ่ของคุณ (ลิงค์) และลบออก นอกจากนี้ให้ล้างแล้วฆ่า

-F, - ฟลัช [เชน]

ล้างโซ่ที่เลือกไว้ (โซ่ทั้งหมดในตารางหากไม่มีให้) สิ่งนี้เทียบเท่ากับการลบกฎทั้งหมดทีละรายการ

-X, - ลบโซ่ [chain]

ลบสายโซ่ที่ผู้ใช้กำหนดเองที่ระบุไว้ที่ระบุไว้ จะต้องไม่มีการอ้างอิงถึงห่วงโซ่ หากมีคุณต้องลบหรือแทนที่กฎการอ้างอิง ก่อนที่จะสามารถลบเชนได้ ห่วงโซ่จะต้องว่างเปล่ากล่าวคือไม่มีกฎใด ๆ หากไม่มีการกำหนดอาร์กิวเมนต์มันจะพยายามลบทุกโซ่ที่ไม่ใช่ builtin ในตาราง


ฉันแค่ต้องการหาวิธีที่จะลบห่วงโซ่ (มีกฎอ้างอิง '-j CHAINTODELETE' จำนวนมาก) โดยตรง แต่จากคำตอบของคุณดูเหมือนว่าเป็นไปไม่ได้ :(
timy

1
@timy StevenMonday ความคิดเห็นของ single-pass จะลบการอ้างอิงใด ๆ ไปยังห่วงโซ่ อาจจะไม่เหมาะ แต่ก็ใกล้เข้ามา
Jeff Ferland

12

นี่อาจเป็นนอกหัวข้อ แต่เป็นสิ่งที่ฉันทำหลังจากที่ฉันพบโพสต์นี้! สำหรับการใช้งานบางกรณีตัวเลือก iptables -D อาจมีประโยชน์ เนื่องจากช่วยให้คุณสามารถล้างกฎการอ้างอิงที่เพิ่มเข้ามาทางโปรแกรมด้วย - (ถ้าคุณรู้วิธีเพิ่มกฎเหล่านั้นอย่างแม่นยำ)

เช่น

    iptables -N MYCHAIN
    iptables -A INPUT -i interface -j MYCHAIN
    iptables -A MYCHAIN -j ACCEPT

สามารถย้อนกลับได้ด้วย

   iptables -D INPUT -i interface -j MYCHAIN
   iptables --flush MYCHAIN
   iptables -X MYCHAIN

8

คุณจำเป็นต้องมีขั้นตอนที่สอง แต่ตอนนี้ไม่ได้ในหนึ่งคำสั่ง

สร้างไฟล์และวางไว้ในนั้น

# Empty the entire filter table
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

บันทึกไฟล์เป็น "clear-all-rules" ตอนนี้ทำคำสั่งนี้:

iptables-restore < clear-all-rules

ตอนนี้คุณสามารถล้างมันได้ทุกเวลาด้วยคำสั่งเดียว


1
+1 นี่เป็นวิธีที่เร็วที่สุดในการเริ่มต้นด้วยการกำหนดค่าแบบ fw ใหม่ทั้งหมด
dr01

6

นี่คือแผนสำรอง มันเกี่ยวข้องกับสามคำสั่งไม่ใช่อย่างเดียว แต่ด้วยโชคมันควรจะทำงานได้

ทิ้งiptablesruleset ของคุณเป็นไฟล์:

iptables-save > /tmp/iptables.txt

ลบการใช้งานทั้งหมดของ (และการอ้างอิงถึง) ห่วงโซ่ที่ละเมิด:

sed -i '/i_XXXXX_i/d' /tmp/iptables.txt

จากนั้นโหลดชุดกฎ:

iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt

0

บางสิ่งตามสายเหล่านี้จะทำให้พวกเขาทั้งหมดในบรรทัดเดียวโดยไม่ต้อง iptables ลงในทางใดทางหนึ่ง

for chain in `iptables -L |grep i_XXXXX_i|awk '{ print $2 }'`; do iptables -X $chain; done

0

ในไฟล์ man iptables มีตัวเลือก -S

S, - รายการกฎ [โซ่] พิมพ์กฎทั้งหมดในห่วงโซ่ที่เลือก หากไม่ได้เลือกเชนใดเชนทั้งหมดจะถูกพิมพ์เช่น iptables-save เช่นเดียวกับคำสั่ง iptables อื่น ๆ มันใช้กับตารางที่ระบุ (ตัวกรองเป็นค่าเริ่มต้น)

iptables -S | grep <CHAINNAMEHERE>โดยการใช้ ตัวอย่าง:

root @ root: ~ # iptables -S | TRAFFICLOG grep

-N TRAFFICLOG

-A ไปข้างหน้า -i eth0 -j TRAFFICLOG

จากนั้นคุณสามารถดูว่ากฎใดบล็อกการลบของเชนจากตาราง ผ่านแต่ละกฎ (ยกเว้นiptables -N <CHAINNAMEHERE>และลบกฎโดยใช้-Dตัวเลือก

-D, - ลบรูเล็ตของห่วงโซ่ลบกฎอย่างน้อยหนึ่งกฎออกจากเชนที่เลือก คำสั่งนี้มีสองรุ่น: กฎสามารถระบุเป็นตัวเลขในกลุ่ม (เริ่มต้นที่ 1 สำหรับกฎแรก) หรือกฎที่จะจับคู่

iptables -D FORWARD -i eth0 -j TRAFFICLOGเช่น หลังจากที่คุณลบแต่ละกฎสำหรับ chain ของคุณให้ล้าง chain ด้วย-Fตัวเลือก, iptables -F <CHAINNAMEHERE>.

-F, - ฟลัช [เชน] ล้างเชนที่เลือก (เชนทั้งหมดในตารางหากไม่มีการระบุ) สิ่งนี้เทียบเท่ากับการลบกฎทั้งหมดทีละรายการ

จากนั้นลบห่วงโซ่ของคุณด้วย-Xตัวเลือกiptables -X <CHAINNAMEHERE>

-X, - ลบโซ่ [โซ่] ลบห่วงโซ่ที่ผู้ใช้กำหนดตัวเลือกที่ระบุ จะต้องไม่มีการอ้างอิงถึงห่วงโซ่ หากมีคุณต้องลบหรือแทนที่กฎการอ้างอิงก่อนที่จะสามารถลบเชนได้ ห่วงโซ่จะต้องว่างเปล่ากล่าวคือไม่มีกฎใด ๆ หากไม่มีการกำหนดอาร์กิวเมนต์มันจะพยายามลบทุกโซ่ที่ไม่ใช่ builtin ในตาราง

Iptables เป็นชุดเครื่องมือที่ซับซ้อนดังนั้นจึงจำเป็นต้องมีการสอนที่เหมาะสม คุณสามารถลองใช้ได้ที่www.iptables.info


0

นี่จะคายโซ่และลบออก

for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i  ; done

0

ฉันพบว่าคุณสามารถลบกฎและสายโซ่ได้โดยแก้ไขไฟล์กฎใน /etc/iptables/rules.v4 หากคุณลบเชนที่ไม่ต้องการในไฟล์นี้จากนั้นโหลด iptables อีกครั้งคุณไม่ควรเห็นเชนเมื่อทำ iptables -L


แฟ้มนี้มีอยู่เฉพาะบนลินุกซ์บางและหลังจากนั้นเพียงในบางรุ่นของลินุกซ์บางอย่าง
Michael Hampton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.