Bagaimana saya bisa menghapus aturan khusus dari iptables?

334

Saya hosting layanan HTTP dan HTTPS khusus di masing-masing port 8006 dan 8007. Saya menggunakan iptables untuk "mengaktifkan" server; yaitu untuk merutekan port HTTP dan HTTPS yang masuk:

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 

Ini bekerja seperti pesona. Namun saya ingin membuat skrip lain yang menonaktifkan server saya lagi; yaitu mengembalikan iptables ke keadaan sebelum menjalankan baris di atas. Namun saya mengalami kesulitan mencari tahu sintaks untuk menghapus aturan-aturan ini. Satu-satunya hal yang tampaknya berhasil adalah flush lengkap:

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

Tapi itu juga akan menghapus aturan iptables lain yang tidak diinginkan.

Jeroen
sumber
2
Saya telah menemukan bahwa lebih baik menggunakan -Idaripada -Auntuk ACCEPTgaris. Ini karena biasanya, baris terakhir (untuk INPUTrantai misalnya) adalah a DROPdan REJECTdan Anda ingin aturan Anda datang sebelum itu. -Amenempatkan aturan baru setelah aturan terakhir, sementara -Imenempatkannya di awal.
Mark Lakata

Jawaban:

471

Jalankan perintah yang sama tetapi ganti "-A" dengan "-D". Sebagai contoh:

iptables -A ...

menjadi

iptables -D ...
Eli Rosencruft
sumber
7
Jika Anda memiliki beberapa aturan sejenis, itu tidak akan menghapus semuanya.
ETech
4
coba jalankan perintah -D ini beberapa kali, dan itu akan menghapus semuanya.
Zhenyu Li
4
saya mengeksekusi perintah yang sama, tetapi dengan -D bukan -I. Tapi saya mendapatkan ATURAN BURUK (apakah ada aturan yang cocok) ...
Ben
4
Jika Anda menambahkan aturan dengan -Iatau -R, Anda masih dapat menghapusnya dengan -D.
David Xia
Hanya sebuah catatan. Saya membuat aturan dengan 'iptables -A ...' dan aturan itu muncul tetapi tidak efektif. Setelah menggunakan 'iptables -D ...' jawabannya adalah aturan yang salah . Meski begitu aturannya sudah dihapus. Aturannya terlihat dengan 'sudo iptables -nvL'. Rantai yang saya gunakan adalah 'INPUT'.
Ben Paz
446

Anda juga dapat menggunakan nomor aturan ( - nomor baris ):

iptables -L INPUT --line-numbers

Contoh output:

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

Jadi, jika Anda ingin menghapus aturan kedua:

iptables -D INPUT 2

Memperbarui

Jika Anda menggunakan (d) tabel tertentu (misalnya nat), Anda harus menambahkannya ke perintah hapus (thx ke @ThorSummoner untuk komentar)

sudo iptables -t nat -D PREROUTING 1
domi27
sumber
4
Kedua solusi bagus, tetapi yang ini tidak akan berfungsi dalam pengaturan yang ditulis ketika nomor baris tidak diketahui. Jadi solusi lain lebih umum, dan karena itu lebih benar, IMO.
Jeroen
2
Nah, jika Anda tidak tahu iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
kalimatnya,
6
Ini baik-baik saja hanya jika tabel tidak dapat memiliki aturan dimasukkan pada suatu titik waktu Kalau tidak, nomor baris dapat berubah antara mengamatinya dan menjalankan aturan penghapusan. Dalam kasus seperti itu, tidak aman untuk mengasumsikan bahwa jendela waktu sangat singkat sehingga "tidak mungkin terjadi".
Nick
14
Ingatlah bahwa jika Anda menghapus satu aturan, nomor baris dari sisanya berubah. Jadi, jika Anda perlu menghapus aturan 5, 10, dan 12 ... hapus 12, 10, lalu 5.
TomOnTime
2
Saat mencoba menghapus aturan -t natsudo iptables -t nat --line-numbers -L-t natsudo iptables -t nat -D PREROUTING 1
PEMECAHAN MASALAH
31

Solusi terbaik yang bekerja untuk saya tanpa masalah terlihat seperti ini:
1. Tambahkan aturan sementara dengan beberapa komentar:

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

2. Ketika aturan ditambahkan dan Anda ingin menghapusnya (atau semuanya dengan komentar ini), lakukan:

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

Jadi, Anda akan 100% menghapus semua aturan yang cocok dengan $ komentar dan membiarkan baris lain tidak tersentuh. Solusi ini berfungsi selama 2 bulan terakhir dengan sekitar 100 perubahan aturan per hari - tidak ada masalah. Semoga, ini membantu

ETech
sumber
2
Jika Anda tidak memiliki iptables-save / restore:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
Mansour
Untuk penggunaan di kehidupan nyata: CRON 1) hapus spamhauslarangan iptables lama , 2) ambil spamhaus.org/drop , 3) grep untuk IP CIDR daniptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
Xeoncross
2
@Mansour Or iptables -S | sed "/$comment/s/-A/iptables -D/e";) seperti ini
hek2mgl
@ hek2mgl sed tidak menyerah, bukan? =] Terima kasih, saya akan mengingat kapabilitas ini (saya akan melupakan sintaks dalam sehari).
Mansour
sed digunakan hanya untuk menghapus "-" dari uuid. Bagaimanapun, begitu Anda mendapatkan sintaks sed - itu tidak akan pernah dilupakan. ))
ETech
11

Pertama daftar semua aturan iptables dengan perintah ini:

iptables -S

itu daftar seperti:

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

Kemudian salin baris yang diinginkan, dan ganti -Adengan -Duntuk menghapusnya:

iptables -D XYZ -p ...
Wladdy Lopez
sumber
2
Waspadalah! Ini adalah jawaban yang tidak lengkap. Dari manual tentang "-S": "Seperti setiap perintah iptables lainnya, ini berlaku untuk tabel yang ditentukan (filter adalah default).". Jadi, jika menggunakan switch ini - harus diulang untuk semua tabel: nat, mangle, dll
pmod
1
Dalam kasus saya, saya mendapatkan iptables: Bad rule (does a matching rule exist in that chain?).Apa sekarang?
Abdull
Ah, sudah tahu - perintah delete saya tidak memenuhi spesifikasi tabel. Jadi jika Anda mencantumkan semua aturan dari tabel natdengan sudo iptables -S -t natdan Anda ingin menghapus salah satu aturan yang dikembalikan, menyalin tidak cukup. Anda harus menambahkan -t nat, mis sudo iptables -D ... -t nat.
Abdull
Mudah dimengerti!
sknight
5

Gunakan -Dperintah, ini adalah bagaimana manhalaman menjelaskannya:

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

Sadarilah perintah ini, seperti semua perintah lainnya ( -A, -I) bekerja pada tabel tertentu. Jika Anda tidak bekerja pada tabel ( filtertabel) default , gunakan-t TABLENAME untuk menentukan tabel target itu.

Hapus aturan yang cocok

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

Catatan: Ini hanya menghapus aturan pertama yang cocok. Jika Anda memiliki banyak aturan yang cocok (ini bisa terjadi di iptables), jalankan beberapa kali.

Hapus aturan yang ditentukan sebagai angka

iptables -D INPUT 2

Selain menghitung angka, Anda dapat mencantumkan nomor baris dengan --line-numberparameter, misalnya:

iptables -t nat -nL --line-number
cizixs
sumber
Saya menemukan ini dengan --line-number adalah yang terbaik
Davuz
Iya! Hebat! Tidak ingin utuhiptables -F
Dev Anand Sadasivam
2

Asumsikan bahwa, jika Anda ingin menghapus aturan NAT,

Daftar IPtables yang ditambahkan menggunakan perintah di bawah ini,

# 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

Jika Anda ingin menghapus aturan nat dari IPtables, cukup jalankan perintah,

# sudo iptables -F -t nat -v

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

Kemudian, Anda dapat memverifikasi itu,

# sudo iptables -L -t nat -v
lakshmikandan
sumber