Bagaimana saya bisa memeriksa apakah aturan iptables sudah ada?

41

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?

tujuh kali
sumber
Atau, gunakan pembungkus ini, yang menyediakan interaksi iptables idempoten: xyne.archlinux.ca/projects/idemptables
sampablokuper

Jawaban:

44

Ada -C --checkopsi baru di versi iptables terbaru.

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
iptables: Bad rule (does a matching rule exist in that chain?).
# echo $?
1

# iptables -A INPUT -p tcp --dport 8080 --jump ACCEPT

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
# echo $?
0

Untuk versi iptables yang lebih lama, saya akan menggunakan saran Garrett:

# iptables-save | grep -- "-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT"
Marc MAURICE
sumber
12

-COpsi 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, -Ctidak akan melindungi mereka dari menambahkannya dua kali.

Jadi, ini benar - benar tidak lebih baik daripada grep solusinya. Pekerjaan pemrosesan teks yang akurat pada output dari iptables-savedapat 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 jika iptables -I 1digunakan 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:

while true ; do
  # delete all copies of the rule first

  while copies_of_rule_exist ; do
    iptables -D $RULE
  done

  # now try to add the rule

  iptables -A $RULE # or -I 

  # At this point there may be duplicates due to races.
  # Bail out of loop if there is exactly one, otherwise
  # start again.
  if exactly_one_copy_of_rule_exists ; then
    break;
  fi
done

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.

Kaz
sumber
1
Bolehkah saya menambahkan bahwa perintah ini agak tidak memuaskan karena alasan sederhana bahwa Anda harus menentukan dengan tepat cara aturan Anda ditambahkan. Saya membuat tes dengan pengaturan saya, dan tidak bisa menemukan aturan karena saya tidak menentukan kata kunci dan nilai yang tepat ...
Fabien Haddadi
Jika Anda sementara menghapus aturan maka Anda mungkin melanggar sesuatu ...
Mehrdad
5

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;

berulang
sumber
1
Membuka lubang yang tidak diinginkan di firewall Anda, hanya untuk mensimulasikan perintah idempotent, mungkin bukan ide bagus. Tentu, lubang ini dimaksudkan untuk sementara, tetapi masih meningkatkan peluang penyerang. Dan jika ada sesuatu yang mengganggu penambahan aturan penggantian, maka lubang itu bisa bertahan tanpa batas waktu.
sampablokuper
Good point @sampablokuper: strategi ini mungkin hanya cocok untuk aturan ACCEPT dan bukan DROP, untuk alasan keamanan
lucaferrario
Saya akhirnya melakukan hal yang sama!
warhansen
4

Cukup daftar dan cari?

iptables --list | grep $ip

... atau bagaimanapun Anda memiliki aturan yang ditentukan. Jika Anda menggunakannya grep -qtidak akan menghasilkan apa-apa, dan Anda hanya dapat memeriksa nilai kembali dengan$?

Jonathon Reinhart
sumber
3
iptables-save|grep $ipSebagai 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.
Garrett
1
Tak satu pun dari ini benar-benar menjawab pertanyaan, karena iptables-save|grep $ipbisa sangat cocok dengan beberapa aturan. Mungkin iptables-savebisa digunakan untuk memeriksa spesifikasi aturan lengkap , tapi itu masih sedikit peretasan: format yang dikembalikan oleh iptables-savemungkin tidak sama persis dengan aturan dalam skrip. iptables-savedapat menghasilkan opsi dalam urutan yang berbeda, menambahkan hal-hal (seperti -m tcp), dan sebagainya.
larsks
Ingatlah bahwa iptables --listakan mencoba untuk menyelesaikan port yang terkenal. Jadi pastikan itu sebelum Anda mencari port.
Fabien Haddadi
0

Untuk menghindari aturan duplikat dari skrip Anda, tambahkan baris di bawah ini.

iptables -C -INPUT -p tcp --dport 8080 --jump ACCEPT || iptables -A -INPUT -p tcp --dport 8080 --jump ACCEPT

Pertama kali ketika perintah di atas dijalankan, kita akan mengamati pesan di bawah ini

iptables: Aturan buruk (apakah ada aturan yang cocok dalam rantai itu?).

Ini hanya untuk informasi. Tetapi bagian kedua dari perintah akan memastikan untuk menambahkan aturan.

laxman vallandas
sumber