pimvh.nftables

Prueba de molécula

Requisitos

  1. Ansible instalado:
sudo apt install python3
python3 -m ensurepip --upgrade
pip3 install ansible

Variables requeridas

Revisa las variables como se muestra en los valores predeterminados.

Puedes agregar una definición de firewall a las variables para tu host (../host_vars/[nombre_host].yaml), grupo de hosts (../group_vars/[nombre_grupo].yaml) usando la siguiente estructura (ver ejemplo en molecule.default.vars/test.yaml):

# esta variable apunta a las reglas que se envían al host remoto
# es un diccionario de tablas, con cadenas, con reglas, ver molecule/default/vars/test.yaml
nftables_ruleset:
  # las claves de esto se convierten en tablas
  # deben ser:
  # familia y nombre del firewall, por ejemplo:
  "inet firewall":

    # descripción de la tabla
    comment: "firewall del dispositivo"

    chains:

      # nombre de la cadena respectiva
      input:
        # nombre de la variable de nftables_rules
        # que te gustaría poner en esta cadena
        - input_hook
        - valid_connections
        - ...

  # otra tabla con la misma estructura
  # las familias válidas son cosas como inet, inet6, netdev, e inet,
  # ver la documentación de nftables para la referencia completa
  "inet foo":

# las reglas potenciales se definen bajo `nftables_rules`
# cada regla tiene dos atributos:
# -> def: la definición de las reglas o conjunto de reglas en una sintaxis válida de nftables
# -> depends_on: lista opcional de dependencias de variables de nftables_variables
# ver molecule/default/vars/test.yaml para un ejemplo

nftables_rules:
  input_hook: >
    type filter hook input priority 0; policy drop;
  valid_connections:
    def: |
        ct state established, related accept
        ct state invalid drop

  new_connections:
    def: |
        ct state new accept


# estas son las definiciones de variables, que se incluyen con depends_on
# asegúrate de que las claves coincidan
# ver molecule/default/vars/test.yaml para un ejemplo
nftables_variables:

  tcp_ports:
    comment: configuración de puertos tcp
    def: |
      {% if nftables_open_tcp_ports_global %}define OPEN_TCP_PORTS = { {{ nftables_open_tcp_ports_global | join(",") }} }{% endif +%}
      {% if nftables_open_tcp_ports_local %}define LOCAL_OPEN_TCP_PORTS = { {{ nftables_open_tcp_ports_local | join(",") }} }{% endif +%}
      {% if nftables_open_tcp_ports_vpn %}define VPN_TCP_PORTS = { {{ nftables_open_tcp_ports_vpn | join(",") }} }{% endif +%}

  ...

El playbook de Ansible validará si se pasan las variables correctas al rol utilizando un argument_spec.

Ejemplo de playbook

Mínimo (suponiendo que pasaste variables en otro lugar):

hosts:
  - foo
roles:
  - pimvh.nftables

Resumen - Qué sucederá si ejecuto esto

  • validar si las reglas / algunas otras variables están definidas
  • instalar nftables y la interfaz de python
  • crear las tablas nftables requeridas
  • crear tablas dinámicas como tablas vacías
  • crear una lista de bloqueos vacía
  • copiar una plantilla de nftables al directorio de nftables
  • editar el servicio de nftables para que apunte a nuestro nuevo archivo principal
  • crear un script para recargar el firewall, que extrae tablas que están fuera de nuestro control a archivos, y recarga el firewall después
  • cuando nftables_abuseip_api_key esté definido, agregar un script para obtener la lista de bloqueos usando su API, y convertir eso en un servicio systemd
  • habilitar el servicio de nftables cuando se solicite
  • desinstalar iptables cuando se solicite

Mejoras Futuras

  • Simplificar la estructura de reglas que deben pasarse
  • Mejorar argument_specs para nftables_variables y nftables_ruleset
Acerca del proyecto

role to configure nftables using a YAML file

Instalar
ansible-galaxy install pimvh.nftables
Licencia
gpl-3.0
Descargas
110
Propietario