RouterOS Mikrotik - configurar servidor DNS y alternativos

morlop

Tengo un router mikrotik con routeros.
Tengo un servidor corriendo pihole/adguard home.

La cosa es que quiero:
Que las dns apunten a mí servidor para que todos tengan las dns del pihole/adguard home y cape publicidad y control parental.
Todo funciona correctamente. En routeros, IP - DNS tengo la IP del servidor y a todos los equipos se le asigna y funciona.

Ahora lo que quiero:
Si mi servidor se apaga, me quedo sin internet.
La cosa es que si en routeros en IP - DNS le meto secundaria, los equipos adquieren la principal y la secundaria, y si la web no responde, pasa de mi servidor y coge la secundaria de cloudflare entonces no me capa publicidad ni nada.

Cómo puedo hacer para que SOLO si mi servidor se apaga, use entonces una secundaria? Ya que si por lo que sea falla el servidor, mi casa se queda sin red y es un marrón, por eso quiero algo secundario. Pero claro, como digo, si doy secundario desde el principio, se saltan el capado de mi servidor.

itonny

#1 Tendrás que hacer un script en el router para que verifique regularmente el estado del pihole y en el caso de que detecte una caida redireccione la resolucion a otras DNS.

Échale un ojo a netwatch.

No lo he probado pero es lo único que se me ocurre de primeras.

También he visto por ahí otra sugerencia:

Set the DHCP server to hand out 8.8.8.8 and 8.8.4.4.
Set up a firewall nat rule that redirects that to the pihole.
Add a netwatch to see if the pihole is up. If it not... Disable the redirect.

La segunda sugerencia creo que es la correcta debido a que en la primera solución una vez dado el lease al cliente con la IP de tu pihole como DNS el cliente no renovara el nuevo cambio de servidor DNS hasta que se cumpla el expire. Bajar el tiempo de expiración del lease me parece una chapuza guarra así que yo tiraría mas por la segunda solución.

P.D: Lo probare mañana en casa xd me has creado curiosidad con este caso

1 1 respuesta
morlop

#2 gracias, voy a informarme a ver si saco algo y veo algún script que por ahora he aprendido lo que sé con winbox.

@itonny hay diferencia entre poner la DNS desde IP - DNS e IP - DHCP Server - NETWORKS - DNS?

A ver si he entendido bien:
Pongo en IP - DNS la IP de cloudflare como principal de mikrotik y la que se va a entregar a los equipos.
Creo una regla redirect de DNS Transparente para redirigir todas las DNS a mí pihole.
Creo un Netwatch a mí servidor pihole:
Si cae, anulo la regla redirect a mí pihole y debería usar la de cloudflare que está asignada por defecto.
Si levanta el servidor, activo la regla DNS Transparente y todo el tráfico DNS se redirigirá a mí servidor pihole.

He entendido bien?

No sé si es lo que han conseguido aquí o lo he entendido mal:
https://www.reddit.com/r/mikrotik/comments/11xn4iu/script_to_automatically_redirect_dns_when_local/

Alguien sabría ese script para anular o activar la regla de dns transparente?

NeoDunadan

En IP - DNS configuras los DNS que va a consultar Mikrotik, y es independiente de si a tus equipos le pones DNSs de Google, Cloudflare o PiHole.

Creo que lo que han puesto en Reddit te vale. Lo único que debes tener en cuenta es que después de las reglas de NAT que ponen exista una regla de srcnat con action masquerade (debe de haberla). Si quieres, en un Terminal ejecuta /ip firewall nat export y vemos lo que tienes por si es necesario crear o modificar algo.

Otra aproximación podría ser, sin tener mucha idea de PiHole y si es totalmente indispensable que las consultas DNS sean directas desde los clientes:

  • En IP - DHCP Server - Networks - DNS pones como DNS para los equipos al propio Mikrotik.
  • A Mikrotik le configuras el PiHole como DNS en IP - DNS (marcando lo de Allow Remote Requests, y cerciorándote de que desde el exterior en Ip - Firewall - Filter bloqueas las consultas DNS desde tu interfaz WAN, vamos, la interfaz conectada a Internet).
  • Utilizas Netwatch para comprobar si PiHole funciona o no. Necesitarás tener dos scripts:
    • En down-script sería un script que te configure en IP - DNS el valor al DNS externo que más te convenza.
    • En up-script sería un script que te cambie en IP - DNS el valor al DNS de PiHole.

Al final la idea es que las consultas de tus equipos vayan al Mikrotik, y el Mikrotik en su caché almacenará las respuestas de PiHole y las servirá a los equipos. Si cae el PiHole, Mikrotik cambia su DNS, y empieza a consultar DNSs externos. Una vez el PiHole levanta, vuelve a consultar a PiHole.

1 2 respuestas
itonny

Por cierto ten en cuenta a la hora de hacer un check a pi hole o adguard que sea vía API al servicio. Lo digo porque ahora con esta solucion solo verificas si el host esta caído o levantado pero si se te cae el servicio pero el host sigue en marcha te quedaras sin internet.

ejemplo:

:local servers [/ip dns get servers];
:do {
    /tool fetch url="http://192.168.1.26:8082/admin/api.php?status";
    if ($servers != "192.168.1.26") do={
        /lo que quieras hacer si responde;
    }
} on-error {
    if ($servers != "208.67.220.123;208.67.222.123") do={
        /lo que quieras hacer si se cae;
        :log error "Pi-hole isn't working";
    }
}
1 respuesta
morlop

#4 Entiendo.
la regla nat masquerade la tengo desde el principio para que la LAN salga a la WAN y tenga internet. (o eso te entiendo)

cerciorándote de que desde el exterior en Ip - Firewall - Filter bloqueas las consultas DNS desde tu interfaz WAN, vamos, la interfaz conectada a Internet

¿Esto quiere decir que WAN no va a tener acceso a DNS pero sí LAN (que es donde está el servidor)?

#5 Cierto, lo interesante es saber si el contenedor/servicio adguard está funcionando, más que el servidor, porque puede que el contenedor se corrompa y se quede inutilizado. ¿Sabrías cómo? Voy a mirar.

1 respuesta
itonny

#6 Te lo he actualizado

1 respuesta
morlop

#7 entiendo que ese script debería ponerlo en bucle, ya que no tiene sentido usar netwatch porque solo mira el host, no el contenedor. Sería poner ese script en bucle cada X segundos/minutos. ¿Verdad? Gracias.

1 respuesta
itonny

#8 correcto, metele un schedule a tu gusto. Para reducir el tiempo de failover haz que se ejecute cada 30 segundos por ejemplo no consume nada.

Por cierto, no se si lo sabes, puedes montar el container de adguard o pihole en el propio mikrotik con el modulo de containers xd

https://www.bgocloud.com/knowledgebase/76/howto-installing-using-docker-container-and-pihole-in-mikrotik-chr.html

2 respuestas
morlop

#9 Vale, a ver si esta tarde me pongo y lo saco en claro. Gracias.
Sabes decirme si la respuesta a #4 de #6 es así? lo de que si capo DNS en WAN en firewall, LAN sí va a tener acceso a DNS (para servidor)? por entenderlo.

2 respuestas
NeoDunadan

#10 Es tema de teoría de firewall, pero básicamente, si tienes la configuración por defecto que te viene en el Mikrotik, estarás cubierto, si has modificado algo en la parte de filter, puede que se te pueda escapar algo. De todas formas, si te pusieras un par de reglas de tipo input arriba del todo, una con protocolo TCP, otra con protocolo UDP, puerto 53, y in-interface la interfaz que tengas conectada a Internet, bloquearías que desde fuera te pudieran hacer consultas DNS, que es lo que se pretende.

Si pegas este código en un new Terminal lo tienes (siempre que ether1 sea tu wan, cambia al nombre que tenga la interfaz):

/ip firewall filter
add action=drop chain=input dst-port=53 in-interface=ether1 protocol=tcp place-before=0
add action=drop chain=input dst-port=53 in-interface=ether1 protocol=udp place-before=1

Pero vamos, que si te queres asegurar, pégate el resultado de /ip firewall filter export.

EDIT: Y sí, efectivamente, bloqueas DNS del exterior, pero desde la red local puedes consultar al Mikrotik. Al final, cuando a una regla de FW le metes más condiciones (in-interface, src-address, dst-address, por ejemplo), más selectivo eres con el tráfico, de forma que puedes diseñar distintas reglas para distintos propósitos, orígenes, destinos, etc.

1 respuesta
itonny

#10 Acabo de encontrar una manera mas sencilla sin tanta sobreingenieria. Te lo comparto porque lo he probado y me funciona correctamente.

Escenario de pruebas:

WAN: whatever
LAN: 192.168.3.0/24
GW: 192.168.3.1
PI-Hole: 192.168.3.34

DNS:

/ip dns
set allow-remote-requests=yes

DHCP-Server

/ip dhcp-server
add address-pool=dhcp_pool0 disabled=no interface=bridge1 name=dhcp1
/ip dhcp-server network
add address=192.168.3.0/24 dns-server=192.168.3.1 gateway=192.168.3.1

NAT:

/ip firewall nat
add action=masquerade chain=srcnat src-address=192.168.3.0/24
add action=dst-nat chain=dstnat comment=Blocky dst-address-list=LANs dst-port=53 protocol=tcp src-address-list=LANs to-addresses=192.168.3.34
add action=dst-nat chain=dstnat comment=Blocky dst-address-list=LANs dst-port=53 protocol=udp src-address-list=LANs to-addresses=192.168.3.34
add action=masquerade chain=srcnat comment="Hairpin NAT" connection-mark="Hairpin NAT

Mangle:

/ip firewall mangle
add action=mark-connection chain=prerouting comment="Marcamos conexiones para hairpin NAT - LAN IP" dst-address-list=LANs new-connection-mark="Hairpin NAT" passthrough=yes src-address-list=LANs

Address list:

/ip firewall address-list
add address=192.168.3.0/24 list=LANs

Script:

/system scheduler
add interval=10s name=schedule1 on-event="# Specify search filters for NAT rules\r\
    \n:local tcpRuleId [/ip firewall nat find comment=\"Blocky\" protocol=\"tcp\"]\r\
    \n:local udpRuleId [/ip firewall nat find comment=\"Blocky\" protocol=\"udp\"]\r\
    \n\r\
    \n# Find Blocky IP from NAT rule\r\
    \n:local toAddresses [/ip firewall nat get \$tcpRuleId to-addresses]\r\
    \n\r\
    \n# Specify query domain\r\
    \n:local queryDomain \"www.google.com\"\r\
    \n\r\
    \n:if ([/ip firewall nat get \$tcpRuleId disabled] = false) do={\r\
    \n    :do {\r\
    \n        :resolve \$queryDomain server=\$toAddresses\r\
    \n    } on-error={\r\
    \n        /ip firewall nat set \$tcpRuleId disabled=yes\r\
    \n        /ip firewall nat set \$udpRuleId disabled=yes\r\
    \n    }\r\
    \n} else={\r\
    \n    :do {\r\
    \n        :resolve \$queryDomain server=\$toAddresses\r\
    \n        /ip firewall nat set \$tcpRuleId disabled=no\r\
    \n        /ip firewall nat set \$udpRuleId disabled=no\r\
    \n    } on-error={}\r\
    \n}" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=sep/10/2024 start-time=13:34:24

Solo el codigo:

# Specify search filters for NAT rules
:local tcpRuleId [/ip firewall nat find comment="Blocky" protocol="tcp"]
:local udpRuleId [/ip firewall nat find comment="Blocky" protocol="udp"]

# Find Blocky IP from NAT rule
:local toAddresses [/ip firewall nat get $tcpRuleId to-addresses]

# Specify query domain
:local queryDomain "www.google.com"

:if ([/ip firewall nat get $tcpRuleId disabled] = false) do={
    :do {
        :resolve $queryDomain server=$toAddresses
    } on-error={
        /ip firewall nat set $tcpRuleId disabled=yes
        /ip firewall nat set $udpRuleId disabled=yes
    }
} else={
    :do {
        :resolve $queryDomain server=$toAddresses
        /ip firewall nat set $tcpRuleId disabled=no
        /ip firewall nat set $udpRuleId disabled=no
    } on-error={}
}

Con este sistema se simplifica un poco mas el sistema de verificacion del contenedor. Aqui el equipo mikrotik verifica si puede resolver con PiHole, en caso de no ser así deshabilita el NAT y resuelve contra las DNS dinamicas que tenga mikrotik.

El script en cuanto detecta que puede resolver nuevamente contra pihole habilitara el NAT y resolveran tus equipos con PiHole.

2 4 respuestas
morlop
#11NeoDunadan:

si tienes la configuración por defecto que te viene en el Mikrotik

tengo esa, hice mi configuración partiendo del esquema base

Voy a leerte con detenimiento y a intentar entenderlo.. Cómo algo tan "sencillo" es tan "complejo" de configurar xD

add action=masquerade chain=srcnat comment="Hairpin NAT" connection-mark="Hairpin NAT

Entiendo que aquí te ha faltado cerrar comillas:
add action=masquerade chain=srcnat comment="Hairpin NAT" connection-mark="Hairpin NAT"

1 2 respuestas
NeoDunadan

#12 Bastante elegante la verdad, #13 ,el tema del Hairpin NAT, efectivamente, le faltan las comillas de cierre.

Con RouterOS la verdad es que se pueden hacer muchas cosas, pero es cierto que te las tienes que currar y hacer que encajen las piezas.

1
itonny

#13 Si xd se me fue. Lo recomendable es que lo entiendas pero basicamente puedes hacer copy paste adaptándolos a tu red

Las claves son:

  • Vía NAT fuerzas la la resolución a tu PiHole

  • En segundo plano el script intenta resolver constantemente contra tu PiHole, si no lo consigue, deshabilita las reglas NAT que te obligan a resolver contra PiHole.

  • El script en cuanto puede volver a resolver desde PiHole vuelve a habilitar las reglas y tus dispositivos vuelven a resolver desde PiHole

  • Con el tema del hairpin el resultado es que las consultas DNS de los dispositivos locales al router (que luego se redirigen al Pi-hole) se tratan como si vinieran de fuera de la red, permitiendo que el tráfico fluya correctamente y regrese al dispositivo que hizo la consulta.

1 1 respuesta
morlop

#15 he visto este script y me ha parecido lo más sencillo del mundo, ¿Qué opinas?

:local currentDNS [/ip dns get server]
:local piholeDNS "192.168.0.50"
:local backupDNS "1.1.1.2,1.0.0.2"
:local testDomain "www.google.com"

:if ($currentDNS = $piholeDNS) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip dns set servers=$backupDNS
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip dns set servers=$piholeDNS
} on-error={}
}

Y este parece más elaborado pero creo que también lo entiendo y hace más menos igual:
https://forum.mikrotik.com/viewtopic.php?p=865025#p865025

Pd: no acabo de entender el concepto hairpin.
Un script 24/7 así, cada minuto por ejemplo, sobrecarga el router?

1 respuesta
itonny

#16 el primer script no creo que funcione por el hecho de que no estás forzando la resolución vía NAT. De todas formas es probarlo pero me da que no funcionará.

El segundo que has pasado es muy parecido al que te pase anteriormente con algunas modificaciones, pero en esencia tiene la misma lógica.

Si quieres pásanos tu configuración (pon en consola /export file=config.rsc) y pega el contenido por aquí.

1 respuesta
morlop

#17 gracias, y como comento, lo de hairpin no lo entiendo porque tengo un servidor jellyfin, con un dominio configurado con dns cloudflare, y yo puedo ver el servidor con el dominio (es decir, ip pública) desde equipos de mi red, sin tener nada de hairpin.
Entiendo que puede ser por dos cosas, porque cloudflare tengo proxy activado, o porque tenga la regla hairpin de serie en mikrotik, cosa que dudo.
Aún así, qué raro que no puedas acceder desde ip pública a tu propio servidor sin esa regla, ¿no?

Vale, viendo un vídeo de hairpin ya lo entiendo, si me va debe ser 100% porque cloudflare tiene proxy activado y la IP de destino no es mi ip externa sino la del proxy de cloudflare, si no no me funcionaría.
Ahora entiendo esto para las DNS.

0buS

#9 Wtf, me apunto esto para el finde :D

1 respuesta
morlop

#19 Yo es que he visto tan poca ram y capacidad que no quería llenar el router con esto.. no sé lo que ocupará un contenedor o cuánta ram requerirá, pero no quería cargarlo xD
Me parece bastante meterle un schedule cada 30 segundos por miedo a que pete o algo jajaja

1 respuesta
itonny

#20 tranqui que eso no sobrecarga nada, solo envía una petición y habilita deshabilita reglas.

Desde que hice la maqueta y no se ha despeinado en consumo (16096 veces se ha ejecutado hasta ahora):

Con este equipo que tengo abandonado por ahí: https://mikrotik.com/product/RB952Ui-5ac2nD - 64 MB de RAM

1 1 respuesta
morlop

#21 He visto que lo malo de este sistema es que en phiole todas las consultas las hace el router, entonces no puedo poner reglas específicas por ip, ni tengo control de qué ip hace cada cosa. Hmmm no sé si me compensa esto para lo que pierdo.

Por cierto, veo que entiendes del tema, ¿Mejor pihole o adgaurd home?

2 respuestas
itonny

#22 pues no te sabría decir ya que al ser redireccionado PiHole no debería tener problemas para gestionar sus propias reglas. Lo probaré mañana y te comento .

Referente a PiHole o adguard solo he probado el primero pero si que es verdad que se ha popularizado mucho más últimamente adguard.

1 respuesta
morlop

#23 Claro, pero el tema es que parece que los clientes apuntan a router, y es router quien consulta a dns pihole, por lo que para pihole todas las consultas las hace router.

#12 por cierto, lo he configurado y funciona perfecto, si se me cae el servidor, saltan las dns de cloudflare y toda la casa sigue con red. Muchas gracias.
PD: No me baneará google por tanto ping? le meto 30 segundos? xD

Y por aprender e intentar entender todo, los 2 masquerade del nat por qué? El hairpin creo que lo entiendo pero el otro?
Y el mangle tampoco sé qué es.

1 respuesta
itonny

#24 mmm prueba a activar el connection tracking IP -> firewall -> Connections -> tracking y dejalo en enabled.

Mira si te respeta el origen de las peticiones desde pihole

1 respuesta
morlop

#25 he activado eso y me ha reventado el router.
No puedo acceder ni a él.
Vaya liada... 🤦‍♂️

Router does not support secure connection. Enable legacy mode.
En winbox, tools, activo legacy y no conecta, se queda en logging in... Y luego timed out..

Si le doy al botón reset mantengo los files backup dentro del router?
Puedo deshacer esto por consola?

@0buS a ver si sabes ayudarme tú también por favor. @itonny @NeoDunadan

1 respuesta
itonny

#26 entrale poniendo la MAC en vez de la ip

1 1 respuesta
morlop

#27 Qué crack eres. Ya está. Restaurado.

Por cierto, tengo en Files, una carpeta llamada "backup" con mis backups. Si le doy al botón físico de reset, tengo entendido que estos archivos se mantienen, ¿cierto? Aún así tengo los backups en mi pc xD

Gracias por resolver.

PD: Esa opción no ha funcionado para el pihole xD

Por cierto, si me conecto con VPN por qué no dejo de ver anuncios? Ese tráfico no dirige DNS a mi servidor?

itonny

Depende como tengas los rangos IP de la VPN, en las reglas del NAT tendrás que incluirlos si no es la misma subred (en address list añade el rango a LANs)

Por otro lado me puedes pegar un pantallazo del firewall en el apartado NAT? Porque a mi me identifica individualmente las peticiones

P.D: Perdon si me salto algunas preguntas pero es que voy leyendo en diagonal y las paso por alto sin querer xd

3 respuestas
morlop

#29 cuando esté esta tarde en casa te paso pantallazo.
Dejé deshabilitado lo de tracking.
Gracias por toda tu atención, me viene de lujo para exprimir el mikrotik porque la verdad que es complicado.
Estoy intentando ver vídeos y aprender, ¿Recomiendas algún curso de mikrotik o canal o similar para aprender todo esto de cero? Incluyendo conocimientos de redes.

1 respuesta