Como crear una VPN con SSH y Python

¡Hola de nuevo! En este articulo enseñamos como crear una VPN con SSH y Python utilizando sshuttle.
Sshuttle es una aplicación desarrollada en python diseñada para crear VPNs basadas en tuneles SSH.

Dicho esto, comenzamos.

Como crear una VPN con SSH y Python

Esta aplicación te dará acceso a los puertos TCP y UDP de las redes que especifiquemos. Estas redes se las especificamos
en el cliente y será capaz de acceder a todas las redes a las que acceda el host al que nos conectamos por SSH (siempre
que la especifiquemos en el comando ejecutado con sshuttle).

La forma de utilizarlo es la siguiente:

Instalación de sshuttle

Lo primero que debemos hacer es instalar sshuttle, para ello ejecutamos el siguiente comando para hacernos root:

[ger@ger-pc ~]$ sudo su - 
[sudo] password for ger: 

Despues, descargamos con git clone el repositorio de sshuttle:

[ger-pc ~]# git clone https://github.com/sshuttle/sshuttle
Clonando en 'sshuttle'...
remote: Enumerating objects: 69, done.
remote: Counting objects: 100% (69/69), done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 2986 (delta 34), reused 25 (delta 13), pack-reused 2917
Recibiendo objetos: 100% (2986/2986), 1.21 MiB | 2.17 MiB/s, listo.
Resolviendo deltas: 100% (1859/1859), listo.
[ger-pc ~]#

Para finalizar la instalación:

[ger-pc sshuttle]# python setup.py install
WARNING: The wheel package is not available.
running install
running bdist_egg
running egg_info
creating sshuttle.egg-info
writing sshuttle.egg-info/PKG-INFO
writing dependency_links to sshuttle.egg-info/dependency_links.txt
writing entry points to sshuttle.egg-info/entry_points.txt
writing top-level names to sshuttle.egg-info/top_level.txt
writing manifest file 'sshuttle.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no previously-included files matching '*' found under directory 'docs/_build'
writing manifest file 'sshuttle.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
creating build
creating build/lib
creating build/lib/sshuttle
copying sshuttle/__init__.py -> build/lib/sshuttle
copying sshuttle/__main__.py -> build/lib/sshuttle
copying sshuttle/assembler.py -> build/lib/sshuttle
copying sshuttle/client.py -> build/lib/sshuttle
copying sshuttle/cmdline.py -> build/lib/sshuttle
copying sshuttle/firewall.py -> build/lib/sshuttle
copying sshuttle/helpers.py -> build/lib/sshuttle
copying sshuttle/hostwatch.py -> build/lib/sshuttle
copying sshuttle/linux.py -> build/lib/sshuttle
copying sshuttle/options.py -> build/lib/sshuttle
copying sshuttle/sdnotify.py -> build/lib/sshuttle
copying sshuttle/server.py -> build/lib/sshuttle
copying sshuttle/ssh.py -> build/lib/sshuttle
copying sshuttle/ssnet.py -> build/lib/sshuttle
copying sshuttle/ssyslog.py -> build/lib/sshuttle
copying sshuttle/stresstest.py -> build/lib/sshuttle
copying sshuttle/sudoers.py -> build/lib/sshuttle
copying sshuttle/version.py -> build/lib/sshuttle
creating build/lib/sshuttle/methods
copying sshuttle/methods/__init__.py -> build/lib/sshuttle/methods
copying sshuttle/methods/ipfw.py -> build/lib/sshuttle/methods
copying sshuttle/methods/nat.py -> build/lib/sshuttle/methods
copying sshuttle/methods/nft.py -> build/lib/sshuttle/methods
copying sshuttle/methods/pf.py -> build/lib/sshuttle/methods
copying sshuttle/methods/tproxy.py -> build/lib/sshuttle/methods
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/egg
creating build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/__init__.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/__main__.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/assembler.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/client.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/cmdline.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/firewall.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/helpers.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/hostwatch.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/linux.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/options.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/sdnotify.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/server.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/ssh.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/ssnet.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/ssyslog.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/stresstest.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/sudoers.py -> build/bdist.linux-x86_64/egg/sshuttle
copying build/lib/sshuttle/version.py -> build/bdist.linux-x86_64/egg/sshuttle
creating build/bdist.linux-x86_64/egg/sshuttle/methods
copying build/lib/sshuttle/methods/__init__.py -> build/bdist.linux-x86_64/egg/sshuttle/methods
copying build/lib/sshuttle/methods/ipfw.py -> build/bdist.linux-x86_64/egg/sshuttle/methods
copying build/lib/sshuttle/methods/nat.py -> build/bdist.linux-x86_64/egg/sshuttle/methods
copying build/lib/sshuttle/methods/nft.py -> build/bdist.linux-x86_64/egg/sshuttle/methods
copying build/lib/sshuttle/methods/pf.py -> build/bdist.linux-x86_64/egg/sshuttle/methods
copying build/lib/sshuttle/methods/tproxy.py -> build/bdist.linux-x86_64/egg/sshuttle/methods
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/__init__.py to __init__.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/__main__.py to __main__.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/assembler.py to assembler.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/client.py to client.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/cmdline.py to cmdline.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/firewall.py to firewall.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/helpers.py to helpers.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/hostwatch.py to hostwatch.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/linux.py to linux.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/options.py to options.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/sdnotify.py to sdnotify.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/server.py to server.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/ssh.py to ssh.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/ssnet.py to ssnet.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/ssyslog.py to ssyslog.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/stresstest.py to stresstest.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/sudoers.py to sudoers.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/version.py to version.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/methods/__init__.py to __init__.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/methods/ipfw.py to ipfw.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/methods/nat.py to nat.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/methods/nft.py to nft.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/methods/pf.py to pf.cpython-38.pyc
byte-compiling build/bdist.linux-x86_64/egg/sshuttle/methods/tproxy.py to tproxy.cpython-38.pyc
creating build/bdist.linux-x86_64/egg/EGG-INFO
installing scripts to build/bdist.linux-x86_64/egg/EGG-INFO/scripts
running install_scripts
running build_scripts
creating build/scripts-3.8
copying bin/sudoers-add -> build/scripts-3.8
creating build/bdist.linux-x86_64/egg/EGG-INFO/scripts
copying build/scripts-3.8/sudoers-add -> build/bdist.linux-x86_64/egg/EGG-INFO/scripts
changing mode of build/bdist.linux-x86_64/egg/EGG-INFO/scripts/sudoers-add to 755
copying sshuttle.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO
copying sshuttle.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying sshuttle.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying sshuttle.egg-info/entry_points.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying sshuttle.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
sshuttle.__pycache__.client.cpython-38: module references __file__
sshuttle.__pycache__.ssh.cpython-38: module references __path__
sshuttle.__pycache__.sudoers.cpython-38: module references __file__
creating dist
creating 'dist/sshuttle-0.78.6.dev28+gf0c13ea-py3.8.egg' and adding 'build/bdist.linux-x86_64/egg' to it
removing 'build/bdist.linux-x86_64/egg' (and everything under it)
Processing sshuttle-0.78.6.dev28+gf0c13ea-py3.8.egg
removing '/usr/lib/python3.8/site-packages/sshuttle-0.78.6.dev28+gf0c13ea-py3.8.egg' (and everything under it)
creating /usr/lib/python3.8/site-packages/sshuttle-0.78.6.dev28+gf0c13ea-py3.8.egg
Extracting sshuttle-0.78.6.dev28+gf0c13ea-py3.8.egg to /usr/lib/python3.8/site-packages
sshuttle 0.78.6.dev28+gf0c13ea is already the active version in easy-install.pth
Installing sudoers-add script to /usr/bin
Installing sshuttle script to /usr/bin

Installed /usr/lib/python3.8/site-packages/sshuttle-0.78.6.dev28+gf0c13ea-py3.8.egg
Processing dependencies for sshuttle==0.78.6.dev28+gf0c13ea
Finished processing dependencies for sshuttle==0.78.6.dev28+gf0c13ea
[ger-pc sshuttle]#

Comenzamos a probar sshuttle

En nuestro ejemplo tenemos 2 hosts: 

  • public2 (publica: 134.209.22.163, privada: 10.131.28.22)
      public (publica: 159.65.93.106 y privada: 10.131.8.135)

El host public será a donde nos conectaremos mediante SSH para montar la VPN y el host public2 será al que nos conectaremos por
IP privada mediante la VPN.

Para conectar la VPN mediante SSH con sshutle la forma de ejecutarlo es:

sshuttle -r usuario@host -vv red/mascara

Si queremos sacar todo el trafico TCP y UDP por el destino, debemos especificar como red 0/0
Si necesitamos añadir mas de uns red, podemos hacerlo así:

sshuttle -r usuario@host -vv red/mascara

Por lo que en nuestro artículo ejecutaremos el comando de la siguiente forma (desde root):

sshuttle -r root@159.65.93.106 -vv 10.131.0.0/16

Esto podriamos hacerlo en el caso de las redes del ejemplo con dos subredes:

sshuttle -r root@159.65.93.106 -vv 10.131.8.0/24 10.131.28.0/24

Ejecutando el comando anterior ya tenemos acceso a cualquier puerto TCP y UDP de las redes a las que el host destino tenga acceso y hayamos especificado.

En el caso de ser un router o un equipo que haga de gateway, debemos ejecutar el comando de la siguiente forma:

sshuttle -l red_local -r user@host -vv red/mascara

Para permitir el acceso a desde todas las redes locales a todas las redes de destino y resolver DNS en destino sería así:

sshuttle -l 0.0.0.0 -dns -r root@159.65.93.106 -vv 0/0

Como ejecutar sshuttle en windows

Para ejecutar Shuttle en windows hay que hacer uso de vagrant, para mas información consultar https://sshuttle.readthedocs.io/en/stable/windows.html

 

Video

A parte de lo explicado anteriormente os dejamos un video donde podéis ver la VPN por SSH en acción.

O puedes dirigirte a aqui para verlo directamente en youtube

No olvides compartir este articulo en redes sociales y/o dejar tu comentario.

¡Esto ha sido todo, nos vemos en el siguiente articulo!

Deja una respuesta