RHEL/CentOS ¿Ahora desea agregar reglas nftable a firewalld al iniciar el sistema?

RHEL/CentOS ¿Ahora desea agregar reglas nftable a firewalld al iniciar el sistema?

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.serviceeldeteneracció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.serviceen 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 fooy 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 rulesetdeclaració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_tftpque la carga no se realizará automáticamente (al contrario de nf_conntrack_tftplo que se carga automáticamente desde la referencia en las reglas o al contrario decortafuegosque se cargaría nf_nat_tftpexplícitamente). Tan relacionado pero no estrictamentenftablesSe deben tener en cuenta las configuraciones (esta configuración podría simplemente ingresarse /etc/modules-load.d/).

información relacionada