
Estoy usando firewalld en RHEL 8 y también necesito agregar algunas reglas nftable.
(Las reglas de la tabla se basan en la respuesta aCentOS 8 como enrutador NAT con nft y firewalld: ¿cómo lograr que pase TFTP?)
En un firewall en ejecución, esto funciona bien con el comando nft -f.
Sin embargo, esto se pierde al reiniciar.
ElDocumentación de RedHat(detrás del muro de pago) sugiere usar el servicio nftables.service para cargar reglas al reiniciar, pero esto no funciona junto con firewalld. Los dos servicios están listados como en conflicto, e incluso si no lo estuvieran, firewalld probablemente eliminaría las reglas de nftable.
¿Existe otra forma de hacer que las reglas de nftable se carguen al reiniciar?
Respuesta1
Elcortafuegosutilidad, al utilizar elnftablesback-end,no vaciará tablas que no le pertenecen:
Solo limpia las reglas de firewalld
Dado que nftables permite espacios de nombres (a través de tablas)firewalld ya no realiza una limpieza completa de las reglas del firewall. Sólo eliminará las reglas en el cortafuegosmesa. Esto evita escenarios en los que las reglas de usuario personalizadas o las reglas instaladas por otras herramientas se eliminan inesperadamente cuando se reinicia o recarga firewalld.
Lo mismo debe hacerse al gestionar otras tablas.
En realidad en la respuesta anterior ya está hecho: elnftablesreglas elimina idempotentementesolosu propia mesa: handletftp
.
Lamentablemente, ese no es el caso para nftables.service
eldeteneracción:
ExecStop=/sbin/nft flush ruleset
Sólo hay que asegurarse de que la parte de detención del servicio systemd no borre directamente todas las reglas mientras sigue haciendo el trabajo. Este trabajo será delegado en personas dedicadas.nftablesreglas para eldeteneracción.
Así que aquí tienes un método práctico: duplicar (p. ej. systemctl cat nftables.services
:) y modificarlo nftables.service
en una versión instanciada [email protected]
para incluirla :/etc/systemd/system/[email protected]
[Unit]
Description=Idempotent nftables rules for %I
Wants=network-pre.target
Before=network-pre.target
[Service]
Type=oneshot
ProtectSystem=full
ProtectHome=true
ExecStart=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# As the rules are idempotent, ExecReload is same as ExecStart
ExecReload=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# The stop rules should only have the first boilerplate parts
ExecStop=/sbin/nft -f /etc/nftables/idempotent/stop-%I.nft
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Cree el directorio de configuración dedicado utilizado anteriormente:
mkdir -p /etc/nftables/idempotent
Colocar reglas que para cada tabla definida, siempre comiencen así, por lo que cargar las reglas es independiente de otras tablas yidempotente(ejemplo con tablas ip foo
y bridge bar
):
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
table ip foo {
...
}
table bridge bar {
....
}
o simplemente use una tabla por archivo. La flush ruleset
declaración está prohibida ya que es global.
La razón por la que se crea, elimina y recrea una tabla es para obtener el resultado idempotente: mientras que eliminar una tabla no existente es un error y atómicamente haría que toda la carga fallara, declarar una tabla existente sin definirla (agregando una tabla vacía) nunca falla y no hace nadaexcepto crearlo vacíosi no existiera antes. En ambos casos (no existía en el arranque, existe en la recarga)borrarAhora puede funcionar, dejando el lugar para definir realmente la tabla justo después. Todo esto sucede en la misma transacción y sigue siendo atómico: ningún paquete será evaluado si falta unIP footabla si existía antes durante este.
Prepara undetenerversión de arriba que solo se eliminará (aquí las declaraciones vacías no son estrictamente necesarias y podrían eliminarse si solo hubiera una tabla, pero deben conservarse si hay más de una tabla: el error es para toda la transacción):
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
y pon todo en su ubicación:
/etc/nftables/idempotent/foobar.nft
/etc/nftables/idempotent/stop-foobar.nft
Esto ahora se puede activar con:
systemctl enable --now local-idempotent-nft@foobar
Ejemplo de la pregunta del OP anterior:
en /etc/nftables/idempotent/handletftp.nft
:
table ip handletftp
delete table ip handletftp
table ip handletftp {
ct helper helper-tftp {
type "tftp" protocol udp
}
chain sethelper {
type filter hook forward priority 0; policy accept;
ip saddr 192.168.1.0/24 ip daddr 10.0.10.10 udp dport 69 ct helper set "helper-tftp"
}
}
En/etc/nftables/idempotent/stop-handletftp.nft
table ip handletftp
delete table ip handletftp
Habilitándolo e iniciándolo:
systemctl enable --now local-idempotent-nft@handletftp
Detenerlo:
systemctl stop local-idempotent-nft@handletftp
que dejarácortafuegosLas reglas están vigentes. Asimismo, detener o reiniciarcortafuegosdejará estas reglas en su lugar.
Probablemente haya mejoras que hacer:
- nftablestiene unincluirdeclaración que podría usarse de alguna manera para evitar la duplicación del texto estándar.
- El ejemplo específico sobre TFTP se basa en
nf_nat_tftp
que la carga no se realizará automáticamente (al contrario denf_conntrack_tftp
lo que se carga automáticamente desde la referencia en las reglas o al contrario decortafuegosque se cargaríanf_nat_tftp
explícitamente). Tan relacionado pero no estrictamentenftablesSe deben tener en cuenta las configuraciones (esta configuración podría simplemente ingresarse/etc/modules-load.d/
).