Tabla de contenido
¡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.
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!