-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 dari iptables-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 jika iptables -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:
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.