# Listas del firewall

Las pertenencias a listas que añade install para que las reglas raw de descarte del router dejen pasar las respuestas del agente, cómo nombrar tus propias listas o ninguna, y qué comprueba doctor.

Source: https://docs.jmrp.io/mikroscope/es/install/firewall/

`install` añade la veth a una lista de interfaces y la /30 del contenedor a una address-list, para
que las reglas raw de descarte de un cortafuegos MikroTik dejen pasar las respuestas del agente.
Nombra las listas que usan tus reglas con `--iface-list` y `--addr-list`, o `none` cuando ninguna
regla las necesita. Sin `--expose`, `install` no escribe ninguna regla de cortafuegos.

## Reglas raw de descarte

La guía [Building Advanced Firewall](https://help.mikrotik.com/docs/spaces/ROS/pages/328513/Building+Advanced+Firewall)
de MikroTik añade reglas raw comentadas `defconf:`. Dos de ellas descartan en silencio cada paquete
que envía un contenedor nuevo:

| Regla                                                               | Descarta un paquete que                                  | Un contenedor nuevo cae porque       | Qué lo deja pasar                                                                                                  |
| ------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------ |
| `drop the rest`, `in-interface-list=!LAN`                           | entra por una interfaz fuera de la lista `LAN`           | su veth no está en ninguna lista     | la veth en `LAN`: `--iface-list`                                                                                   |
| `drop local if not from default IP range`, `src-address-list=!LANs` | viene de una dirección fuera de la address-list `LANs`   | su /30 no está en ninguna address-list | la /30 en `LANs`: `--addr-list`                                                                                  |
| la misma regla escrita `src-address=!192.168.88.0/24`               | viene de una dirección fuera de ese rango                | su /30 está fuera del rango          | ninguna lista: añade antes una regla de aceptación para `in-interface=<veth>`, o elige una `--subnet` dentro del rango |

El descarte es silencioso. Desde tu máquina el agente no responde, y eso se ve igual que un
contenedor que no está en marcha; por eso el sondeo tras `install` pregunta al router si el
contenedor está en marcha antes de sugerir nada más ([Acceso por
red](https://docs.jmrp.io/mikroscope/es/install/reaching-the-agent/)).

Otras reglas de descarte en `raw`, `input` o `forward` pueden descartar el tráfico del contenedor en
otro punto. `install` no añade nada para ellas más allá de las dos pertenencias; la
[comprobación de trampas](https://docs.jmrp.io/mikroscope/es/install/firewall/#comprobación-de-trampas) de `doctor` las lee y nombra la regla.

## Pertenencias a listas

Con las listas por defecto, `install` escribe estas dos entradas:

| Paso                         | Orden                                                                                                                       | Se omite con        |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------- |
| pertenencia a interface-list | `/interface/list/member/add list="LAN" interface="veth-mikroscope" comment="mikroscope:mikroscope (managed by mikroscope)"` | `--iface-list none` |
| pertenencia a address-list   | `/ip/firewall/address-list/add list="LANs" address=172.30.10.0/30 comment="mikroscope:mikroscope (managed by mikroscope)"`  | `--addr-list none`  |

- Las dos llevan la etiqueta. `uninstall` quita cada una por la etiqueta, la lista y el miembro.
- La lista de interfaces tiene que existir. La address-list no: su primera entrada la crea, y
  `uninstall` quita la entrada.
- Con las dos pertenencias, una máquina de la LAN llega al agente directamente a través del router
  ([verificado](https://docs.jmrp.io/mikroscope/es/about/status/#verified-direct-lists)).

Una pertenencia no se limita a mikroscope. Cualquier otra regla de tu router que case con la lista de
interfaces `LAN` o con la address-list `LANs` casa también con el tráfico del contenedor, mientras
esté instalado. Lee tus propias reglas teniéndolo en cuenta.

## Nombres de lista propios

Pasa las listas que usan tus reglas de descarte:

| Opción         | Variable                | Por defecto | Admite                                                                                                    | Nombra                                                             |
| -------------- | ----------------------- | ----------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| `--iface-list` | `MIKROSCOPE_IFACE_LIST` | `LAN`       | `^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$` o `none`; no las listas integradas de RouterOS `all`, `dynamic` ni `static` | la lista que usa tu regla de descarte `in-interface-list=!…`       |
| `--addr-list`  | `MIKROSCOPE_ADDR_LIST`  | `LANs`      | `^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$` o `none`                                                              | la lista que usa tu regla `drop local if not from default IP range` |

```sh
mikroscope install --iface-list MYLAN --addr-list MYNETS
```

Una lista de interfaces integrada no admite miembros, así que `--iface-list static` se detiene antes
de la primera conexión:

```text
mikroscope: iface-list "static" is a RouterOS built-in list, which takes no member: name the list your firewall's in-interface-list=!… drop rule uses, or none to join no list
```

`status`, `upgrade` y `uninstall` leen las listas de la instalación que hay en el router, así que no
necesitan ninguna opción de listas. Una opción de listas que contradice la instalación se rechaza,
nombrando los dos valores ([Forma de la
instalación](https://docs.jmrp.io/mikroscope/es/reference/cli/#pasa-la-misma-forma-a-status-upgrade-y-uninstall)).

## Sin pertenencia

Un router sin ninguna regla que descarte por lista no necesita ninguna de las dos pertenencias.
Omítelas:

```sh
mikroscope install --iface-list none --addr-list none
```

`doctor` te dice cuándo es así: su comprobación de trampas termina con
`they would pass with no list membership as well`, y una lista de interfaces que falta se informa con
`--iface-list none` como primera solución:

```text
  MISSING interface list LAN exists (found=0)
          fix: --iface-list none: no firewall rule here needs the veth in an interface list. Or create it: `/interface/list/add name=LAN`
```

## Comprobación de trampas

`doctor`, solo o dentro de `install`, comprueba las listas y después sigue las respuestas del agente
a través de tu cortafuegos:

Las comprobaciones que ejecuta doctor:

| Comprobación, tal como se imprime | Pasa cuando | La solución que nombra |
| --- | --- | --- |
| interface list <list> exists | existe la lista `--iface-list` (por defecto `LAN`). Con `--iface-list none` doctor imprime `interface list the veth joins` y lo da por bueno: no se escribe ninguna pertenencia | `--iface-list none` si ninguna regla del cortafuegos necesita la veth en una lista (doctor lo ofrece primero en ese caso); si no, `/interface/list/add name=…`, o pasa la lista que usa tu regla de descarte `in-interface-list=!…` |
| address list <list> | siempre: install añade la /30 a la lista `--addr-list` (por defecto `LANs`), lo que la crea si falta, y uninstall retira la entrada. Con `--addr-list none` doctor imprime `address list the /30 joins`. Si alguna regla necesita esa pertenencia lo responde la fila siguiente | ninguno |
| no firewall rule drops the agent's replies | doctor lee todas las reglas activas de las cadenas por las que pasan las respuestas del agente, `/ip/firewall/raw` prerouting y `/ip/firewall/filter` forward e input, y recorre cada una como RouterOS, gana la primera que coincide, con las respuestas en las listas a las que se une el plan: ninguna regla las descarta. Un aviso cuando una regla podría hacerlo, porque filtra por algo que doctor no evalúa (un destino, una marca, un límite de tasa), y cuando las respuestas a un equipo de la LAN pasan pero una regla podría descartar las que van al propio router (filter input), que necesita el transporte por relay | las `--iface-list` y `--addr-list` que dejan pasar las respuestas; cuando ninguna lista lo consigue (una regla `src-address=!<rango>`, por ejemplo), añade antes de esa regla una de aceptación para `in-interface=<veth>`, o elige una `--subnet` dentro del rango |

La comprobación de trampas lee todas las reglas activas de `/ip/firewall/raw` prerouting y de
`/ip/firewall/filter` forward e input, y recorre cada cadena como RouterOS, por orden, gana la
primera que coincide. Las respuestas que sigue entran por la veth, desde la dirección y el puerto
del agente, en las listas a las que se une el plan.

| Imprime                                                                                  | Significa                                                                                       | Haz                                                                          |
| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| `ok … no rule drops them`                                                                | las respuestas pasan con las pertenencias del plan                                              | nada                                                                         |
| `ok … they would pass with no list membership as well`                                   | ninguna regla necesita una pertenencia                                                          | `--iface-list none --addr-list none`, si no quieres ninguna pertenencia      |
| `MISSING … drops them`, solución `install with --iface-list … --addr-list …`             | una regla descarta las respuestas, y otras listas que nombran las reglas las dejan pasar        | instala con las listas que nombra la solución                                |
| `MISSING … drops them`, solución `… add an accept rule for in-interface=<veth> before it` | ninguna lista de las que nombran las reglas deja pasar las respuestas, como con una regla `src-address=!<rango>` | añade esa regla de aceptación, o elige una `--subnet` dentro del rango que nombra la solución |
| `WARN … may drop them`                                                                   | la regla filtra por algo que `doctor` no evalúa: un destino, una marca, un límite de tasa      | si el agente no responde tras `install`, mira primero esa regla              |
| `WARN … may drop the ones to the router itself`                                          | las respuestas a una máquina de la LAN pasan, y una regla de `filter input` podría descartar las que van al router | usa el transporte directo; el relay podría no llegar al agente |

`doctor` nombra una regla por su tabla, cadena y número, sus condiciones y su comentario, como en
`/ip/firewall/raw rule 0 (chain=prerouting action=drop, …) "…"`. Nunca propone una lista en la que
esté el enlace de subida del router, y da por hecho que una address-list distinta de la del plan no
tiene ninguna entrada para la /30.

Recorre una regla tal como la aplica RouterOS, que no siempre es como se lee. RouterOS salta una
regla que marca como inválida, y una regla que nombra una lista de interfaces que se quitó sigue
siendo válida, con el id de la lista en lugar de su nombre, y coincide como si la lista estuviera
vacía ([Exposición del router](https://docs.jmrp.io/mikroscope/es/install/firewall/#exposición-del-router)).

## Exposición del router

Dos avisos son sobre el router y no sobre la instalación. No cambian el estado de salida de
`doctor` ni si `install` sigue adelante, pero un router cuyo cortafuegos no hace lo que parece hacer
lleva tráfico que nunca debió llevar, y entonces todos los paneles miden ese tráfico:

Las comprobaciones que ejecuta doctor:

| Comprobación, tal como se imprime | Pasa cuando | La solución que nombra |
| --- | --- | --- |
| no firewall rule doctor reads is invalid or names a deleted list | un aviso: ninguna regla de raw prerouting ni de filter forward e input está marcada como inválida, que RouterOS salta como si no existiera (nombra una interfaz que se quitó o no está lista, y `about` dice cuál), y ninguna nombra una lista de interfaces que se quitó, que RouterOS guarda como el id de la lista (`in-interface-list=!*2000010`) y aplica como una lista vacía. Una regla cambiada un momento antes se lee inválida, sin motivo, hasta que RouterOS la aplica | corrige o quita lo que nombra una regla inválida; vuelve a poner por nombre una lista borrada, porque crear una lista con el mismo nombre no repara la regla. Sin motivo, ejecuta `doctor` otra vez |
| the router does not answer DNS from its uplink | un aviso: `allow-remote-requests` de `/ip/dns` está apagado, o una regla de raw prerouting o de filter input descarta una consulta UDP al puerto 53 que entra por la interfaz de la ruta por defecto activa, recorrida como en la comprobación de trampas, gana la primera que coincide. Un aviso de que las consultas podrían pasar cuando una regla filtra por algo que doctor no evalúa, una lista de direcciones de origen por ejemplo. IPv6 no se lee | una regla de descarte para el puerto 53 UDP y TCP en el enlace de subida antes de cualquier aceptación que lo coja, o `/ip/dns/set allow-remote-requests=no` si ningún equipo de la LAN usa el router como resolvedor |

- **Una regla que no hace nada, o que hace demasiado.** Una regla inválida, que nombra una interfaz
  que se quitó o no está lista, se salta: una regla de descarte inválida no descarta nada. Una regla
  cuya lista de interfaces se quitó se lee `in-interface-list=!*2000010` y coincide como si la
  lista estuviera vacía, así que un descarte `!LAN` que se quede así descarta todo paquete que llega
  a la cadena input, incluidos el SSH y el Winbox del propio router desde la LAN. Crear una lista
  con el mismo nombre no la repara: vuelve a poner por nombre la lista de la regla.
- **Un resolvedor abierto.** Con `allow-remote-requests=yes` en `/ip/dns`, el router responde DNS
  en cualquier interfaz por la que su cortafuegos deje entrar consultas. `doctor` sigue una consulta
  UDP al puerto 53 que entra por la interfaz de la ruta por defecto activa a través de raw
  prerouting y filter input; cuando ninguna regla la descarta, el router responde DNS para
  Internet, y los ataques de reflexión que lo encuentran llenan su tabla de conexiones y su CPU. El
  descarte `in-interface-list=!LAN` de la cadena input de la configuración por defecto los para.

Los dos se comprobaron contra RouterOS en el laboratorio ([Probado en](https://docs.jmrp.io/mikroscope/es/about/status/#doctor-exposure)).

## Pertenencias existentes

Si la veth ya está en la lista de interfaces, o la /30 ya está en la address-list, y esa entrada no
lleva la etiqueta de mikroscope, `install` se detiene en ese paso y lo nombra: el efecto existe, pero
mikroscope no lo creó y no lo quitará. Elige otro `--veth` u otro `--subnet`, o quita tu entrada a
mano si es tuya. `uninstall` nunca la toca.

## Reglas de exposición

Solo `--expose` escribe reglas de cortafuegos: un dst-nat en la dirección LAN del router y un accept
en forward colocado antes del primer drop de forward, los dos etiquetados. `uninstall` los quita con
el resto de la instalación, porque lee en el router que la instalación estaba expuesta. [Exponer en
la LAN](https://docs.jmrp.io/mikroscope/es/security/expose/) tiene las dos reglas y quién llega al agente a través de
ellas.

## Véase también

- [Acceso por red](https://docs.jmrp.io/mikroscope/es/install/reaching-the-agent/): las tres formas de llegar al agente,
  y qué hacer cuando las pertenencias no bastan.
- [Requisitos](https://docs.jmrp.io/mikroscope/es/install/prerequisites/): todas las comprobaciones de `doctor`.
- [Exponer en la LAN](https://docs.jmrp.io/mikroscope/es/security/expose/): las dos reglas que añade `--expose`.
- [Probado en](https://docs.jmrp.io/mikroscope/es/about/status/): los cortafuegos contra los que se probaron estas
  pertenencias.
