En corto

Firewall → Settings → Advanced → Disable reply-to on WAN rules → marcar → Save → Apply.

Síntoma: un port-forward o una regla WAN responde desde cualquier IP de internet, pero desde un equipo que vive en la misma subred que la WAN del firewall todo da timeout (SSH, HTTPS, incluso ping), aunque la regla diga from any.

Con una sola WAN es seguro: el firewall deja de forzar el regreso por el gateway y vuelve a usar su tabla de rutas.

El escenario

1
2
3
4
5
6
7
8
                203.0.113.0/24  (mismo segmento L2)
   ┌────────────────────┬────────────────────┬────────────────────┐
   │                    │                    │                    │
 gateway             fw01 (OPNsense)      vecino               internet
 203.0.113.1         WAN 203.0.113.40     203.0.113.50         (vía gateway)
                        │ rdr :22 → 192.168.1.10
                        ▼
                     servidor LAN
  • Desde internet: ssh -p 22 203.0.113.40 entra al servidor de la LAN. Bien.
  • Desde vecino (203.0.113.50): timeout en todos los puertos.

Qué hace reply-to

OPNsense genera las reglas de las interfaces tipo WAN (las que tienen gateway) con reply-to apuntando a ese gateway:

1
pfctl -sr | grep reply-to
1
pass in quick on vtnet0 reply-to (vtnet0 203.0.113.1) inet proto tcp from any to 192.168.1.10 port = ssh flags S/SA keep state

reply-to es una opción de pf. Cuando un paquete entra y crea un estado, pf guarda en ese estado que todas las respuestas salgan por vtnet0 hacia 203.0.113.1. Esas respuestas no pasan por la tabla de rutas: pf decide el siguiente salto por su cuenta.

Existe por multi-WAN. Si tienes dos proveedores y un cliente entra por la WAN2, la respuesta tiene que salir por la WAN2. Si sale por la ruta por defecto (WAN1), lleva una IP de origen que el proveedor 1 no reconoce y se pierde. reply-to garantiza el regreso simétrico sin tener que pensar en rutas.

Por qué rompe a los vecinos

Para un cliente en internet, «responder al gateway» es justo lo que haría la tabla de rutas, así que no se nota nada.

Para el vecino es distinto. Su IP (203.0.113.50) está en una red conectada del firewall. Sin reply-to, el firewall resolvería su MAC por ARP y le respondería directo. Con reply-to, el SYN-ACK sale con la MAC del gateway como destino:

1
2
# en el OPNsense (shell csh: envuelve en sh -c)
sh -c "tcpdump -lnei vtnet0 host 203.0.113.50 and tcp port 22"
1
2
<mac-vecino> > <mac-fw01>          203.0.113.50.49612 > 203.0.113.40.22: Flags [S]    ← llega directo
<mac-fw01>   > 00:00:5e:00:01:<vrid> 203.0.113.40.22 > 203.0.113.50.49612: Flags [S.]   ← sale al gateway

(00:00:5e:00:01:xx es la MAC virtual de VRRP: el gateway era un par redundante.)

A partir de ahí depende del gateway. Para él, el paquete entra por la misma interfaz por la que tendría que salir, y si tiene un filtro con estado ve un SYN-ACK de una conexión cuyo SYN nunca vio. En el lab, el gateway simplemente no lo devolvía al segmento. En el vecino sólo se ven SYN reintentándose y ningún [S.].

La huella en el firewall es un estado a medias:

1
pfctl -ss | grep 203.0.113.50
1
all tcp 192.168.1.10:22 (203.0.113.40:22) <- 203.0.113.50:57792   SYN_SENT:ESTABLISHED

El servidor ya respondió (ESTABLISHED) y el cliente sigue esperando (SYN_SENT): la respuesta se pierde de regreso, no a la ida. El filtro no está bloqueando nada.

Qué cambia el fix

Con Disable reply-to on WAN rules activado, OPNsense regenera las reglas sin reply-to:

1
pass in quick on vtnet0 inet proto tcp from any to 192.168.1.10 port = ssh flags S/SA keep state

El estado ya no fija el siguiente salto, así que las respuestas pasan por la tabla de rutas normal:

Destino de la respuestaCon reply-toSin reply-to
Cliente en internetgatewaygateway (ruta por defecto)
Vecino en 203.0.113.0/24gateway ✗directo por ARP ✓
Cliente que entró por otra WAN (multi-WAN)su gateway ✓ruta por defecto ✗

La última fila es el costo. Con multi-WAN no lo desactives global. En vez de eso, quita el reply-to sólo en la regla del port-forward afectado: en la regla, Advanced → reply-to. Revisa las opciones que ofrece tu versión.

Verificar

1
2
3
# en el OPNsense
sh -c "pfctl -sr | grep -c reply-to; grep -n disablereplyto /conf/config.xml"
# esperado: 0  y  <disablereplyto>yes</disablereplyto>
1
2
# desde el vecino
nc -z -w5 203.0.113.40 22 && echo abierto

Trampas

  • «Disable force gateway» no es esto. Está en la misma pantalla y tiene un nombre parecido, pero sólo afecta el tráfico que origina el propio firewall (DNS, NTP, actualizaciones). No toca las respuestas a tráfico entrante.
  • Una ruta estática en el gateway no ayuda. El gateway ya tiene la subred como conectada; el problema es que no regresa el paquete al mismo segmento, no que no sepa llegar.
  • Shell csh. Por SSH, OPNsense entra a csh y cosas como 2>/dev/null fallan con Ambiguous output redirect. Usa sh -c "..." o ssh root@fw01 sh <<'EOF'.
  • Revisa todos los puertos, no uno. Si falla sólo un puerto es otro problema (regla, NAT, servicio). Si fallan todos, incluido ping, y sólo desde la misma subred, sospecha de reply-to.

Ver también