In timp ce înlocuirea regulilor atomice este documentată:
Înlocuirea regulii atomice
Puteți folosi -f
opțiunea de a vă actualiza atomic setul de reguli:
% nft -f fișier
nu este documentat în mod explicit pentru element înlocuire, dar acesta este de fapt doar un caz de înlocuire a regulilor. Se poate șterge și adăuga înapoi elementul într-o singură tranzacție atomică introdusă cu -f
: aceasta va înlocui intrarea mai veche cu cea mai nouă și cu timpul de expirare actualizat, fără ca elementul să lipsească temporar.
Deci, în loc să facem următoarele, ceea ce nu ar fi atomic deoarece între cele două invocări ale nft
, elementul ar fi temporar neexistent și regulile care depind de acest set nu s-ar potrivi temporar:
# nft șterge elementul ip mytable myset '{ 10.10.10.1 }'
# nft add element ip mytable myset '{ 10.10.10.1 timeout 60s expires 60s }'
acest lucru ar trebui făcut folosind -f
și un fișier de intrare (-
a sta pentru stdin contează drept fișier de intrare valid):
# nft -f - <<'EOF'
șterge elementul ip mytable myset { 10.10.10.1 }
adăugați elementul ip mytable myset { 10.10.10.1 timeout 60s }
EOF
unde elementul nu va înceta niciodată să existe pentru că este o schimbare atomică.
Ca de obicei cu asta nft construi, dacă se dorește să facă acest lucru idempotent, fără a fi nevoie să știe dacă elementul există deja și fără a atinge alte elemente, ar trebui să fie adăugat, șters și re-adăugat, deoarece în timp ce adăugarea unui element existent nu este o eroare, ștergerea un element lipsă va fi o eroare:
# nft -f - <<'EOF'
adăugați elementul ip mytable myset { 10.10.10.1 }
șterge elementul ip mytable myset { 10.10.10.1 }
adăugați elementul ip mytable myset { 10.10.10.1 timeout 60s }
EOF
Este încă o singură tranzacție atomică.
Note Aditionale
din calea pachetului
Când faceți acest lucru din calea pachetului, există o distincție între adăugați @myset
care va seta timeout-ul numai la crearea unui element nou, dar nu va actualiza timeout-ul unui element deja existent, permițându-i să expire mai târziu pe întreaga sa durată și actualizați @myset
care stabilește timeout-ul în toate cazurile.
Actualizarea regulilor atomice nu se limitează la elemente, ci poate fi folosită la orice nivel
De exemplu, același lucru se poate face la nivelul setat dacă există un singur element de îngrijit:
# nft -f - <<'EOF'
add set ip mytable myset { tip ipv4_addr; semnalează timeout; }
delete set ip mytable myset
adăugați set ip mytable myset {
tastați ipv4_addr
semnalează timeout
elemente = { 127.0.0.1 timeout 1m }
}
EOF
De fapt, exemplul de mai sus va eșua, deoarece probabil că există o regulă care face referire la setul, deci nu este permis să-l ștergeți nici măcar în timpul tranzacției (se poate rescrie, în schimb, întregul tabel, cu adăugați tabel ip mytable
, ștergeți tabelul ip mytable
, adăugați ip tabel mytable { ...
). Dacă se știe că setul există înainte, este suficient să-l spălați înainte de a adăuga înapoi elementul unic:
# nft -f - <<'EOF'
flush set ip mytable myset
adăugați element ip mytable myset { 127.0.0.1 timeout 1m }
EOF
Desigur, un fișier real poate fi folosit în loc de - <<'EOF'
...EOF
.