Torguards IP Checker

WireGuard VPN – Solución de problemas

A continuación, creamos una interfaz WireGuard en el espacio de nombres “init” (original):

Torguards IP Checker

Al igual que todas las interfaces de red de Linux, WireGuard se integra en la infraestructura del espacio de nombres de la red. Esto significa que un administrador puede tener varios subsistemas de redes completamente diferentes y elegir qué interfaces viven en cada uno.

WireGuard hace algo bastante interesante. Cuando se crea una interfaz WireGuard (con el enlace IP, agregue WG0 tipoguard de cable de tipo), recuerda el espacio de nombres en el que se creó. “Fui creado en el espacio de nombres A.”Más tarde, WireGuard se puede mover a nuevos espacios de nombres (” Me estoy moviendo al espacio de nombres B.”), pero aún recordará que se originó en el espacio de nombres A.

WireGuard utiliza un socket UDP para enviar y recibir paquetes cifrados. Este enchufe siempre vive en el espacio de nombres a – El espacio de nombres del lugar de nacimiento original. Esto permite algunas propiedades muy geniales. A saber, puede crear la interfaz de WireGuard en un espacio de nombres (a), moverla a otro (b) y hacer que los paquetes ClearText enviados desde el espacio de nombres B se envíen en cifurado a través de un Socket UDP en el espacio de nombres A.

(Tenga en cuenta que esta misma técnica está disponible para las interfaces basadas en el espacio de usuarios, mediante la creación de un descriptor de archivos de socket en un espacio de nombres, antes de cambiar a otro espacio de nombres y mantener el descriptor de archivos desde el espacio de nombres anterior abierto.)

Esto abre algunas posibilidades muy agradables.

Recipiente ordinario

El uso más obvio de esto es dar contenedores (como contenedores Docker, por ejemplo) una interfaz de WireGuard como su única interfaz.

Contenedor # IP AdDR 1: LO: MTU 65536 QDISC Noqueue State Desconocido Grupo predeterminado Qlen 1 Enlace/Loopback 00: 00: 00: 00: 00: 00 Brd 00: 00: 00: 00: 00: 00 INET 127.0.0.1/8 Alcance Host Lo Valid_lft Forever Preferred_lft Forever 17: WG0: MTU 1423 QDISC Noqueue State Desconocido Grupo predeterminado Qlen 1 Link/Ninguno Inet 192.168.4.33/32 Alcance global WG0 válido_lft para siempre preferido_lft para siempre 

Aquí, la única forma de acceder a la red posible es a través de WG0, la interfaz WireGuard.

La forma de lograr una configuración como esta es la siguiente:

Primero creamos el espacio de nombres de red llamado “Contenedor”:

# netns ip agregue contenedor 

A continuación, creamos una interfaz WireGuard en el espacio de nombres “init” (original):

# enlace IP Agregar WG0 Tipo WireGuard 

Finalmente, movemos esa interfaz al nuevo espacio de nombres:

# enlace IP Establecer WG0 Netns Container 

Ahora podemos configurar WG0 como de costumbre, excepto que especificamos su nuevo espacio de nombres para hacerlo:

# ip -n contenedor complement 192.168.4.33/32 Dev WG0 # IP Netns Exec Contense WG SetConf WG0/ETC/WireGuard/WG0.Conf # IP -N Enlace del contenedor Establecer WG0 UP # IP -N Ruta del contenedor Agregar dev WG0 predeterminado WG0 

Y Voila, ahora la única forma de acceder a cualquier recurso de red para “Contenedor” será a través de la interfaz WireGuard.

Tenga en cuenta que los usuarios de Docker pueden especificar el PID de un proceso Docker en lugar del nombre del espacio de nombres de red, para usar el espacio de nombres de red que Docker ya creó para su contenedor:

# enlace IP Establecer WG0 NETNS 879 

Enrutando todo su tráfico

Un uso menos obvio, pero extremadamente poderoso, es usar esta característica de WireGuard para redirigir todo su tráfico de Internet ordinario sobre WireGuard. Pero primero, revisemos las viejas soluciones habituales para hacer esto:

Las soluciones clásicas

Las soluciones clásicas se basan en diferentes tipos de configuraciones de tabla de enrutamiento. Para todos estos, necesitamos establecer una ruta explícita para el punto final real de WireGuard. Para estos ejemplos, supongamos que el punto final de WireGuard es la demostración.guardaespaldas.com, que, a partir de escribir, se resuelve a 163.172.161.0 . Además, supongamos que generalmente nos conectamos a Internet usando Eth0 y la puerta de enlace clásica de 192.168.1.1 .

Reemplazo de la ruta predeterminada

La técnica más directa es simplemente reemplazar la ruta predeterminada, pero agregue una regla explícita para el punto de finalización de WireGuard:

# ruta IP del valor predeterminado # ruta IP Agregue Dev predeterminado WG0 # Ruta IP Agregar 163.172.161.3/32 a través de 192.168.1.1 Dev eth0 

Esto funciona y es relativamente sencillo, pero los demonios de DHCP y tales les gusta deshacer lo que acabamos de hacer, desafortunadamente.

Anular la ruta predeterminada

Entonces, en lugar de reemplazar la ruta predeterminada, podemos anularla con dos reglas más específicas que se suman en suma al valor predeterminado, pero coinciden antes del valor predeterminado:

# ruta IP Agregar 0.0.0.0/1 Dev WG0 # Ruta IP Agregar 128.0.0.0/1 Dev WG0 # Ruta IP Agregar 163.172.161.3/32 a través de 192.168.1.1 Dev eth0 

De esta manera, no cubrimos la ruta predeterminada. Esto también funciona bastante bien, sin embargo, desafortunadamente cuando Eth0 sube y baja, la ruta explícita para la demostración.guardaespaldas.com serán olvidados, lo cual es molesto.

Enrutamiento basado en reglas

Algunas personas prefieren usar enrutamiento basado en reglas y múltiples tablas de enrutamiento. La forma en que esto funciona es que creamos una tabla de enrutamiento para rutas WireGuard y una tabla de enrutamiento para rutas de Internet de texto sin formato, y luego agregamos reglas para determinar qué tabla de enrutamiento usar para cada uno:

# Regla de IP Agregar a 163.172.161.0 Búsqueda principal Pref 30 # Regla de IP Agregar a todas las búsquedas 80 Pref 40 # Ruta IP Agregue el desarrollo predeterminado WG0 Tabla 80 

Ahora, podemos mantener las tablas de enrutamiento separadas. Desafortunadamente, la desventaja es que las reglas explícitas de punto final aún deben agregarse, y no hay limpieza cuando se elimina la interfaz, y ahora deben duplicarse las reglas de enrutamiento más complicadas.

Enrutamiento mejorado basado en reglas

La solución anterior se basa en nosotros conociendo la IP de punto final explícito que debe estar exenta del túnel, pero los puntos finales de WireGuard pueden deambular, lo que significa que esta regla puede pasar obsoleta. Afortunadamente, podemos establecer un FWMark en todos los paquetes que salen de la toma UDP de WireGuard, que luego estará exenta del túnel:

# WG SET WG0 FWMARK 1234 # Ruta de IP Agregue el desarrollo predeterminado WG0 Tabla 2468 # Regla de IP Agregar no Fwmark 1234 Tabla 2468 # Regla de IP Agregar tabla principal Supress_prefixlength 0 

Primero establecemos el FWmark en la interfaz y establecemos una ruta predeterminada en una tabla de enrutamiento alternativa. Luego indicamos que los paquetes que no tienen el FWMark deben ir a esta tabla de enrutamiento alternativa. Y finalmente agregamos una función de conveniencia para seguir accediendo a la red local, por la cual permitimos que los paquetes sin que FWMark use la tabla de enrutamiento principal, no la tabla de enrutamiento de la interfaz de WireGuard, si coincide con cualquier ruta con una longitud de prefijo mayor que cero, tales como rutas locales no predeterminadas. Esta es la técnica utilizada por la herramienta WG-Quick (8).

Mejorando las soluciones clásicas

Los autores de WireGuard están interesados ​​en agregar una característica llamada “Notoif” al núcleo para cubrir los casos de uso del túnel. Esto permitiría que las interfaces digan “no enrutar este paquete usándome como una interfaz, para evitar el bucle de enrutamiento”. WireGuard podría agregar una línea como .Flowi4_not_oif = wg0_idx, y las interfaces basadas en el espacio de usuarios podrían establecer una opción en su socket saliente como SetSockOpt (FD, SO_NOTOIF, TUN0_IDX); . Desafortunadamente esto aún no se ha fusionado, pero puedes leer el hilo LKML aquí.

La nueva solución del espacio de nombres

Resulta que podemos enrutar todo el tráfico de Internet a través de WireGuard utilizando espacios de nombres de red, en lugar de los clásicos hacks de la mesa de enrutamiento. La forma en que esto funciona es que movemos interfaces que se conectan a Internet, como ETH0 o WLAN0, a un espacio de nombres (que llamamos “físico”), y luego hacemos que una interfaz de SireGuard sea la única interfaz en el espacio de nombres “init”.

Primero creamos el espacio de nombres de red “físico”:

# netns ip agregue físico 

Ahora movemos ETH0 y WLAN0 al espacio de nombres “físico”:

# enlace IP Set Eth0 Netns Física # IW Phy Phy0 Set Netns Nombre físico 

(Tenga en cuenta que los dispositivos inalámbricos deben moverse utilizando IW y especificando el dispositivo físico Phy0 .)

Ahora tenemos estas interfaces en el espacio de nombres “físico”, mientras que no tenemos interfaces en el espacio de nombres “init”:

# IP -N Enlace físico 1: LO: MTU 65536 QDISC Noop State Down Mode Group predeterminado Qlen 1 Enlace/Loopback 00: 00: 00: 00: 00: 00 Brd 00: 00: 00: 00: 00: 00 2: ETH0: MTU 1500 QDISC PFIFO_FAST MODE DE ABAJO DE ALTO DE ABAJO Predeterminado Qlen 1000 Enlace/Ether AB: CD: EF: G1: 23: 45 Brd FF: FF: FF: FF: FF: FF 3: WLAN0: MTU 1500 QDISC MQ STATE UP Modo grupo latente predeterminado Qlen 1000 Enlace/éter 01: 23: 45: 67: 89: AB Brd FF: FF: FF: FF: FF: FF # enlace IP IP 1: LO: MTU 65536 QDISC Noqueue Modo desconocido Grupo predeterminado QLEN 1 enlace/loopback 00: 00: 00: 00: 00: 00 Brd 00: 00: 00: 00: 00: 00 

Ahora agregamos una interfaz WireGuard directamente al espacio de nombres “físico”:

# IP -N Enlace físico Agregue WG0 Tipo WireGuard 

El espacio de nombres en el lugar de nacimiento de WG0 es ahora el espacio de nombres “físico”, lo que significa que los enchufes UDP de texto cifrado se asignarán a dispositivos como ETH0 y WLAN0 . Ahora podemos mover WG0 al espacio de nombres “init”; Sin embargo, todavía recordará su lugar de nacimiento para los enchufes.

# IP -N Enlace físico Conjunto de WG0 Netns 1 

Especificamos “1” como el espacio de nombres “init”, porque ese es el PID del primer proceso en el sistema. Ahora el espacio de nombres “init” tiene el dispositivo WG0:

# enlace IP 1: LO: MTU 65536 QDISC Noqueue Estado de estado Desconocido Grupo predeterminado Qlen 1 Enlace/Loopback 00: 00: 00: 00: 00: 00 Brd 00: 00: 00: 00: 00: 00 17: WG0: MTU: MTU 1423 QDISC Noqueue Estado de estado desconocido Grupo predeterminado predeterminado QLEN 1 enlace/ninguno 

Ahora podemos configurar los dispositivos físicos utilizando las herramientas ordinarias, pero las lanzamos dentro del espacio de nombres de red “físico”:

# IP Netns Exec Physical DHCPCD WLAN0 # IP NETNS EXEC FISICAL WPA_SUPPlicant -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf # ip -n adds físico agregar 192.168.12.52/24 Dev eth0 

Etcétera. Finalmente, podemos configurar la interfaz WG0 como de costumbre, y establecerla como la ruta predeterminada:

# WG SetConf WG0/etc/WireGuard/WG0.conf # ip add add 10.2.4.5/32 DEV WG0 # enlace IP Establecer WG0 UP # Ruta IP Agregue Dev WG0 predeterminado 

Finalizado! En este punto, todos los procesos ordinarios en el sistema enrutarán sus paquetes a través del espacio de nombres “init”, que solo contiene la interfaz WG0 y las rutas WG0. Sin embargo, WG0 tiene su socket UDP viviendo en el espacio de nombres “físico”, lo que significa que enviará tráfico fuera de ETH0 o WLAN0 . Los procesos normales ni siquiera serán conscientes de ETH0 o WLAN0, excepto DHCPCD y WPA_Supplicant, que fueron generados dentro del espacio de nombres “físico”.

A veces, sin embargo, es posible que desee abrir una página web o hacer algo rápidamente usando el espacio de nombres “físico”. Por ejemplo, tal vez planee enrutar todo su tráfico a través de WireGuard como de costumbre, pero la cafetería en la que está sentado requiere que autentique usando un sitio web antes de que le brinde un enlace de Internet real. Por lo tanto, puede ejecutar procesos de selección (como su usuario local) utilizando la interfaz “física”:

$ sudo -e ip netns ejecut físico sudo -e -u \#$ (id -u) -g \#$ (id -g) cromo 

Esto, por supuesto, podría convertirse en una buena función para .BASHRC:

Physexec ()

Y ahora puedes escribir lo siguiente para abrir el cromo en el espacio de nombres “físico”.

$ Physexec Cromo 

Cuando haya terminado de registrarse en la red de cafeterías, genere un navegador como de costumbre, y surfee con calma sabiendo que todo su tráfico está protegido por WireGuard:

$ cromo 

Muestra de guión

El siguiente script de ejemplo se puede guardar como/usr/local/bin/wgphys y utilizado para comandos como wgphys up, wgphys down y wgphys ejecut:

#!/bin/bash set -Ex [[$ uid != 0]] && Exec Sudo -e "psreadlink -f "$ 0")" "ps" arriba() < killall wpa_supplicant dhcpcd || true ip netns add physical ip -n physical link add wgvpn0 type wireguard ip -n physical link set wgvpn0 netns 1 wg setconf wgvpn0 /etc/wireguard/wgvpn0.conf ip addr add 192.168.4.33/32 dev wgvpn0 ip link set eth0 down ip link set wlan0 down ip link set eth0 netns physical iw phy phy0 set netns name physical ip netns exec physical dhcpcd -b eth0 ip netns exec physical dhcpcd -b wlan0 ip netns exec physical wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf -iwlan0 ip link set wgvpn0 up ip route add default dev wgvpn0 >abajo() < killall wpa_supplicant dhcpcd || true ip -n physical link set eth0 down ip -n physical link set wlan0 down ip -n physical link set eth0 netns 1 ip netns exec physical iw phy phy0 set netns 1 ip link del wgvpn0 ip netns del physical dhcpcd -b eth0 dhcpcd -b wlan0 wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf -iwlan0 >execi () < exec ip netns exec physical sudo -E -u \#$ Sudo_uidpsID -U)> -gramo \#$ Sudo_gidpsID -G)> -- "ps" > comando ="$ 1" cambio caso "$ comando" en Subir Subir "ps" ;; Abajo abajo "ps" ;; ejecut) execi "ps" ;; *) eco "Uso: $ 0 arriba | abajo | ejecutivo " > & 2; salida 1 ;; ESAC 

Una pequeña demostración de lo anterior:

© Copyright 2015-2022 Jason A. Donenfeld. Reservados todos los derechos. “WireGuard” y el logotipo “WireGuard” son marcas registradas de Jason A. Donenfeld.

Este proyecto es de ZX2C4 y de Edge Security, una empresa dedicada a la experiencia en investigación de seguridad de la información.

WireGuard VPN – Solución de problemas

Puede ser útil dejar una terminal abierta con el comando watch wg. Aquí hay una salida de muestra que muestra un sistema con dos pares configurados, donde solo uno ha establecido la VPN hasta ahora:

Cada 2.0s: WG J-WG: Viernes 26 de agosto 17:44:37 2022 Interfaz: WG0 Clave pública: +T3t3htmeyRedVim8fbxbyjbz +/Poeotg3rlvl9kjmm = clave privada: (Hidden) Puerto de audición: 51000 PEER: 2CJDFCNZXV4YUGYDTTHTAHTOFBY Punto: 10.172.196.106: 51000 permitidos IP: 10.10.11.2/32 Último apretón de manos: 3 horas, 27 minutos, 35 segundos Transferencia: 3.06 KIB recibido, 2.80 KIB enviado al par: zliz1hlarzqvfxpmyme2ectxdk611nb7uzlad4mcpgi = permitido IPS: 10.10.11.3/32 

Mensajes de depuración del kernel

WireGuard también está en silencio cuando se trata de registrar. Al ser un módulo de núcleo esencialmente, necesitamos habilitar explícitamente el registro detallado de su módulo. Esto se hace con el siguiente comando:

$ echo "módulo cableguard de cable +p" | sudo tee/sys/kernel/debug/dynamic_debug/control 

Esto escribirá mensajes de registro de WireGuard en el registro del kernel, que se puede ver en vivo con:

$ sudo dmesg -wt 

Para deshabilitar el registro, ejecute esto:

$ Echo "Module WireGuard -p" | sudo tee/sys/kernel/debug/dynamic_debug/control 

Dirección de destino requerida

Si hace ping una IP y recupera un error como este:

$ ping 10.10.11.2 ping 10.10.11.2 (10.10.11.2) 56 (84) bytes de datos. De 10.10.11.1 ICMP_SEQ = 1 Host de destino Ping inalerable: Sendmsg: Dirección de destino requerida 

Esto está sucediendo porque la interfaz de WireGuard seleccionada para este destino no sabe el punto final para ello. En otras palabras, no sabe dónde enviar el tráfico encriptado.

Un escenario común para esto es en un par donde no hay una configuración de punto final, que es perfectamente válido, y el host está tratando de enviar tráfico a ese par. Tomemos el escenario de la cafetería que describimos anteriormente como ejemplo.

La computadora portátil está conectada a la VPN e intercambia el tráfico como de costumbre. Luego se detiene un poco (la persona fue a buscar una taza más). El tráfico cesa (WireGuard está en silencio, recuerde). Si el enrutador de la casa ahora se reinicia, cuando vuelva a aparecer, no sabrá cómo llegar a la computadora portátil, porque nunca antes lo contactó antes. Esto significa que en este momento, si el enrutador de la casa intenta enviar tráfico a la computadora portátil en la cafetería, recibirá el error anterior.

Ahora el usuario de la computadora portátil regresa y genera algo de tráfico a la red doméstica (recuerde: la computadora portátil tiene el valor de punto final de la red doméstica). La VPN “despierta”, los datos se intercambian, se completan los apretones de manos, y ahora el enrutador de inicio conoce el punto final asociado con la computadora portátil y puede iniciar nuevamente un nuevo tráfico sin problemas.

Otra posibilidad es que uno de los compañeros esté detrás de un Nat, y no había suficiente tráfico para que el firewall con estado considerara viva la “conexión”, y dejó caer el mapeo de Nat que tenía. En este caso, el par podría beneficiarse de la configuración persistente de mantenimiento, lo que hace que WireGuard envíe un mantener viva sondear cada muchos segundos.

Clave requerida no disponible

$ ping 10.10.11.1 ping 10.10.11.1 (10.10.11.1) 56 (84) bytes de datos. De 10.10.11.2 ICMP_SEQ = 1 Host de destino Ping inalerable: sendmsg: clave requerida no disponible 

Puede suceder cuando tiene una ruta que dirige el tráfico a la interfaz de WireGuard, pero esa interfaz no tiene la dirección de destino en su configuración de Pedido.

Si ha habilitado la depuración del kernel para WireGuard, también verá un mensaje como este en la salida DMESG:

WireGuard: Home0: Ningún par ha permitido IP que coincida con 10.10.11.1