Por Felix Freeman (Lo esencial) y geoma (El texto)
Para quienes quieren hostear sus propios servicios y están por ejemplo detrás de un ISP (proveedor de servicio de internet, como VTR, Movistar, GTD, etc.) con CGNAT (como mundopacifico, starlink, etc.)
Un CGNAT (Carrier grade Network Access Translator) es como un router pero que está antes de tu casa, en el data center de tu ISP, en otras palabras, le permite a la compañía abaratar costos porque compartes la misma conexión de Internet (y la misma dirección IP, que es el número que identifica a un dispositivo que se conecta a Internet) para varios clientes; es como que tú vendieras de tu internet a tus vecinos y les pasaras un cable por la ventana, van a poder navegar pero no hacer cualquier cosa)
A raíz de que compartes con otros clientes de la compañía, no tienes una dirección IP propia, ni puedes hacer "port forwarding", que básicamente es abrir un puerto (como una puerta) en alguno de los computadores de tu casa para que tus amigos o quien quieras se pueda conectar desde afuera, por ejemplo para compartir archivos, o usar servicios web éticos, como alternativa a los servicios de las grandes plataformas que hoy en día intentan (y bastante logran) monopolizar el Internet.
Existen muchas posibilidades de solucionar este problema, aquí tienes algunas:
https://github.com/anderspitman/awesome-tunneling
Sin embargo, aquí intentamos ofrecer una simple y efectiva, sin usar soluciones privativas; solo software libre y ético.
Debes contar con:
Entonces esto se trata básicamente de hacer un túnel entre el VPS, que cuenta con una IP fija y permite abrir puertos, y el servidor de tu casa, que cuenta con una conexión muy walala porque el ISP te da una IP compartida y no te permite abrir puertos.
Debes tener los siguientes paquetes instalados, lo más probable (y recomendable) es que tu servidor use Debian, en cuyo caso instalas estos paquetes con sudo apt install iptables
, por ej., para iptables
.
iptables
wireguard
wireguard
Primero debes ejecutar estos pasos en el terminal. Te recomendamos abrir dos ventanas de terminal, una para el servidor local y otra para el vps. A ambas te conectas via SSH, con un comando similar a, por ej.,ssh root@192.168.1.88
para el servidor local (ojo que tienes que hacerlo desde la misma red, o casa donde tienes el servidor, ya que éste no ofrece acceso desde el exterior, de hecho ése es justamente el problema que estamos intentando solucionar)
umask 0077
mkdir -p /etc/wireguard
cd /etc/wireguard
wg genkey > vps.key # generar private key
wg pubkey < vps.key > vps.pub # generar public key
Ojo, lo que está después del signo #
es un comentario, no debes incluirlo en el comando. Una vez hecho esto, puedes ejecutar el siguiente comando para que te entregue los valores de todas las keys (llaves) generadas y los copies y pegues a un archivo de texto (así como un torpedo, como le llamamos en Chile) para tener a mano mientras realizas las configuraciones que te indica este tutorial.
grep "" *
umask 0077
mkdir -p /etc/wireguard
cd /etc/wireguard
wg genkey > postcloud.key # generate private key
wg pubkey < postcloud.key > postcloud.pub # generate public key
wg genpsk > postcloud-vps.psk # generate pre-shared key
nuevamente, ejecuta
grep "" *
y copia los valores en el archivo de texto que estás usando de torpedo.
Edita, en el VPS, el archivo
/etc/wireguard/vps.conf
Debes reemplazar todos los valores entre signos mayor y menor <>
por los valores que correspondan a situación.
reemplazando los valores de llaves <KEY>
con los valores de llaves públicas (terminadas en .pub
), privadas (terminadas en .key
) y pre-shared (terminadasn .psk
) que tienes anotadas en tu archivo de texto de torpedo.
Además de las llaves, deberás ingresar el <Dispositivo de RED del VPS>
, que es la tarjeta de red o con la cual se conecta el VPS a Internet. Comúnmente será eth0
, pero también podría ser otro. Con el comando ip addr
puedes averiguarlo.
[Interface]
Address = 10.0.1.1/32
ListenPort = 51820
PrivateKey = <VALOR vps.key del VPS>
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = sysctl -w net.ipv6.conf.all.forwarding=1
PostUp = iptables -t nat -A PREROUTING -i <Dispositivo de RED del VPS> -p udp --dport 51820 -j ACCEPT
PostUp = iptables -t nat -A PREROUTING -i <Dispositivo de RED del VPS> -p tcp --dport 22 -j ACCEPT
PostUp = iptables -t nat -A PREROUTING -i <Dispositivo de RED del VPS> -j DNAT --to-destination 10.0.1.2
PostUp = iptables -t nat -A POSTROUTING -o %i -j MASQUERADE
PostDown = iptables -t nat -D PREROUTING -i <Dispositivo de RED del VPS> -p udp --dport 51820 -j ACCEPT
PostDown = iptables -t nat -D PREROUTING -i <Dispositivo de RED del VPS> -p tcp --dport 22 -j ACCEPT
PostDown = iptables -t nat -D PREROUTING -i <Dispositivo de RED del VPS> -j DNAT --to-destination 10.0.1.2
PostDown = iptables -t nat -D POSTROUTING -o %i -j MASQUERADE
PostDown = sysctl -w net.ipv4.ip_forward=0
PostDown = sysctl -w net.ipv6.conf.all.forwarding=0
[Peer]
PublicKey = <VALOR postcloud.pub del SERVIDOR LOCAL>
PresharedKey = <VALOR postcloud-vps.psk del SERVIDOR LOCAL>
AllowedIPs = 10.0.1.2/32
Editar, en el servidor local, el archivo
/etc/wireguard/vps.conf
reemplazando los valores según corresponda. Además de las llaves, deberás ingresar la IP fija del VPS donde está indicado.
[Interface]
Address = 10.0.1.2/32
PrivateKey = <VALOR vps.key del VPS>
[Peer]
PublicKey = <VALOR vps.pub del VPS>
PresharedKey = <VALOR postcloud-vps.psk del SERVIDOR LOCAL>
AllowedIPs = 10.0.1.1/32
Endpoint = <IP del VPS>:51820
PersistentKeepalive = 25
Habilitar los servicios para que corran automáticamente al prender los equipos:
systemctl enable --now wg-quick@vps
systemctl enable --now wg-quick@vps
Con eso ya debería estar funcionado. Recuerda también configurar los DNS en tu proveedor de nombre de dominio (ej. namecheap o nic.cl), tanto para el dominio principal como para subdominios (si es que los tienes)
A RECORD * <IP del VPS>
A RECORD @ <IP del VPS>
A RECORD www <IP del VPS>