¿Cómo crear una VPN en 5 minutos con sshuttle?

shuttle permite crear un proxy transparente sobre el protocolo SSH que puede ser usado como una VPN, solo necesita tener instalado Python tanto en el servidor como en el cliente y tener permisos de root en el cliente.

Es recomendable usar sshuttle si:

  • Su máquina cliente (o enrutador) es Linux, FreeBSD o MacOS.
  • Tiene acceso a un servidor remoto via ssh.
  • No necesariamente tiene acceso al servidor remoto como administrador.

Posts relacionados:

Sinopsis

# sshuttle [opciones] -r [usuario@]servidor-ssh[:puerto] <subredes …>

subredes: Una lista de subredes destinos y cuyo tráfico debe ser enrutado a través de la VPN, en el formato a.b.c.d[/sufijo][puerto[-puerto]]. Ejemplos válidos son:

  • 1.2.3.4 y 1.2.3.4/32 (una única dirección IP).
  • 1.2.3.0/24 (una subred de 24 bits, es decir, con una máscara de red 255.255.255.0).
  • 0/0 coincide con todas las direcciones IPv4
  • ::/0 coincide con todas las direcciones IPv6.

Cualquiera de los ejemplos anteriores también es válido si agrega un puerto o un rango de puertos:

  • 1.2.3.4:8000 solo enrutará el tráfico que tenga como destino el puerto 8000 de 1.2.3.4
  • 1.2.3.0/24:8000-9000 enrutará todo el tráfico que va dirigido a cualquier IP de la subred 1.2.3.0/24 y a cualquier puerto entre 8000 y 9000 (incluyendo ambos).

Se puede proporcionar un nombre DNS en lugar de una dirección IP. Si el nombre de host se resuelve en varias direcciones IP, se incluyen todas las direcciones IP. Si se proporciona un sufijo con un nombre de host, el ancho se aplica a todas las direcciones IP de los nombres de host (ya sean IPv4 o IPv6).

Si un nombre DNS resuelve a direcciones IPv4 e IPv6 a la misma vez entonces no puede agregarse el sufijo de red. Ejemplos válidos:

  • ejemplo.com
  • ejemplo.com:8000
  • ejemplo.com/24
  • ejemplo.com/24:8000
  • ejemplo.com:8000-9000.

Por defecto se excluye el tráfico dirigido a localhost (127.0.0.1).

Instalar

# sudo pip install sshuttle

Ejemplos

En todos los ejemplos sustituya: usuario-remoto por un nombre de usuario real y servidor-ssh-remoto por el nombre o IP de su servidor SSH.

1. Enrutar todo el tráfico a través de la VPN

Con el siguiente comando enrutamos todo el tráfico incluyendo el que va dirigido a nuestra IP local, nótese la subred 0/0

# sudo sshuttle -r usuario-remoto@servidor-ssh-remoto 0/0

2. Enrutar todo el tráfico a través de la VPN exceptuando IP local

Con el siguiente comando enrutamos todo el tráfico exceptuando el de nuestra computadora que tiene IP 192.168.100.2 de este modo si tenemos un servidor web local recibiendo conexiones en 192.168.100.2 el mismo funciona con normalidad.

# sudo sshuttle -r usuario-remoto@servidor-ssh-remoto 0/0 -x 192.168.100.2

3. Enrutar todo el tráfico a través de la VPN exceptuando nuestra LAN

Con el siguiente comando enrutamos todo el tráfico exceptuando el de nuestra LAN, útil si desea ejectar sshtule en el router de su LAN, se asume que la red de area local está en el segmento: 192.168.100.0/24

# sudo sshuttle -r usuario-remoto@servidor-ssh-remoto 0/0 -x 192.168.100.0/24

3. Enrutar todo el tráfico a través de la VPN exceptuando subredes Docker

En el siguiente ejemplo excluimos todas las subredes creada por contenedores Docker, como pueden ser varias, es preferible crear el fichero excluded-nets.txt y agregar las subredes al fichero, de esta manera nuestros servicios “dockerizados” funcionan con normalidad.

Partiendo de que estas son las subredes docker:

$ cat excluded-nets.txt 
172.19.0.1/16
172.25.0.1/16
172.18.0.1/16
172.17.0.1/16
172.24.0.1/16

ejecutamos el siguiente commando:

# sudo sshuttle -r usuario-remoto@servidor-ssh-remoto 0/0 -X excluded-nets.txt

4. Enrutar todo el tráfico a través de la VPN exceptuando servidor-ssh-remoto

Si realizamos una conexión SSH a servidor-ssh-remoto también se va a enrutar a través de la VPN creada, lo más ideneo es excluir a servidor-ssh-remoto para que la conexión se directa.

# sudo sshuttle -r usuario-remoto@servidor-ssh-remoto 0/0 -x servidor-ssh-remoto

5. Enrutar todo el tráfico que va dirigido a un destino específico.

También es posible enrutar el tráfico que va dirigido a un destino específico para ello ejecute:

# sudo sshuttle -r usuario-remoto@servidor-ssh-remoto destino-especifico

destino-especifico puede ser un nombre, una dirección IP o un segmento de red.

Referencias


YouTube video

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.