Iptables'dan belirli kuralları nasıl kaldırabilirim?


334

Sırasıyla 8006 ve 8007 numaralı bağlantı noktalarında özel HTTP ve HTTPS hizmetleri barındırıyorum. Sunucuyu "etkinleştirmek" için iptables kullanıyorum; yani gelen HTTP ve HTTPS bağlantı noktalarını yönlendirmek için:

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 

Bu bir cazibe gibi çalışır. Ancak sunucumu yeniden devre dışı bırakan başka bir komut dosyası oluşturmak istiyorum; iptables'ı yukarıdaki satırları çalıştırmadan önceki durumuna geri yükleyin. Ancak bu kuralları kaldırmak için sözdizimini bulmakta zorlanıyorum. Çalışıyor gibi görünen tek şey tam bir sifon:

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

Ancak bu, istenmeyen diğer iptables kurallarını da silecektir.


2
Bunun kullanmak daha olduğunu tespit ettik -Iyerine -Ailişkin ACCEPThatları. Bunun nedeni, tipik olarak, son satırın ( INPUTörneğin zincir için) bir DROPveya olmasıdır REJECTve kuralınızın bundan önce gelmesini istersiniz. -Ayeni kuralı son kuralın arkasına koyarken -I, başlangıçta koyar.
— Mark Lakata

Yanıtlar:


471

Aynı komutları yürütün ancak "-A" yerine "-D" yazın. Örneğin:

iptables -A ...

olur

iptables -D ...

7
Aynı türden birkaç kuralınız varsa, hepsini kaldırmaz.
— ETech

4
Bu -D komutunu birden çok kez çalıştırmayı deneyin ve hepsini siler.
— Zhenyu Li

4
aynı komutu yürüttüm, ama -I yerine -D ile. Ama ben KÖTÜ KURAL (eşleşen bir kural var mı) ...
— Ben

4
-IVeya ile bir kural eklediyseniz -Ryine de ile silebilirsiniz -D.
— David Xia

Sadece bir not. 'İptables -A ...' ile bir kural oluşturdum ve kural ortaya çıktı ama etkili olmadı. 'İptables -D ...' kullanıldığında yanıt Kötü kural oldu . Buna rağmen kural silindi. Kural 'sudo iptables -nvL' ile görülebilir. Kullandığım zincir 'INPUT' idi.
— Ben Paz

446

Kuralın numarasını da ( --line-numbers ) kullanabilirsiniz:

iptables -L INPUT --line-numbers

Örnek çıktı:

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

Dolayısıyla, ikinci kuralı silmek isterseniz:

iptables -D INPUT 2

Güncelleme

(D) belirli bir tablo kullanıyorsanız (örn. Nat), tabloyu delete komutuna eklemeniz gerekir (yorum için @ThorSummoner'a thx)

sudo iptables -t nat -D PREROUTING 1

4
Her iki çözüm de hoş, ancak satır numarası bilinmediğinde bu komut dosyası ayarlı bir ortamda çalışmaz. Yani diğer çözüm IMO daha genel ve dolayısıyla daha doğru.
— Jeroen

2
Hattı bilmiyorsanız, bir yorum (aralarında cevap gibi) kullanabilir veya kuralınız için bir grep yapabilirsiniz:iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
— domi27

6
Bu, yalnızca tablonun herhangi bir zamanda kurallar ekleyememesi durumunda iyidir. Aksi takdirde satır numaraları, bunları gözlemleme ve silme kuralını yürütme arasında değişebilir. Böyle bir durumda, zaman penceresinin o kadar kısa olduğunu varsaymak güvensizdir ("gerçekleşmesi pek mümkün değildir").
— Nick

14
Bir kuralı silerseniz, kalanın satır numaralarının değiştiğini unutmayın. Kural 5, 10 ve 12'yi silmeniz gerekiyorsa ... 12, 10, sonra 5'i silin.
— TomOnTime

2
PREROUTING kurallarını silmeye çalışırken -t nat, örneğin: belirtmek zorunda kaldım sudo iptables -t nat --line-numbers -Lve bunları da silmek zorunda kaldım -t nat, örneğin: sudo iptables -t nat -D PREROUTING 1(
— Cevaba eklemeye değebilir

31

Herhangi bir sorun olmadan benim için çalışan en iyi çözüm şu şekilde görünüyor:
1. Bazı yorumlarla geçici kural ekleyin:

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

2. Kural eklendiğinde ve kaldırmak istediğinizde (veya bu açıklamaya sahip her şeyde) aşağıdakileri yapın:

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

Böylece, $ yorumuyla eşleşen tüm kuralları% 100 silecek ve diğer satırlara dokunulmayacaksınız. Bu çözüm, son 2 ay boyunca günde yaklaşık 100 kural değişikliği ile çalışır - sorun yok.


2
Iptables-save / restore yoksa:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
— Mansour

Gerçek yaşamda kullanım için: CRON 1) eski spamhausiptables yasaklarını sil , 2) spamhaus.org/drop , 3) CIDR IP'leri için grep veiptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
— Xeoncross

2
@Mansour Veya iptables -S | sed "/$comment/s/-A/iptables -D/e";) gibi bu
— hek2mgl

@ hek2mgl sed pes etmiyor, değil mi? =] Teşekkürler, bu yeteneği aklımda tutacağım (sözdizimini bir gün içinde unutacağım).
— Mansour

sed sadece "-" uuid'den kaldırmak için kullanılır. Her durumda, sed sözdizimine sahip olduğunuzda - asla unutulmaz. ))
— ETech

11

İlk olarak tüm iptables kurallarını bu komutla listeleyin:

iptables -S

şöyle listeler:

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

Ardından istediğiniz satırı kopyalayın ve silmek için -Aile değiştirin -D:

iptables -D XYZ -p ...

2
Farkında olmak! Bu eksik cevap. El kitabında "-S" hakkında: "Diğer tüm iptables komutlarında olduğu gibi, belirtilen tablo için geçerlidir (filtre varsayılan değerdir).". Yani, bu anahtarı kullanmanız durumunda - tüm tablolar için tekrarlanmalıdır: nat, mangle, vb
— pmod

1
Benim durumumda, iptables: Bad rule (does a matching rule exist in that chain?).şimdi ne alacağım ?
— Abdull

Ah, anladım - sil komutumda tablo belirtimi eksikti. Yani durumda tablodan tüm kuralları listelemek natile sudo iptables -S -t natve kopyalama, döndürülen kurallardan birini silmek istiyor yeterli değildir. Eklemek zorundasınız -t nat, örn sudo iptables -D ... -t nat.
— Abdull

Anlaması kolay!
— sknight

5

-DKomutu kullanın , mansayfa bunu şöyle açıklar:

-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.

Farkında mısın diğer tüm komut (gibi bu komutu -A, -I) belli masanın üzerinde çalışır. Varsayılan tabloda ( filtertablo) çalışmazsanız ,-t TABLENAME o hedef tabloyu belirtmek için .

Eşleşecek bir kuralı silme

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

Not: Bu yalnızca eşleşen ilk kuralı siler. Eşleşen birçok kuralınız varsa (bu iptables'da olabilir), bunu birkaç kez çalıştırın.

Sayı olarak belirtilen bir kuralı silme

iptables -D INPUT 2

Sayıyı saymak dışında, satır numarasını --line-numberparametre ile listeleyebilirsiniz, örneğin:

iptables -t nat -nL --line-number

Bunu --line numarası ile buldum en iyisi
— Davuz

Evet! Süper! Bütün istemiyorumiptables -F
— Dev Anand Sadasivam

2

NAT kurallarını kaldırmak istiyorsanız,

Aşağıdaki komutu kullanarak ekteki IPtables listesini listeleyin,

# 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 kuralı IPtables'dan kaldırmak isterseniz, komutu yürütün,

# sudo iptables -F -t nat -v

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

Ardından, şunu doğrulayabilirsiniz:

# sudo iptables -L -t nat -v
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.