4 de mayo de 2022

Wireguard sobre Shadowsocks

Basado en https://www.oilandfish.com/posts/wireguard-shadowsocks.html y en https://encomhat.com/2021/07/obfuscate-wireguard/

Y con la ayuda de manuocho de https://www.tierradehackers.com/

Vamos a partir de que para obtener más privacidad, hemos contratado un VPS (clouding.io por ejemplo) y sobre el mismo hemos desplegado nuestra propia VPN, concretamente Wireguard. Los dispositivos del hogar los hemos configurado para acceder a Internet a través de nuestra VPN, y todo ha ido bien hasta que en muchas conexiones públicas se ha puesto de moda filtrar precisamente las conexiones VPN.

El objetivo principal, por tanto, es conseguir que nuestra conexión VPN no deje de funcionar cuando conectamos alguno de nuestros dispositivos a una red WiFi o de otro tipo que filtre el tráfico e impida nuestra conexión VPN.

Shadowsocks

El primer paso es saltar ese tipo de filtros o firewalls, y lo vamos a hacer con Shadowsocks. Para ello hay que instalar y configurar Shadowsocks tanto en nuestro VPS, que consideraremos como servidor, como en nuestros dispositivos que consideraremos clientes.

Hay que entender también, que una vez tengamos en marcha Shadowsocks, su función viene a ser la misma que la de un proxy socks5. Por tanto para sacar partido del mismo las aplicaciones se deberán configurar para que usen ese tipo de conexión.

Aunque, si lo combinamos con Wireguard, no tendremos que configurar las aplicaciones una a una, sino que todo el tráfico quedará ofuscado (doblemente, una por el proxy y otra por la VPN).


En el lado de la VPS (123.123.123.123)


Supondremos que la IP pública de tu VPS es 123.123.123.123, que aunque ahora mismo no lo necesitamos, luego sí que lo emplearemos.

Como no soy un gran informático me gusta usar docker-compose pues configura todo  de forma casi automática, tan sólo a través de las recetas que se escriben en el archivo docker-compose.yaml

version: '3.3'
services:

 wireguard:
   image: linuxserver/wireguard
   container_name: wireguard
   cap_add:
     - NET_ADMIN
     - SYS_MODULE
  environment:
     - PUID=1000
     - PGID=1000
     - TZ=Europe/Madrid
     - SERVERURL= #optional
     - SERVERPORT=51820 #optional
     - PEERS=7 #optional
     - PEERDNS=1.1.1.1,1.0.0.1 #optional
     - INTERNAL_SUBNET=10.11.11.0 #optional
  volumes:
    - ~/wireguard:/config
    - /lib/modules:/lib/modules
    - /usr/src:/usr/src
  ports:
    - 51820:51820/udp
  sysctls:
    - net.ipv4.conf.all.src_valid_mark=1
  restart: unless-stopped


  shadowsocks:
    image: shadowsocks/shadowsocks-libev
    container_name: shadowsocks
    restart: always
    ports:
      - "443:8388"
    environment:
      - METHOD=chacha20-ietf-poly1305
      - PASSWORD=tucontraseña 

Una vez modificado el archivo de con "la receta" de Shadowsocks, lo podemos poner en marcha con el comando:

docker-compose up -d

Por si no te has fijado, el puerto de acceso desde el exterior lo he puesto en 443 (https) aunque se puede poner otro puerto, pero lo importante es que en el firewall de tu VPS (o lo que tú estés usando) le des acceso TCP.


En el lado de tu dispositivo (127.0.0.1)


En mi caso voy a considerar que mi dispositivo es un portátil con Ubuntu, y en este caso el comando para instalar será:

sudo apt install shadowsocks-libev

Su archivo de configuración se encuentra en /etc/shadowsocks-libev/config.json, que en principio se configura como si se fuera a comportar como servidor, así que lo vamos a modificar para que se comporte como del lado "cliente".

{
  "server": "123.123.123.123",
  "server_port": 443,
  "mode": "tcp_and_udp",
  "local_address": "0.0.0.0",
  "local_port": 1080,
  "tunnel_address": "127.0.0.1:51820",
  "password": "tucontraseña",
  "timeout": 300,
  "method": "chacha20-ietf-poly1305"
}

 (Si sólo deseamos un funcionamiento como de proxy socks la línea que hace referencia a "tunnel_address" no hace falta)

 Editamos el archivo de systemd correspondiente /usr/lib/systemd/system/shadowsocks-libev.service cambiando el binario de ss-server a ss-tunnel (o a ss-local si lo quieres dejar sólo como proxy socks):

ExecStart=/usr/bin/ss-tunnel -c $CONFFILE $DAEMON_ARGS

Tras ello recargamos systemd: sudo systemctl daemon-reload

Y luego reiniciamos Shadowsocks: sudo systemctl restart shadowsocks-libev

(Con eso, ya podemos configurar el proxy en el navegador, e incluso para ssh lo haríamos con un comando tipo:
ssh -o ProxyCommand='nc -x 127.0.0.1:1080 %h %p' user@123.123.123.123
Lo cual está muy bien y casi sustituye la VPN.)

Wireguard

Nota: Por lo visto en alguna actualización se perdió el soporte y de momento parece que no se puede redirigir :(

En este punto lo único que queda pendiente es hacer un pequeño cambio en la configuración local del archivo peer correspondiente a nuestro dispositivo. Éste archivo se encuentra en /etc/wireguard/ y si lo hemos generado con Docker puede tener como nombre peer1.conf mientras que si lo hemos generado de manera más convencional se suele llamar wg0.conf

En cualquier caso Deberemos modificar el Endpoint y apuntarlo a nuestro proxy:

[Interface]
Address = 10.11.11.2
PrivateKey = QNm74T19NV480307XBQQ+2unC+k0jRJ+TSrc+H0ck28=
ListenPort = 51820
DNS = 1.1.1.1,1.0.0.1

[Peer]
PublicKey = qa4I9R9xTwlNUFIdiSUTM1SEriQeJLnsPfbNN64BUTs=
Endpoint = 127.0.0.1:1080
AllowedIPs = 0.0.0.0/0, ::/0

Y ya se podría poner a funcionar con el comando siguiente en caso de que nuestro archivo de configuración se llame peer1.conf

sudo systemctl start wg-quick@peer1

Si después lo que queremos es que al arrancar el sistema directamente se ponga en marcha la VPN, entonces:

sudo systemctl enable wg-quick@peer1

Y nada más, con ello debería estar todo redireccionado y bien redireccionado.

Ahora podría ser interesante el configurar en el VPS un proxy inverso tipo Traefik o Nginx porque hemos usado como puerto 443 y si queremos poner en el VPS alguna web https nos podría dar problemas.

SSH

Se puede emplear ssh para canalizar nuestra conexión, hay información detallada en el siguiente enlace:

https://goteleport.com/blog/ssh-tunneling-explained/