En este tutorial aprenderás a conectar tu red local (principalmente, un PC) con una computadora en otro lugar (en este caso un VPS o algún servidor Cloud). Así, podremos enrutar tráfico de ENTRADA y SALIDA a tu red local desde internet, y preservar las IPs originales de la conexión, teniendo el servidor VPN como firewall o gateway.
Usaremos “VPS” para referirnos a la computadora con IP pública y que actuará como servidor VPN Wireguard, y “localpc” como computadora de nuestra infraestructura local, que solo tiene conexión a internet (incluso con CG NAT) y que se conectará como cliente a nuestro servidor “VPS” usando también la VPN Wireguard.
Lo primero de todo, asegurate de que ambos VPS y localpc tienen habilitado el IP forwarding. Quizás necesites ejecutar esto en cada inicio del sistema (quizás, no estoy seguro). Puedes hacerlo con cron, systemd o directamente en /etc/network/interfaces con un “post-up” en la interfaz que quieras.
echo 1 > /proc/sys/net/ipv4/ip_forward
Segundo, instala Wireguard en tus dos computadoras (el VPS y el localpc):
apt install wireguard wireguard-dkms # en algunas distros más nuevas, basta con ejecutar esto: apt install wireguard
Crea tus claves public/private en tus dos computadoras (los archivos en sí que generen no nos sirven, solo su contenido como texto, luego los borraremos).
cd /etc/wireguard/ wg genkey | tee private.key | wg pubkey > public.key
Ahora configuraremos el Wireguard en el VPS. Editaremos el archivo /etc/wireguard/<yoursrv>.conf. Ten en cuenta que <yoursrv> va sin “<” y “>” y “yoursrv” será el nombre de la interfaz de red que genere Wireguard. En todo el tutorial usaré “<>” para enmarcar valores variables.
[Interface] # La direccción IP que tendrá la interfaz de Wireguard Address = 10.5.0.1/32 # Usamos el 443 (UDP) para evadir la limitación de tráfico de los proveedores de internet residencial, porque por ejemplo QUIC (usado por YouTube) hace que sea muy pesado el monitoreo de grandes cantidades de tráfico en ese puerto y protocolo. ListenPort = 443 PrivateKey = <copia el contenido de "private.key" del VPS> # La siguiente línea no hace nada (está comentada), es solo una forma de guardar la PublicKey para poder utilizarla más tarde en otras configuraciones. #PublicKey = <copia el contenido de "public.key" del VPS> # Lo siguiente, añadiremos una serie de comandos "PostUp" que se ejecutarán (evidentemente) después de levantar la interfaz. # Quizás no sea necesario. PostUp = ifconfig yoursrv broadcast 10.5.0.255 up # Añade la ruta que especifica por donde llegar a los clientes VPN. (Quizás no sea necesario tampoco, porque creo que Wireguard mediante el kernel es capaz de enrutar el tráfico igualmente sin que aparezca en las rutas del sistema cuando escribes "ip route" por ejemplo). PostUp = ip route add 10.5.0.0/24 dev yoursrv # (totalmente opcional) otras rutas por ejemplo se añadirían así. En este caso enrutamos unas redes locales muy comunes por el otro punto de nuestra VPN punto a punto, que en este caso sería "localpc" #PostUp = ip route add 10/8 via 10.5.0.2 #PostUp = ip route add 192.168/16 via 10.5.0.2 # Opcional, quizás inutil porque creo que los servidores Wireguard suelen poner 1420 de MTU por defecto, aunque a veces ponen otro valor. Supongo que quizás se pone un valor óptimo automático según unos factores que desconozco. #PostUp = ifconfig yoursrv mtu 1420 # configuración del par VPN para nuestro cliente: localpc [Peer] PublicKey = <copia el contenido de "public.key" del localpc> # Esta conf especifica qué IPs son permitidas para pasar por esta interfaz (en ambas direcciones, supongo). # Ponemos la IP del peer y luego 0.0.0.0/0 entendiendo que pasará todo tipo de IPs por esta interfaz. AllowedIPs = 10.5.0.2/32, 0.0.0.0/0 PersistentKeepalive = 5
Ahora, en el “localpc”, modifica el archivo /etc/wireguard/<whatever>.conf y añade este contenido:
[Interface] # Esta será la IP de la interfaz wireguard en tu localpc Address = 10.5.0.2/32 PrivateKey = <copia el contenido de "private.key" del localpc> # Como he dicho en la anterior configuración del VPS, ponemos esta siguiente línea comentada para tener este valor disponible por si necesitamos configurar otra cosa en adelante. #PublicKey = <copia el contenido de "public.key" del localpc> [Peer] # Qué IPs son permitidas para pasar por la interfaz (también se usa para enrutar todo el tráfico de salida por esta interfaz). Es extraño Wireguard, no me preguntes como funciona, no lo sé xD AllowedIPs = 10.5.0.0/24, 0.0.0.0/0 PublicKey = <copia el contenido de "public.key" del VPS> EndPoint = <IP_publica_VPS>:443 # recuerda: 443/udp, y debe ser alcanzable por tu localpc PersistentKeepalive = 30
Luego, borra los archivos “public.key” y “private.key” en ambas computadoras:
cd /etc/wireguard/ rm public.key private.key
Casi para terminar, levanta las dos interfaces desde ambas computadoras usando wg-quick o en su defecto systemd si tienes.
# en el VPS: wg-quick up yoursrv # la forma manual (tienes que programar autoejecución en el startup) systemctl enable wg-quick@yoursrv; systemctl start wg-quick@yoursrv # la forma systemd (ya se autoejecuta en el startup) # en el localpc: wg-quick up whatever # la forma manual (tienes que programar autoejecución en el startup) systemctl enable wg-quick@whatever; systemctl start wg-quick@whatever # la forma systemd (ya se autoejecuta en el startup)
Fijate que hemos usado el nombre de interfaz “yoursrv” en el VPS y “whatever” en el localpc para diferenciar y demostrar que podemos usar nombres distintos para las interfaces y no afectarán para nada en su funcionamiento, aunque si usas los mismos nombres funcionará igualmente. Es más, quizás sea más recomendado, para no liarse, pero esto es para que se entienda.
Si todo está bien, deberías poder hacer ping a tu VPS desde el localpc con:
ping 10.5.0.1 # Comprueba el estado de wireguard en cualquier nodo que tenga wireguard configurado. wg
Y finalmente, para terminar, necesitamos enrutar tráfico para que funcione. Vamos a hacer un ejemplo con enrutamiento de HTTP (que es lo más común) pero esto se usaría igual para cada servicio que queramos enrutar a nuestra IP interna. Para ello, ejecutaremos estos comandos de iptables (debemos tenerlo instalado):
# ejecutar en "VPS": enruta el tráfico de ENTRADA a la IP pública del VPS, en los puertos TCP 80 y 443, al destino 10.5.0.2 (que en este ejemplo sería la IP de localpc en la VPN). iptables -t nat -A PREROUTING -d <ip_public_del_VPS> -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.5.0.2 # ejecutar en "VPS": enmascara (cambia la IP) del tráfico en la SALIDA cuando el tráfico (establecido o nuevo) sale de localpc a internet por la VPN, ya que si salimos con una IP interna (de la VPN), el siguiente gateway no sabría como enrutar de vuelta, y menos todavía la IP de destino final (que es otra IP en internet). iptables -t nat -A POSTROUTING -s 10.5.0.2/32 -o <nombre_interfaz_VPS_ip_publica> -j MASQUERADE # ejecutar en "localpc": este comando es un "hack" que permite solucionar el problema de disconcordancias de MTU en ciertas aplicaciones TCP que pueden no funcionar correctamente. Esto evita tener que cambiar el MTU de cada interfaz de red donde tengamos aplicaciones que puedan no funcionar. Fuente: https://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.cookbook.mtu-mss.html iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # ejecutar en "VPS": Opcionalmente, SOLO si tenemos una política DROP en nuestro filter de iptables "FORWARD", debes añadir esto: iptables -A FORWARD -i <nombre_interfaz_VPS_ip_publica> -d 10.5.0.2/32 -p tcp -m multiport --dports 80,443 -j ACCEPT iptables -A FORWARD -i <yoursrv> -o <nombre_interfaz_VPS_ip_publica> -j ACCEPT
Con todo esto, deberías por fin recibir tráfico en tu localpc con las IPs originales y sobre todo sabiendo que pasamos por una IP públic fija que no depende de infraestructuras complicadas de DDNS y que además nos supone una posible protección extra ante ataques DDoS o similares, ya que se podría cortar el tráfico y evitar la caída de más nodos de nuestra red.