MANUAL: Mikrotik, WireGuard VPN a fondo (RW + STS)

Llevo tiempo leyendo el foro para empaparme de tanto conocimiento y gracias a vosotros he conseguido poner en servicio Wireguard y Pi-hole ( sobre Nas en docker ). Me he encontrado con el mismo problema que los compañeros ya que filtra la publicidad cuando estoy en casa, pero no cuando me conecto por Wireguard. Con la configuración de @huzoaaz en el post 44, me funciona a medias ( filtra publicidad de algunas webs y de otras no ).

He encontrado una forma muy simple de resolver el problema y la comparto por si os sirve de ayuda:

- En Pi-Hole / settings / DNS / Interface settings, simplemente con desmarcar " Allow only local requests " y activar " Permit all origins ", filtra toda la publicidad tando de la red local como a través del Wireguard. La configuración en el router no cambia.

Al ser una solución tan simple, me surge la la siguiente duda, ¿ esta configuración es segura ?. No tengo el puerto 53 abierto.
 

Adjuntos

  • Captura de pantalla 2022-01-05 210737.jpg
    Captura de pantalla 2022-01-05 210737.jpg
    182.6 KB · Visitas: 55
Llevo tiempo leyendo el foro para empaparme de tanto conocimiento y gracias a vosotros he conseguido poner en servicio Wireguard y Pi-hole ( sobre Nas en docker ). Me he encontrado con el mismo problema que los compañeros ya que filtra la publicidad cuando estoy en casa, pero no cuando me conecto por Wireguard. Con la configuración de @huzoaaz en el post 44, me funciona a medias ( filtra publicidad de algunas webs y de otras no ).

He encontrado una forma muy simple de resolver el problema y la comparto por si os sirve de ayuda:

- En Pi-Hole / settings / DNS / Interface settings, simplemente con desmarcar " Allow only local requests " y activar " Permit all origins ", filtra toda la publicidad tando de la red local como a través del Wireguard. La configuración en el router no cambia.

Al ser una solución tan simple, me surge la la siguiente duda, ¿ esta configuración es segura ?. No tengo el puerto 53 abierto.
Si el pi-hole está debajo de tu red, con su firewall adecuado, sin problema. Si el firewall lo tienes regulero, pues… ya sabes.

Saludos!
 
Buenas tardes.

Por aquí aparezco con preguntas básicas después de tanta complejidad montando sedes y túneles.

He montado mi wireguard con IP 10.10.0.X y veo por aquí que muchos tenéis la IP tipo 192.168.X.X al igual que el resto de pools del router.
Como no sé muy bien lo que implica, ¿Poner un rango de IPs es a gusto de cada uno o debería pasarme a una 192.168.X.X como tengo en el resto de pools en el router?
 
Buenas tardes.

Por aquí aparezco con preguntas básicas después de tanta complejidad montando sedes y túneles.

He montado mi wireguard con IP 10.10.0.X y veo por aquí que muchos tenéis la IP tipo 192.168.X.X al igual que el resto de pools del router.
Como no sé muy bien lo que implica, ¿Poner un rango de IPs es a gusto de cada uno o debería pasarme a una 192.168.X.X como tengo en el resto de pools en el router?

Puedes poner el rango que quieras… no implica nada… simplemente, diferenciar unas pool de otras…. Yo, en mi lan principal tengo 195.135.xxx.xxx y en el wireguard 10.66.xxx.xxx, asi que sin problemas poner lo que te pida el cuerpo…

Mientras tengas claros los diferentes segmentos que vayas a poner, no problem…
 
Buenas, no se que le pasa a mi STS, ya conseguí hacerla funcionar que eso ya es un logro, gracias @pokoyo, pero ahora se me cae, no es estable. Por ejemplo: ayer intenté conectarme al otro mk y me daba error hice un Ping y nada paquetes perdidos. Hable con el otro sitio para que me encendieran un ordenador y conectarme con teamviewer, entre en los dos MikroTik deshabilite y volví a habilitar la configuración de WireGuard y quedó funcionando. Perfecto. Hoy vuelvo a intentar entrar al otro mk y otra vez me da error, imagino que se ha vuelto a caer. No se, si es el cloud que no se renueva correctamente o si se cambia WireGuard no se da cuenta y sigue llamando a la misma ip, raro me parece. Los dos sitios están con ip publica dinámica.
 
Buenas, no se que le pasa a mi STS, ya conseguí hacerla funcionar que eso ya es un logro, gracias @pokoyo, pero ahora se me cae, no es estable. Por ejemplo: ayer intenté conectarme al otro mk y me daba error hice un Ping y nada paquetes perdidos. Hable con el otro sitio para que me encendieran un ordenador y conectarme con teamviewer, entre en los dos MikroTik deshabilite y volví a habilitar la configuración de WireGuard y quedó funcionando. Perfecto. Hoy vuelvo a intentar entrar al otro mk y otra vez me da error, imagino que se ha vuelto a caer. No se, si es el cloud que no se renueva correctamente o si se cambia WireGuard no se da cuenta y sigue llamando a la misma ip, raro me parece. Los dos sitios están con ip publica dinámica.
Métele un persistent keepalive cada 10 segundos, a ver si así no se cae. Sospecho que el NAT te pueda joder las conexiones, especialmente si por encima tienes otro router de operadora.

Por otro lado, ¿apagáis los equipos? lo digo porque una IP dinámica, una vez que un router arranca, es raro que cambie por sí sola, a menos que haya una actuación en esa subred que obligue a renegociar las conexiones o que tu router se apague y encienda (donde digo router n digo sólo el mikrotik, sino el router/ont que haya por encima). Este tipo de setups, cuanto menos los toques y más tiempo estén levantados, mejor.

Saludos!
 
Métele un persistent keepalive cada 10 segundos, a ver si así no se cae. Sospecho que el NAT te pueda joder las conexiones, especialmente si por encima tienes otro router de operadora.

Por otro lado, ¿apagáis los equipos? lo digo porque una IP dinámica, una vez que un router arranca, es raro que cambie por sí sola, a menos que haya una actuación en esa subred que obligue a renegociar las conexiones o que tu router se apague y encienda (donde digo router n digo sólo el mikrotik, sino el router/ont que haya por encima). Este tipo de setups, cuanto menos los toques y más tiempo estén levantados, mejor.

Saludos!
Gracias @pokoyo le meteré un persistent keepalive a los dos peers.
Los equipos no lo apagamos, pero por ejemplo con Vodafone mi router cada semana más o menos cambia ip
 
Genial la guía, he conseguido hacerlo funcionar para conectarme con un Android.
El problema es que solo consigo funcionar si pongo como DNS en Android una pública, no parece que funcione ni poniendo la primera del rango asignado al interfaz Wireguard (10.10.0.1) que debería de ser el propio router ni la IP donde tengo pihole.
En el firewall he puesto una regla de input para que pueda conectarse pero creo que debería de haber además un regla de forward porque sino entiendo que el cliente (peer) no puede ver el resto de la red del servidor.

Un saludo,
 
Buenas.

No consigo hacerlo funcionar, no sé si el problema puede estar en las reglas del firewall o en el ipv6?

Código:
/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: allow wireguard-rw" dst-port=\
    12345 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="defconf: masquerade" \
    ipsec-policy=out,none out-interface-list=WAN
/ipv6 address
add address=::1 from-pool=pool6 interface=bridge
/ipv6 dhcp-client
add add-default-route=yes interface=pppoe-out1 pool-name=pool6 rapid-commit=\
    no request=address,prefix use-peer-dns=no
/ipv6 firewall filter
add action=drop chain=input comment="Drop (invalid)" connection-state=invalid
add action=accept chain=input comment="Accept (established, related)" \
    connection-state=established,related
add action=accept chain=input comment="Accept DHCP (10/sec)" in-interface=\
    pppoe-out1 limit=10,20:packet protocol=udp src-port=547
add action=drop chain=input comment="Drop DHCP (>10/sec)" in-interface=\
    pppoe-out1 protocol=udp src-port=547
add action=accept chain=input comment="Accept external ICMP (10/sec)" \
    in-interface=pppoe-out1 limit=10,20:packet protocol=icmpv6
add action=drop chain=input comment="Drop external ICMP (>10/sec)" \
    in-interface=pppoe-out1 protocol=icmpv6
add action=accept chain=input comment="Accept internal ICMP" in-interface=\
    !pppoe-out1 protocol=icmpv6
add action=drop chain=input comment="Drop external" in-interface=pppoe-out1
add action=reject chain=input comment="Reject everything else"
add action=accept chain=output comment="Accept all"
add action=drop chain=forward comment="Drop (invalid)" connection-state=\
    invalid
add action=accept chain=forward comment="Accept (established, related)" \
    connection-state=established,related
add action=accept chain=forward comment="Accept external ICMP (20/sec)" \
    in-interface=pppoe-out1 limit=20,50:packet protocol=icmpv6
add action=drop chain=forward comment="Drop external ICMP (>20/sec)" \
    in-interface=pppoe-out1 protocol=icmpv6
add action=accept chain=forward comment="Accept internal" in-interface=\
    !pppoe-out1
add action=accept chain=forward comment="Accept outgoing" out-interface=\
    pppoe-out1
add action=drop chain=forward comment="Drop external" in-interface=pppoe-out1
add action=reject chain=forward comment="Reject everything else"


Lo de wireguard está tal cual:

Código:
/interface wireguard
add listen-port=12345 mtu=1420 name=wireguard-rw

Código:
/interface wireguard peers
add allowed-address=192.168.50.2/32 comment=PeerRW interface=wireguard-rw \
    public-key="LA CLAVE PUBLICA QUE GENERA LA APLICACIÓN DE WIREGUARD EN EL IPHONE"

Ahora la configuración en el iphone está tal que así:

1642297102633.png


La clave pública que sale en interfaz es la que le meto al mikrotik en:

Código:
/interface wireguard peers
add allowed-address=192.168.50.2/32 comment=PeerRW interface=wireguard-rw \
    public-key="LA CLAVE PUBLICA QUE GENERA LA APLICACIÓN DE WIREGUARD EN EL IPHONE"

La clave pública que sale en par es la que se genera dentro del mikrotik en el apartado wireguard.

Punto final es la dirección que genera el mikrotik al activar lo de ip-cloud.

Si conecto no tiene acceso a internet ni a nada y si voy a ver registro sale "Sending handshake initation" y luego "Handshake did not complete after 5 seconds" y así se repite continuamente.
 
Genial la guía, he conseguido hacerlo funcionar para conectarme con un Android.
El problema es que solo consigo funcionar si pongo como DNS en Android una pública, no parece que funcione ni poniendo la primera del rango asignado al interfaz Wireguard (10.10.0.1) que debería de ser el propio router ni la IP donde tengo pihole.
En el firewall he puesto una regla de input para que pueda conectarse pero creo que debería de haber además un regla de forward porque sino entiendo que el cliente (peer) no puede ver el resto de la red del servidor.

Un saludo,
Necesitas una segunda regla de input si quieres usar el dns del propio router, aceptando el tráfico de la subred 10.10.0.0/24, si es la que elegiste para tus clientes vpn. O meter la interfaz como perteneciente a la lista LAN.

El servicion DNS es algo que monta el propio router, de ahí que trabajes en input, al igual que cuando metes la regla que permite la conexión VPN en sí. En forward no hace falta meter nada.

Saludos!
 
Buenas.

No consigo hacerlo funcionar, no sé si el problema puede estar en las reglas del firewall o en el ipv6?

Código:
/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: allow wireguard-rw" dst-port=\
    12345 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="defconf: masquerade" \
    ipsec-policy=out,none out-interface-list=WAN
/ipv6 address
add address=::1 from-pool=pool6 interface=bridge
/ipv6 dhcp-client
add add-default-route=yes interface=pppoe-out1 pool-name=pool6 rapid-commit=\
    no request=address,prefix use-peer-dns=no
/ipv6 firewall filter
add action=drop chain=input comment="Drop (invalid)" connection-state=invalid
add action=accept chain=input comment="Accept (established, related)" \
    connection-state=established,related
add action=accept chain=input comment="Accept DHCP (10/sec)" in-interface=\
    pppoe-out1 limit=10,20:packet protocol=udp src-port=547
add action=drop chain=input comment="Drop DHCP (>10/sec)" in-interface=\
    pppoe-out1 protocol=udp src-port=547
add action=accept chain=input comment="Accept external ICMP (10/sec)" \
    in-interface=pppoe-out1 limit=10,20:packet protocol=icmpv6
add action=drop chain=input comment="Drop external ICMP (>10/sec)" \
    in-interface=pppoe-out1 protocol=icmpv6
add action=accept chain=input comment="Accept internal ICMP" in-interface=\
    !pppoe-out1 protocol=icmpv6
add action=drop chain=input comment="Drop external" in-interface=pppoe-out1
add action=reject chain=input comment="Reject everything else"
add action=accept chain=output comment="Accept all"
add action=drop chain=forward comment="Drop (invalid)" connection-state=\
    invalid
add action=accept chain=forward comment="Accept (established, related)" \
    connection-state=established,related
add action=accept chain=forward comment="Accept external ICMP (20/sec)" \
    in-interface=pppoe-out1 limit=20,50:packet protocol=icmpv6
add action=drop chain=forward comment="Drop external ICMP (>20/sec)" \
    in-interface=pppoe-out1 protocol=icmpv6
add action=accept chain=forward comment="Accept internal" in-interface=\
    !pppoe-out1
add action=accept chain=forward comment="Accept outgoing" out-interface=\
    pppoe-out1
add action=drop chain=forward comment="Drop external" in-interface=pppoe-out1
add action=reject chain=forward comment="Reject everything else"


Lo de wireguard está tal cual:

Código:
/interface wireguard
add listen-port=12345 mtu=1420 name=wireguard-rw

Código:
/interface wireguard peers
add allowed-address=192.168.50.2/32 comment=PeerRW interface=wireguard-rw \
    public-key="LA CLAVE PUBLICA QUE GENERA LA APLICACIÓN DE WIREGUARD EN EL IPHONE"

Ahora la configuración en el iphone está tal que así:

Ver el adjunto 90936

La clave pública que sale en interfaz es la que le meto al mikrotik en:

Código:
/interface wireguard peers
add allowed-address=192.168.50.2/32 comment=PeerRW interface=wireguard-rw \
    public-key="LA CLAVE PUBLICA QUE GENERA LA APLICACIÓN DE WIREGUARD EN EL IPHONE"

La clave pública que sale en par es la que se genera dentro del mikrotik en el apartado wireguard.

Punto final es la dirección que genera el mikrotik al activar lo de ip-cloud.

Si conecto no tiene acceso a internet ni a nada y si voy a ver registro sale "Sending handshake initation" y luego "Handshake did not complete after 5 seconds" y así se repite continuamente.
Configuraste la 192.168.50.1/24 en la propia interfaz wireguard, en IP > Adresses?

Probablemente tu problema es que te hayas dejado algún carácter por copiar de las claves públicas. Pero como tenéis la manía (descuida, que no es cosa tuya, lo hacéis todos) de taparlas, no se ve. Las claves públicas se llaman así precisamente porque no son sensibles, y pueden compartirse públicamente. La que te tienes que guardar con celo y sumo cuidado es la privada.

Saludos!
 
Lo de las claves no lo entiendo, si no las tapo no podría entonces cualquiera configurar un cliente con ellas y entrar en mi vpn? Bueno les faltaría el ddns… pero solo les faltaría una cosa.

Las claves las he copiado y pegado siempre, no he comprobado carácter a carácter, pero sí que he comprobado el primero y el último carácter y coinciden (raro sería que al copiar y pegar me deje un carácter intermedio).

En ip addresses tengo una línea con 192.168.50.1/24 en address, 192.168.50.0 en network y wireguard-rw en interface.
 
Lo de las claves no lo entiendo, si no las tapo no podría entonces cualquiera configurar un cliente con ellas y entrar en mi vpn? Bueno les faltaría el ddns… pero solo les faltaría una cosa.
Piénsalo bien, es una relación de confianza entre pares. Por mucho que yo tenga tu IP pública, si tú no confías en mi como par y no me configuras como tal (peer) yo jamás podré comunicarme contigo, por mucho que sepa tu IP y puerto donde corre la VPN. De hecho, es más sensible el dato del puerto que el de la clave pública en sí.
Tu clave pública a mi me vale para cuando tú me envías tráfico, verificar que es tuyo, y para cuando yo te lo envío a ti, encriptarlo con dicha clave. Pero si tú no escuchas ese tráfico, yo puedo hacer lo que se me plante.
La seguridad no está en las claves públicas, sino en los peers, puesto que es el punto donde "autorizas" a un par remoto a comunicarse contigo.

Las claves las he copiado y pegado siempre, no he comprobado carácter a carácter, pero sí que he comprobado el primero y el último carácter y coinciden (raro sería que al copiar y pegar me deje un carácter intermedio).
Vuelve a validarlas y asegúrate de que están cruzadas. Es decir, la de la interfaz del router en el peer del móvil, y la de la interfaz del móvil en el peer de router.

Por lo demás lo veo todo bien.

Saludos!
 
Piénsalo bien, es una relación de confianza entre pares. Por mucho que yo tenga tu IP pública, si tú no confías en mi como par y no me configuras como tal (peer) yo jamás podré comunicarme contigo, por mucho que sepa tu IP y puerto donde corre la VPN. De hecho, es más sensible el dato del puerto que el de la clave pública en sí.
Tu clave pública a mi me vale para cuando tú me envías tráfico, verificar que es tuyo, y para cuando yo te lo envío a ti, encriptarlo con dicha clave. Pero si tú no escuchas ese tráfico, yo puedo hacer lo que se me plante.
La seguridad no está en las claves públicas, sino en los peers, puesto que es el punto donde "autorizas" a un par remoto a comunicarse contigo.


Vuelve a validarlas y asegúrate de que están cruzadas. Es decir, la de la interfaz del router en el peer del móvil, y la de la interfaz del móvil en el peer de router.

Por lo demás lo veo todo bien.

Saludos!
Creo que el problema va a ser que estoy detrás de un cg-nat (Digi).

He ido a ip cloud para comprobar que había metido bien la dirección ddns, y sale lo de “Router is behind a NAT. Remote connection might not work.”
 
Creo que el problema va a ser que estoy detrás de un cg-nat (Digi).

He ido a ip cloud para comprobar que había metido bien la dirección ddns, y sale lo de “Router is behind a NAT. Remote connection might not work.”
Hombre, sí... :p va a ser eso. Por mucho que tu abras un puerto en tu router, hay otro por encima que no puedes abrir. Pide salir de CG-NAT si te interesa usar una VPN.

Saludos!
 
Necesitas una segunda regla de input si quieres usar el dns del propio router, aceptando el tráfico de la subred 10.10.0.0/24, si es la que elegiste para tus clientes vpn. O meter la interfaz como perteneciente a la lista LAN.

El servicion DNS es algo que monta el propio router, de ahí que trabajes en input, al igual que cuando metes la regla que permite la conexión VPN en sí. En forward no hace falta meter nada.
Me refería a lo de montar la regla de forward para poder acceder a cosas dentro de la LAN, como por ejemplo un pihole, o un NAS o cosas así. Ahí entiendo que sí que habría que meter una regla de forward, que tenga como entrada la interfaz de Wireguard no?

Mientras que si solo quiero usar el DNS del router bastaría con poner el input que tenga como origen la interfaz Wireguard o la subred ¿correcto?

Muchas gracias!
 
Me refería a lo de montar la regla de forward para poder acceder a cosas dentro de la LAN, como por ejemplo un pihole, o un NAS o cosas así. Ahí entiendo que sí que habría que meter una regla de forward, que tenga como entrada la interfaz de Wireguard no?

Mientras que si solo quiero usar el DNS del router bastaría con poner el input que tenga como origen la interfaz Wireguard o la subred ¿correcto?

Muchas gracias!
No, no es correcto. En forward no necesitas nada más que la configuración que el propio router ya trae por defecto.

Saludos!
 
No, no es correcto. En forward no necesitas nada más que la configuración que el propio router ya trae por defecto.
Vale, ya lo he entendido.

Ya lo tengo funcionando bien.
Con eso y modificando la configuración de los firewall de dentro de la red para permitir peticiones desde la subred está funcionando. Y también el pihole configurando para aceptar peticiones desde todos los origenes ya que por defecto está para solo un salto de red.

Muchas gracias!
 
Gracias @pokoyo le meteré un persistent keepalive a los dos peers.
Los equipos no lo apagamos, pero por ejemplo con Vodafone mi router cada semana más o menos cambia ip
Se te soluciono? a mi me pasa lo mismo con uno de los enlaces, cada cierto tiempo se desconecta, el keepalive lo tengo puesto en 25 seg que es lo que recomendaban en la pagina de mk, otra cosa que me paso varias veces es que cuando en uno de los nodos se corta la luz y vuelve no hace la conexión en forma automática, tengo que deshabilitar y volver a habilitar el peer del lugar donde se corto la luz.
Con respecto al la conexión RW el "problema" que le encontré es que cuando un cliente se conecta fisicamente en la misma red que esta el VPN, sin deshabilitar el WG anda todo perfecto menos las impresoras de red que tiran error de conexión. Por otro lado 2 clientes distintos me comentaron que si el internet es malo notan mucho mas lento WG que OpenVPN
 
Arriba