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