sshuttle: “donde el proxy transparente se encuentra con la VPN y SSH”
En el post anterior aprendimos como enrutar todo el tráfico de nuestra PC usando Wireguard VPN lo que conlleva pasos de instalación y configuración correspondientes. En el post de hoy mostraremos como obtener el mismo resultado realizando un procedimiento más simple y más sencillo usando la herramienta 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.
Sinopsis
# sshuttle [opciones] -r [usuario@]servidor-ssh[:puerto] <subredes …>
- subredes: Una lista de subredes destinmos 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 (una única dirección IP) y 1.2.3.4/32 (equivalente a 1.2.3.4), 1.2.3.0/24 (una subred de 24 bits, es decir, con una máscara de red 255.255.255.0). Especifique las subredes 0/0 para que coincidan con todas las direcciones IPv4 y ::/0 para que coincidan con todas las direcciones IPv6. Cualquiera de los ejemplos anteriores también es válido si agrega un puerto o un rango de puertos, por lo que 1.2.3.4:8000 solo enrutará el tráfico que tenga como destino el puerto 8000 de 1.2.3.4 y 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 y ejemplo.com:8000-9000. Por defecto se excluye el tráfico dirigido a localhost (127.0.0.1).
Para ver el listado de opciones, consulte el manual de usuario
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.
Enlaces de interés
