[SOLUCIONADO] Mikrotik + PiHole (sin internet cuando PiHole está offline)

Hola a todos, lamento que este mensaje sea otro socorro :(. A ver si me pueden ayudar...

Ayer mismo me puse PiHole (Docker) en un servidor unRAID (junto a otros servicios), y lo configuré según recomendación de un usuario de aquí en el MikroTik.
El PiHole lo configuré con una IP "fija" en la red usando br0 (macvlan), no haciendo uso del bridge por defecto.

Una vez PiHole ya estaba corriendo, habilité las DNS correspondientes dentro de la interfaz (Cloudflare) y configuré el Interface Settings como 'Allow only local requests'.

Posteriormente, accedí al router, fui a IP > DHCP Server > Networks (pestaña), abrí la red que tengo creada e incluí el servicio de PiHole (192.168.1.126) en la sección 'DNS Servers'. Guardé y listo.

Hasta hoy, parece que PiHole funciona correctamente, es decir, veo cómo los anuncios de las principales webs que visito ya no se ven, y se puede observar cómo los contadores de las estadísticas del mismo varian. Me detecta correctamente todos los clientes conectados, etc. Incluso accediendo por VPN puedo navegar sin problemas.

El problema viene cuando simulo que esa IP deja de ser operativa, es decir, detengo el contenedor de PiHole. El router deja de proporcionar DNS a los dispositivos, y PiHole sigue estando como DNS principal (y único). Ya he probado a reiniciar las tarjetas de red para que vuelvan a conectarse.

Mi intención es que, en caso de que PiHole se caiga por x motivo, los dispositivos conectados al router pasen a usar las configuradas en 'IP > DNS' (1.1.1.1,1.0.0.1), y cuando vuelva a estar operativo, que vuelva a pasar todo el tráfico por PiHole.

Nota: Poniendo al propio router como servidor DNS secundario en 'IP > HDCP Server > Networks (pestaña)' me da internet a los dispositivos en caso de que PiHole se caiga. Pero, creo, no es la configuración correcta.

- - - - - - - - - - - - - - - - - - - -

Otra cosa que no comprendo es, por qué los dispositivos que se intenten conectar por wifi, después de que PiHole se haya caído, ya no puedan coger IP por el servidor DHCP del router (PiHole no está como servidor DHCP). Es decir, cada vez que un móvil o cualquier otro dispositivo wifi que se haya desconectado previamente, intenta reconectar, es rechazado por el router.

- - - - - - - - - - - - - - - - - - - -

A continuación, un extracto de las partes afectadas con relación al PiHole en mi router:

Código:
/interface bridge
add admin-mac=<OCULTO> auto-mac=no comment=defconf name=bridge

/interface wireguard
add listen-port=<OCULTO> mtu=1420 name=vpn-casa

/interface vlan
add interface=ether1 name=vlan832 vlan-id=832

/interface list
add comment=defconf name=WAN
add comment=defconf name=LAN

/interface wireless security-profiles
set [ find default=yes ] supplicant-identity=MikroTik
add authentication-types=wpa2-psk mode=dynamic-keys name=protegido \
    supplicant-identity=""
    
/interface wireless
set [ find default-name=wlan1 ] band=2ghz-g/n country=spain \
    default-authentication=no disabled=no distance=indoors frequency=2437 \
    mode=ap-bridge security-profile=protegido ssid=<OCULTO> wps-mode=\
    disabled
set [ find default-name=wlan2 ] band=5ghz-n/ac channel-width=20/40/80mhz-eCee \
    country=spain default-authentication=no disabled=no distance=indoors \
    frequency=5200 mode=ap-bridge security-profile=protegido ssid=\
    <OCULTO>-5G wps-mode=disabled
    
/ip pool
add name=default-dhcp ranges=192.168.1.2-192.168.1.254

/ip dhcp-server
add address-pool=default-dhcp interface=bridge lease-script="" name=defconf
    
/ppp profile
set *FFFFFFFE interface-list=LAN

/interface bridge port
add bridge=bridge comment=defconf interface=ether2
add bridge=bridge comment=defconf interface=ether3
add bridge=bridge comment=defconf interface=ether4
add bridge=bridge comment=defconf interface=ether5
add bridge=bridge comment=defconf interface=wlan1
add bridge=bridge comment=defconf interface=wlan2

/ip neighbor discovery-settings
set discover-interface-list=LAN

/interface list member
add comment=defconf interface=bridge list=LAN
add comment=defconf interface=ether1 list=WAN
add interface=*F list=LAN
add interface=vpn-casa list=LAN

/interface wireguard peers
add allowed-address=100.100.1.2/32 comment="Redmi Note 7" interface=vpn-casa \
    public-key="<OCULTO>"
add allowed-address=100.100.1.3/32 comment="Port\E1til (SPL-LAPTOP)" \
    interface=vpn-casa public-key=\
    "<OCULTO>"
    
/interface wireless access-list
add comment="Enchufe L\E1mpara (estudio)" mac-address=<OCULTO>
add comment="Enchufe Altavoces (estudio)" mac-address=<OCULTO>
add comment="Tira LED (estudio)" mac-address=<OCULTO>
add comment="Tira LED (cocina)" mac-address=<OCULTO>
add comment="Enchufe (comedor)" mac-address=<OCULTO>
add comment="Amazon Fire TV" mac-address=<OCULTO>
add comment="Centralita (dom\F3tica)" mac-address=<OCULTO>
add comment="M\F3vil (LG K10)" mac-address=<OCULTO>
add comment="M\F3vil (RN7)" mac-address=<OCULTO>
add comment="Bombilla LED (estudio)" mac-address=<OCULTO>
add comment="PC (port\E1til)" mac-address=<OCULTO>
add comment="Enchufe (calentador)" mac-address=<OCULTO>
add comment="Esc\E1ner (Epson ES-60W)" mac-address=<OCULTO>

/ip address
add address=192.168.1.1/24 comment=defconf interface=bridge network=\
    192.168.1.0
add address=100.100.1.1/24 interface=vpn-casa network=100.100.1.0

/ip cloud
set ddns-enabled=yes ddns-update-interval=5m

/ip dhcp-client
add comment=defconf interface=vlan832 use-peer-dns=no use-peer-ntp=no

/ip dhcp-server lease
add address=192.168.1.125 client-id=<OCULTO> mac-address=\
    <OCULTO> server=defconf
add address=192.168.1.100 client-id=<OCULTO> mac-address=\
    <OCULTO> server=defconf
add address=192.168.1.105 client-id=<OCULTO> mac-address=\
    <OCULTO> server=defconf
add address=192.168.1.10 client-id=<OCULTO> mac-address=\
    <OCULTO> server=defconf
    
/ip dhcp-server network
add address=192.168.1.0/24 comment=defconf dns-server=192.168.1.126 gateway=\
    192.168.1.1
    
/ip dns
set allow-remote-requests=yes servers=1.1.1.1,1.0.0.1

/ip dns static
add address=192.168.1.1 comment=defconf disabled=yes name=router.lan

/ip firewall address-list
add address=<OCULTO>.sn.mynetname.net list=public-ip

/ip firewall filter
add action=accept chain=input comment=\
    "defconf: accept established,related,untracked" connection-state=\
    established,related,untracked
add action=drop chain=input comment="defconf: drop invalid" connection-state=\
    invalid
add action=accept chain=input comment="defconf: accept ICMP" protocol=icmp
add action=accept chain=input comment=\
    "defconf: accept to local loopback (for CAPsMAN)" dst-address=127.0.0.1
add action=accept chain=input comment=vpn-casa dst-port=42937 protocol=udp
add action=drop chain=input comment="defconf: drop all not coming from LAN" \
    in-interface-list=!LAN
add action=accept chain=forward comment="defconf: accept in ipsec policy" \
    ipsec-policy=in,ipsec
add action=accept chain=forward comment="defconf: accept out ipsec policy" \
    ipsec-policy=out,ipsec
add action=fasttrack-connection chain=forward comment="defconf: fasttrack" \
    connection-state=established,related hw-offload=yes
add action=accept chain=forward comment=\
    "defconf: accept established,related, untracked" connection-state=\
    established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" \
    connection-state=invalid
add action=drop chain=forward comment=\
    "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \
    connection-state=new in-interface-list=WAN
    
/ip firewall nat
add action=masquerade chain=srcnat comment="NAT Loopback (2)" dst-address=\
    192.168.1.0/24 src-address=192.168.1.0/24
add action=masquerade chain=srcnat comment="defconf: masquerade" \
    ipsec-policy=out,none out-interface=vlan832
add action=dst-nat chain=dstnat comment=qBittorrent dst-port=8988 \
    in-interface=vlan832 protocol=tcp to-addresses=192.168.1.100 to-ports=\
    6881
add action=dst-nat chain=dstnat comment="Nginx Proxy (1)" disabled=yes \
    dst-port=80 in-interface=vlan832 protocol=tcp to-addresses=192.168.1.125 \
    to-ports=10080
add action=dst-nat chain=dstnat comment="Nginx Proxy (2)" disabled=yes \
    dst-port=443 in-interface=vlan832 protocol=tcp to-addresses=192.168.1.125 \
    to-ports=10443
add action=dst-nat chain=dstnat comment="NAT Loopback (1)" dst-address-list=\
    public-ip dst-port=443 protocol=tcp to-addresses=192.168.1.125 to-ports=\
    10443
add action=dst-nat chain=dstnat disabled=yes dst-address=!192.168.1.126 \
    dst-port=53 protocol=tcp src-address=!192.168.1.126 to-addresses=\
    192.168.1.126
add action=dst-nat chain=dstnat disabled=yes dst-address=!192.168.1.126 \
    dst-port=53 protocol=udp src-address=!192.168.1.126 to-addresses=\
    192.168.1.126
add action=masquerade chain=srcnat disabled=yes dst-address=192.168.1.126 \
    dst-port=53 protocol=tcp src-address=192.168.1.0/24
add action=masquerade chain=srcnat disabled=yes dst-address=192.168.1.126 \
    dst-port=53 protocol=udp src-address=192.168.1.0/24
    
/ip service
set telnet disabled=yes
set ftp disabled=yes
set www disabled=yes
set ssh disabled=yes
set api disabled=yes
set api-ssl disabled=yes

/ipv6 firewall address-list
No uso IPv6

/ipv6 firewall filter
No uso IPv6
    
/system clock
set time-zone-name=Europe/Madrid

/system ntp client
set enabled=yes

/system ntp client servers
add address=hora.roa.es

/system scheduler
Ningún schedule relacionado con PiHole.
    
/system script
Ningún script relacionado con PiHole.
    
/tool mac-server
set allowed-interface-list=LAN

/tool mac-server mac-winbox
set allowed-interface-list=LAN
 
Última edición:
El PiHole lo configuré con una IP "fija" en la red usando br0 (macvlan), no haciendo uso del bridge por defecto.
Esto no sé qué es, ¿me lo explicas?

Una vez PiHole ya estaba corriendo, habilité las DNS correspondientes dentro de la interfaz (Cloudflare) y configuré el Interface Settings como 'Allow only local requests'.
Si corre en un contenedor, es posible que te toque usar el modo "Respond only on interface ethX" o incluso "permit all origins" si vas a querer usarlo por ejemplo desde las conexiones vía wireguard o desde cualquier otro remoto. Siempre que esa IP esté protegida por el firewall por defecto, no deberías tener mayor problema.

Nota: Poniendo al propio router como servidor DNS secundario en 'IP > HDCP Server > Networks (pestaña)' me da internet a los dispositivos en caso de que PiHole se caiga. Pero, creo, no es la configuración correcta.
Es justo la manera correcta de hacerlo. Tu Network, quedaría así:
Código:
/ip dhcp-server network
add address=192.168.1.0/24 comment=defconf dns-server=192.168.1.126,192.168.1.1 gateway=192.168.1.1

No tiene más mistero: se cae el pi-hole: responde el DNS del router, aunque no filtre anuncios.

Saludos!
Otra cosa que no comprendo es, por qué los dispositivos que se intenten conectar por wifi, después de que PiHole se haya caído, ya no puedan coger IP por el servidor DHCP del router (PiHole no está como servidor DHCP). Es decir, cada vez que un móvil o cualquier otro dispositivo wifi que se haya desconectado previamente, intenta reconectar, es rechazado por el router.
Asegúrate de que no hay ningún otro DHCP en la red, ese comportamiento que describes, no es normal. Puedes usar la opción de alertas (última pestaña del DHCP), para que detecte si hay otro en el mismo segmento de red. Ejemplo:
Código:
/ip dhcp-server alert
add disabled=no interface=bridge

Si el DHCP detecta un servidor en el mismo segmento de broadcast del bridge, chillará en los logs.

Saludos!
 
Esto no sé qué es, ¿me lo explicas?
"El PiHole lo configuré con una IP "fija" en la red usando br0 (macvlan), no haciendo uso del bridge por defecto."
En unRAID (SO para servidores) hay una opción para seleccionar qué tipo de red usarán los contenedores en Docker: Bridge, Host, Custom (br#) y None.
Al crear el contenedor, lo hice por medio de una red macvlan para que éste tuviese su propia IP en la red.

364547.JPG


Si corre en un contenedor, es posible que te toque usar el modo "Respond only on interface ethX" o incluso "permit all origins" si vas a querer usarlo por ejemplo desde las conexiones vía wireguard o desde cualquier otro remoto. Siempre que esa IP esté protegida por el firewall por defecto, no deberías tener mayor problema.
Lo tomaré en cuenta, aunque creo, estoy pensándome pasar el PiHole a un servidor dedicado sin Docker (RPi) y me ahorro posibles problemas referentes al tema de redes.

Es justo la manera correcta de hacerlo. Tu Network, quedaría así:
/ip dhcp-server network add address=192.168.1.0/24 comment=defconf dns-server=192.168.1.126,192.168.1.1 gateway=192.168.1.1
Justamente de esa manera es cómo puedo seguir teniendo internet si PiHole se desconecta. Simplemente, no lo he incluido en el script para mostrar como lo tengo cuando fallaba. Gracias por dicha observación!

Asegúrate de que no hay ningún otro DHCP en la red, ese comportamiento que describes, no es normal. Puedes usar la opción de alertas (última pestaña del DHCP), para que detecte si hay otro en el mismo segmento de red. Ejemplo:
/ip dhcp-server alert add disabled=no interface=bridge

Si el DHCP detecta un servidor en el mismo segmento de broadcast del bridge, chillará en los logs.
Gracias por el dato!
 
Hola Pokoyo,
¿Esa configuración de DNS alternativa funciona bien?
Te pregunto porque hace tiempo, una vez configuré el pihole, ya me planteé como solucionar una posible caída e intenté esa configuración sin mucho éxito debido a que se colaba publicidad aleatoriamente. Ahora no se exactamente si la DNS alternativa la configuraba en el servidor DHCP (/ip/dhcp-server/network) o en la configuración propia de DNS (/ip dns). Pero lo que se es que no iba fino, es más creo recordar ciertos comentarios por aquí acerca de esto.

Finalmente opté por configurar la detección del servidor dns mediante Netwatch

Con Netwatch va perfecto, si el PiHole está activo, la DNS configurada es la la propia, si está caído se cambia a la alternativa, cuando de nuevo se detecta UP, se vuelve a configurar la del PiHole
Netwatch
Host: la IP del pihole
Type: tcp-conn
Port: 53
timeout: 1s

On UP:
/ip dns set servers= la ip del pihole
/ip/dhcp-server/network set 0 dns-server= la ip del pihole

On Down:
/ip dns set servers=1.1.1.1
/ip/dhcp-server/network set 0 dns-server=192.168.0.1

Un saludo....
 
Gracias por compartir una forma alternativa @gusarapinho

Otra alternativa que he visto, aunque no la he aplicado, es por medio de script, hacer el cambio de los DNS en segundo plano si éste detecta que el servidor DNS local deja de estar operativo. Pero esto, supongo representaria una carga innecesaria al router y al log, pues se debería configurar un scheduler que se ejecutara, al menos en lo personal, cada 5 segundos máximo.

Y, aprovechando tu comentario...
El PiHole, en tu caso, lo tienes instalado en un servidor dedicado únicamente a él, o lo tienes junto a otros servicios?
Porque, actualmente el mío lo tengo junto a otros servicios, pero estoy teniendo algunos problemas con la red que maneja el propio servidor y la de Docker, según lo tengo actualmente. Por eso estoy planteándome pasarlo a uno separado (RPi).

Más adelante quizás pruebe unbound para tener un DNS recursivo también.
 
Última edición:
Gracias por compartir una forma alternativa @gusarapinho

Otra alternativa que he visto, aunque no la he aplicado, es por medio de script, hacer el cambio de los DNS en segundo plano si éste detecta que el servidor DNS local deja de estar operativo. Pero esto, supongo representaria una carga innecesaria al router y al log, pues se debería configurar un scheduler que se ejecutara, al menos en lo personal, cada 5 segundos máximo.

Y, aprovechando tu comentario...
El PiHole, en tu caso, lo tienes instalado en un servidor dedicado únicamente a él, o lo tienes junto a otros servicios?
Porque, actualmente el mío lo tengo junto a otros servicios, pero estoy teniendo algunos problemas con la red que maneja el propio servidor y la de Docker, según lo tengo actualmente. Por eso estoy planteándome pasarlo a uno separado (RPi).

Más adelante quizás pruebe unbound para tener un DNS recursivo también.
El PiHole está montado en un "servidor" exclusivo para él.... mientras no haya otras cosas corriendo en ese servidor :). Es un pC muy sencillo, una placa Asrock AM1H-ITX + Athlon 5350 + 8Gb, corriendo Ubuntu 20.04. Lo tengo aquí porque tenía ese hardware sin uso y lo he resucitado, lo alimento con una fuente de laptop y el consumo es bastante reducido(12-14w), no creo que mejor que una raspberry pero estuve mirando ese hardware y no conseguía encontrarlo barato.
Esta configuración no da problemas, va muy bien, aunque últimamente se me ha caido varias veces por culpa del HD mecánico que viene heredado de un portátil de hace mucho tiempo y que ya ni siquiera pasa los test SMART. Por esto que me vi en la obligación de poner el netwatch.
 
¿Esa configuración de DNS alternativa funciona bien?
Sí, perfecta.

Te pregunto porque hace tiempo, una vez configuré el pihole, ya me planteé como solucionar una posible caída e intenté esa configuración sin mucho éxito debido a que se colaba publicidad aleatoriamente.
Porque metías el pi-hole junto a otro DNS público en IP -> DNS. Ahí los servidores de upstream se consultan indistintamente, no hay primario ni secundario. Pero, cuando los entregas por DHCP, esa prioridad sí existe, siendo el primario el que se usa, a menos que falle.

Lo que tienes hecho con el script es igualmente válido, aunque yo no actualizaría el IP -> DNS, sino siempre el DNS que entregas en el DHCP.

Saludos!
 
Ok pokoyo, siempre se aprende algo nuevo.
Ahora aplica preguntar... entonces para que sirve especificar una IP DNS en IP -> DNS?
Pensaba que ésta era la DNS que usaría el router aguas arriba del DHCP, quiero decir, para su uso propio, por ejemplo resolver el servidor horario o las propias peticiones hechas al router cuando el DHCP entrega como DNS el propio router. No hace falta definir esta DNS?
Porque si fuera así y quisiera usar igualmente el pihole para el propio router sí tendría que aplicar IP -> DNS -> el pihole, cierto o ya me he liado del todo?

Un saludo y muchas gracias

Editado: Lo bueno que le veo al Netwatch es que sin mucha parafernalia directamente registra en el log que el pihole se cayó, aunque eso se ve instantáneamente si estas mirando cualquier página de noticias:ROFLMAO:
 
IP > DNS es la dns del propio router o para servir como servidor DNS. Pero, si le metes ahí el pi-hole y este muere, muere el propio router, porque no es capaz de resolver peticiones públicas (adiós túneles ni nada que dependa de un dominio). Así que no es muy buena idea meter el pi-hole como upstream en IP -> DNS.

Hazlo como te digo, que a esto ya le he dado yo muchas vueltas, y es la mejor configuración posible. Y el propio router no necesita para nada un dns filtrado.

Saludos!
 
Entonces....
En IP -> DNS una DNS pública confiable
En /ip/dhcp-server/network DNS la ip del Ph como primaria y la del propio router como secundaria, en caso que caiga el primero se envian las peticiones a las DNS publicas de IP -> DNS ... ok, pues nada, en 2 minutos está actualizado

Un saludo!!!!
 
Entonces....
En IP -> DNS una DNS pública confiable
En /ip/dhcp-server/network DNS la ip del Ph como primaria y la del propio router como secundaria, en caso que caiga el primero se envian las peticiones a las DNS publicas de IP -> DNS ... ok, pues nada, en 2 minutos está actualizado

Un saludo!!!!
en IP -> DNS, mete más de una IP pública de distintos proveedores. Tipo 1.1.1.1, 8.8.8.8, así aseguras que si uno muere, el otro sigue resolviendo.

En DHCP -> Networks, mete los DNS en orden de prioridad: primero el pi-hole y, como segundo, o bien el propio router (si tienes el allow-remote-requests activado y permitido dicho tráfico en input), y así aprovechas la caché de dns del router, o directamente un dns público.

Saludos!
 
Bueno, por mi parte, la configurción del PiHole ya la he podido hacer. Y, al final, acabé por mover dicho servicio a un servidor dedicado para ahorrarme problema con puertos y/o interfaces (Docker).

Muchas gracias Pokoyo!
 
Yo lo que hice, fué poner como servidor DNS en el dhcp server el propio mikrotik, y en el mikrotik utilizar como DNS principal y secundaria la pi hole, aparte de esto tengo un netwatch que si se cae el pihole las DNS del mikrotik cambian a las DNS de google.


UP:
log info "PIHOLE UP"
/ip dns set servers=192.168.1.2,192.168.1.2

DOWN:
log info "PIHOLE DOWN"
/ip dns set servers=1.1.1.1,8.8.8.8
 
Última edición:
Arriba