Mikrotik Hijack port 53 load-balancing

/ip firewall
address-list
add list=allowed_dns_servers address=IpV4-Resolver1 comment="RPZ Resolver 1"
add list=allowed_dns_servers address=IpV4-Resolver2 comment="RPZ Resolver 2"

/ipv6 firewall
address-list
add list=allowed_dns_servers_v6 address=IpV6-Resolver1 comment="IPv6 Resolver 1"
add list=allowed_dns_servers_v6 address=IpV6-Resolver2 comment="IPv6 Resolver 2"

/routing table
add name=dns-pbr fib
add name=dns-pbr-v6 fib

/ip firewall raw
add chain=prerouting dst-address-list=!allowed_dns_servers protocol=udp dst-port=53 action=notrack comment="NoTrack IPv4 DNS Redirection"
add chain=prerouting dst-address-list=!allowed_dns_servers protocol=tcp dst-port=53 action=notrack comment="NoTrack IPv4 DNS Redirection"


/ipv6 firewall raw
add chain=prerouting dst-address-list=!allowed_dns_servers_v6 protocol=udp dst-port=53 action=notrack comment="NoTrack IPv6 DNS Redirection"
add chain=prerouting dst-address-list=!allowed_dns_servers_v6 protocol=tcp dst-port=53 action=notrack comment="NoTrack IPv6 DNS Redirection"

/ip firewall mangle
add chain=prerouting connection-state=untracked protocol=udp dst-port=53 action=mark-routing new-routing-mark=dns-pbr passthrough=no comment="Route UDP DNS via PBR"
add chain=prerouting connection-state=untracked protocol=tcp dst-port=53 action=mark-routing new-routing-mark=dns-pbr passthrough=no comment="Route TCP DNS via PBR"

/ipv6 firewall mangle add
chain=prerouting connection-state=untracked protocol=udp dst-port=53 action=mark-routing new-routing-mark=dns-pbr-v6 passthrough=no comment="Route IPv6 UDP DNS via PBR"
add chain=prerouting connection-state=untracked protocol=tcp dst-port=53 action=mark-routing new-routing-mark=dns-pbr-v6 passthrough=no comment="Route IPv6 TCP DNS via PBR"

/ip route
add dst-address=0.0.0.0/0 gateway=IpV4-Resolver1 routing-table=dns-pbr check-gateway=ping comment="Redirect to Resolver 1 (Ping Check)"
add dst-address=0.0.0.0/0 gateway=IpV4-Resolver2 routing-table=dns-pbr check-gateway=ping comment="Redirect to Resolver 2 (Ping Check)"

/ipv6 route
add dst-address=::/0 gateway=IpV6-Resolver1 routing-table=dns-pbr-v6 check-gateway=ping comment="Redirect to IPv6 Resolver 1 (Ping Check)"
add dst-address=::/0 gateway=IpV6-Resolver2 routing-table=dns-pbr-v6 check-gateway=ping comment="Redirect to IPv6 Resolver 2 (Ping Check)"

Advertencia

Donde dice address hay que poner las IpV4 e IpV6 que tienen los RPZ. Donde dice gateway hay que poner las IpV4 e IpV6 que tienen los RPZ. Las mismas las encuentran en el panel de gestios PDNS.

MikroTik – Redirección DNS con PBR (Policy Based Routing)

Este esquema fuerza y optimiza el tráfico DNS (puerto 53) mediante el uso de raw, mangle y tablas de ruteo dedicadas. Su objetivo es asegurar que todas las consultas DNS salgan únicamente por los resolvers autorizados, tanto en IPv4 como en IPv6, evitando bypasses y permitiendo failover por caída de servidores.

Listas de direcciones permitidas

Las listas allowed_dns_servers y allowed_dns_servers_v6 contienen los únicos resolvers a los que se permite enviar tráfico DNS. Todo DNS que tenga como destino una IP fuera de estas listas será interceptado y procesado.

Raw: evitar el seguimiento de conexión

Las reglas en /ip firewall raw marcan como notrack cualquier tráfico DNS (UDP o TCP, puerto 53) cuyo destino no sea uno de los resolvers permitidos. Esto desactiva el connection tracking para estas conexiones, lo que permite que las reglas de marcado en mangle se ejecuten antes y sin interferencias del firewall.

Mangle: marcado para Policy Based Routing

En /ip firewall mangle se marca el tráfico DNS con un routing-mark específico (dns-pbr para IPv4 y dns-pbr-v6 para IPv6). Solo se marca el tráfico en estado untracked, es decir, el que fue previamente interceptado por las reglas de raw.

Al aplicar este routing-mark, el router sabe que ese tráfico debe ser procesado por una tabla de ruteo diferente.

Tablas de ruteo dedicadas

Se crean tablas de ruteo personalizadas (dns-pbr y dns-pbr-v6), que contienen rutas por defecto hacia los resolvers autorizados. Cada tabla incluye dos rutas: una por cada resolver disponible.

Las rutas utilizan check-gateway=ping. Esto permite que, si un resolver deja de responder, MikroTik lo detecte automáticamente y utilice la otra ruta como failover.

Resumen del flujo

  1. El cliente intenta enviar tráfico DNS a cualquier IP.

  2. Si el destino no está permitido, raw lo marca como notrack.

  3. mangle aplica un routing-mark especial al tráfico DNS.

  4. El tráfico es enviado a una tabla de ruteo personalizada.

  5. La tabla solo permite salida hacia los resolvers autorizados.

  6. Si un resolver cae, check-gateway=ping conmuta automáticamente al otro.

Con este mecanismo se garantiza que: - todo el DNS sale sí o sí por resolvers seguros, - se evita el uso de DNS externos, - hay redundancia automática, - IPv4 e IPv6 son manejados de forma consistente.