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.