Saya perlu menambahkan aturan ke iptables untuk memblokir koneksi ke port tcp dari Internet.
Karena skrip saya dapat dipanggil beberapa kali dan tidak ada skrip untuk menghapus aturan, saya ingin memeriksa apakah aturan iptables sudah ada sebelum memasukkannya - jika tidak, akan ada banyak aturan dup di rantai INPUT.
Bagaimana saya bisa memeriksa apakah aturan iptables sudah ada?
Jawaban:
Ada
-C --check
opsi baru di versi iptables terbaru.Untuk versi iptables yang lebih lama, saya akan menggunakan saran Garrett:
sumber
-C
Opsi baru ini tidak memuaskan, karena terbuka untuk kondisi balapan time-of-check-to-time-of-use (TOCTTOU). Jika dua proses mencoba menambahkan aturan yang sama pada waktu yang bersamaan,-C
tidak akan melindungi mereka dari menambahkannya dua kali.Jadi, ini benar - benar tidak lebih baik daripada
grep
solusinya. Pekerjaan pemrosesan teks yang akurat pada output dariiptables-save
dapat bekerja dengan andal-C
, karena output tersebut adalah snapshot yang dapat diandalkan dari keadaan tabel.Yang dibutuhkan adalah
--ensure
opsi yang secara atomik memeriksa dan menambahkan aturan hanya jika belum ada. Selain itu, alangkah baiknya jika aturan dipindahkan ke posisi yang benar di mana aturan baru akan dimasukkan jika belum ada (--ensure-move
). Misalnya jikaiptables -I 1
digunakan untuk membuat aturan di kepala rantai, tetapi aturan itu sudah ada di posisi ketujuh, maka aturan yang ada harus pindah ke posisi pertama.Tanpa fitur-fitur ini, saya pikir solusi yang layak adalah dengan menulis loop skrip shell berdasarkan kode semu ini:
Kode ini dapat berputar; itu tidak menjamin bahwa dua atau lebih pembalap akan keluar dalam jumlah iterasi yang tetap. Beberapa tidur backoff eksponensial acak dapat ditambahkan untuk membantu dengan itu.
sumber
Ini mungkin tampak agak terbelakang, tetapi berfungsi untuk saya - Coba hapus dulu aturannya.
iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;
Anda harus mendapatkan pesan yang serupa dengan:
iptables: Aturan buruk (apakah ada aturan yang cocok dalam rantai itu?)
Kemudian cukup tambahkan aturan Anda seperti biasa:
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;
sumber
Cukup daftar dan cari?
... atau bagaimanapun Anda memiliki aturan yang ditentukan. Jika Anda menggunakannya
grep -q
tidak akan menghasilkan apa-apa, dan Anda hanya dapat memeriksa nilai kembali dengan$?
sumber
iptables-save|grep $ip
Sebagai gantinya saya akan menyarankan karena ini adalah format yang lebih mudah diurai, terutama dalam naskah. Anda dapat memeriksa sintaks yang tepat dari perintah juga jika Anda mau.iptables-save|grep $ip
bisa sangat cocok dengan beberapa aturan. Mungkiniptables-save
bisa digunakan untuk memeriksa spesifikasi aturan lengkap , tapi itu masih sedikit peretasan: format yang dikembalikan olehiptables-save
mungkin tidak sama persis dengan aturan dalam skrip.iptables-save
dapat menghasilkan opsi dalam urutan yang berbeda, menambahkan hal-hal (seperti-m tcp
), dan sebagainya.iptables --list
akan mencoba untuk menyelesaikan port yang terkenal. Jadi pastikan itu sebelum Anda mencari port.Bagaimana kalau pertama menambahkan dan kemudian menghapus duplikat seperti yang dijelaskan dalam https://serverfault.com/questions/628590/duplicate-iptable-rules . Paling mudah (untuk garis yang berdekatan) tampaknya
sumber
Untuk menghindari aturan duplikat dari skrip Anda, tambahkan baris di bawah ini.
Pertama kali ketika perintah di atas dijalankan, kita akan mengamati pesan di bawah ini
Ini hanya untuk informasi. Tetapi bagian kedua dari perintah akan memastikan untuk menambahkan aturan.
sumber