¿Cómo puedo hacer un túnel de todo el tráfico de mi red a través de SSH?

117

Cada vez que uso Internet desde una ubicación insegura (como wifi público), me gusta usar un túnel ssh ( ssh -D port host) para garantizar que mi tráfico no pueda ser rastreado. Desafortunadamente, parece que hay muchas aplicaciones que no proporcionan una forma de especificar un proxy (Flash es un ejemplo importante).

Parece que debería haber alguna forma de usar un túnel para todo el tráfico de red desde mi computadora, pero soy completamente ignorante de cómo hacerlo. Cualquier ayuda sería muy apreciada.

REINSTATE MONICA -Jeremy Banks
fuente
16
Por supuesto, no puede hacer un túnel literalmente TODO su tráfico a través de ssh, porque eso significaría hacer un túnel ssh a través de sí mismo, pero sabíamos lo que quería decir. :)
CarlF
1
esta es una buena idea, pero solo está protegido entre su computadora y su punto final ssh. después de eso, su tráfico es claro (a menos que esté protegido de otra manera, por ejemplo, SSL). concedido, es mucho más probable que esté sobre un cable, pero aún así ... no puedes confiar en cables que no controlas.
quack quijote
66
Pero cuando estás en Internet, tienes cierta seguridad al ser solo uno de los miles de millones de paquetes, ¿verdad? Cuando se conecta a una red Wi-Fi pública, usted es uno de quizás 3 conexiones, puede ser identificado personalmente, etc
endolito

Respuestas:

62

Para hacer lo que quieres, te recomiendo sshuttle .

Lo usas así:

./sshuttle -r username@sshserver 0.0.0.0/0 -vv

Hará un túnel de todo su tráfico TCP automáticamente para usted. Puede agregar el --dnsargumento para que también haga un túnel en su tráfico DNS. El servidor remoto solo necesita tener Python instalado.

Si solo desea hacer un túnel de programas específicos, recomendaría proxychains .

Una vez que esté instalado, inicie su proxy ssh socks de esta manera:

ssh -fND 127.0.0.1:<local port> username@sshserver

Esto iniciará un proxy "SOCKS" escuchando en <puerto local>.

Luego edite /etc/proxychains.conf para apuntar al mismo puerto que <puerto local>.

Finalmente, inicie su programa que desea proxy-ed así:

proxychains <program name>

Simplemente debería funcionar. Sin embargo, algunos programas tendrán problemas para trabajar con Proxy Chains. También tenga en cuenta que con Firefox, debe cambiar elementos adicionales en about: config para forzarlo a realizar búsquedas de DNS a través del proxy en lugar de omitirlo.

Como nota adicional, en los navegadores web. Si admiten proxies de calcetines, no necesita hacer nada adicional para que usen el túnel ssh mencionado anteriormente, solo ingrese 127.0.0.1 para el servidor proxy SOCKS y el <puerto local> para el puerto proxy.

EDITAR 29/03/16

Dado que esta publicación todavía está viendo algunos votos positivos, pensé en actualizarla. Proxychains todavía está en la mayoría de los repositorios de Linux y aún funciona en Linux. Sin embargo, el proyecto se abandona efectivamente y no funciona en OSX. Para Linux u OSX, recomiendo actualizar a una bifurcación aún mantenida: proxychains-ng: https://github.com/rofl0r/proxychains-ng

Además de trabajar tanto en Linux como en OSX, es fácil de compilar y también tiene un soporte mucho mejor para el túnel DNS.

También debería mencionar otra opción, que son los redsocks. Funciona de manera similar a proxychains (-ng) y también es probable en su repositorio dist: https://github.com/darkk/redsocks

cáscara
fuente
Nota para los sistemas Linux más nuevos que usan sshuttle: al momento de escribir, hay un error del kernel que le dará una tubería rota. En ese caso, utilizar:sshuttle -r root@host -x host 0/0
aggregate1166877
49

man sshda un ejemplo de exactamente esto. Un vpn basado en ssh:

SSH-BASED VIRTUAL PRIVATE NETWORKS
     ssh contains support for Virtual Private Network (VPN) tunnelling using
     the tun(4) network pseudo-device, allowing two networks to be joined
     securely.  The sshd_config(5) configuration option PermitTunnel controls
     whether the server supports this, and at what level (layer 2 or 3 traf-
     fic).

     The following example would connect client network 10.0.50.0/24 with
     remote network 10.0.99.0/24, provided that the SSH server running on the
     gateway to the remote network, at 192.168.1.15, allows it:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.0.50.1 10.0.99.1 netmask 255.255.255.252

~~ recortar ~~

     Since a SSH-based setup entails a fair amount of overhead, it may be more
     suited to temporary setups, such as for wireless VPNs.  More permanent
     VPNs are better provided by tools such as ipsecctl(8) and isakmpd(8).

Una vez que tenga esa nueva interfaz activada, solo tendrá que convertirla en la ruta predeterminada, que es una pregunta diferente.

PriceChild
fuente
1
¿Podrías explicarme un poco más? El comando ifconfig crea una nueva interfaz llamada tun0, ¿verdad? ¿O es tun0 creado por ssh y configurado por ifconfig? ¿Quizás agregar un ejemplo relevante a la pregunta?
Nadie
6

Busque la opción "Túnel" en ssh. Esto crea un dispositivo de túnel al que puede asignar una dirección IP y luego cambia la ruta predeterminada para usar ese túnel.

Peter Eisentraut
fuente
4

He desarrollado un software que le permite reenviar todo TCP y opcionalmente UDP a través de un proxy SOCKS5, en todo el sistema.

http://code.google.com/p/badvpn/wiki/tun2socks

Incluso se puede instalar en un enrutador para reenviar todas las conexiones desde computadoras en la LAN.

Ambroz Bizjak
fuente
0

REDES PRIVADAS VIRTUALES BASADAS EN SSH ssh contiene soporte para túneles de Red Privada Virtual (VPN) utilizando el pseudodispositivo de red tun (4), permitiendo que dos redes se unan de forma segura. La opción de configuración sshd_config (5) PermitTunnel controla si el servidor lo admite y a qué nivel (capa 2 o 3 tráfico).

 The following example would connect client network 10.0.50.0/24 with
 remote network 10.0.99.0/24 using a point-to-point connection from
 10.1.1.1 to 10.1.1.2, provided that the SSH server running on the gateway
 to the remote network, at 192.168.1.15, allows it.

 On the client:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252
       # route add 10.0.99.0/24 10.1.1.2

 On the server:

       # ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252
       # route add 10.0.50.0/24 10.1.1.1

 Client access may be more finely tuned via the /root/.ssh/authorized_keys
 file (see below) and the PermitRootLogin server option.  The following
 entry would permit connections on tun(4) device 1 from user “jane” and on
 tun device 2 from user “john”, if PermitRootLogin is set to
 “forced-commands-only”:

   tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... jane
   tunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john

 Since an SSH-based setup entails a fair amount of overhead, it may be
 more suited to temporary setups, such as for wireless VPNs.  More perma‐
 nent VPNs are better provided by tools such as ipsecctl(8) and
 isakmpd(8).
Kristian Hermansen
fuente
1
agregue una fuente para su información. nota: esta es una vieja pregunta.
Lorenzo Von Matterhorn
-2

Solo quería aclarar que (ssh -D port host) no es una forma 100% segura para que el tráfico no sea rastreado. Agregar (ssh -D -c blowfish port host) sería una mejor opción porque al menos está agregando cifrado a su sesión. Puede agregar más opciones, pero es bastante fácil escribir "man ssh" en su terminal o Google para obtener una lista completa.

La opción que creo que está buscando es configurar una VPN (red privada virtual)

Eche un vistazo a este artículo para comprender la diferencia entre los dos ( SSH vs. VPN ) o una buena versión resumida , antes de comenzar a configurar su propia VPN. Si decide ir a la ruta VPN, le recomiendo OpenVPN , es gratis y tiene mucha documentación y soporte.

ricbax
fuente
66
mal consejo. "blowfish" es un cifrado SSH-1; es rápido, seguro (desde 1999: unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1 ), pero aún así. probablemente desee ssh -2 -C -D [...](forzar SSH2, usar compresión) y soltar el -c. de acuerdo con man sshla lista de cifrado de mi sistema en SSH2 por defecto aes128-cbc,3des-cbc,blowfish-cbc,[etc]. mi punto es que si solicita -c blowfishpuede terminar con SSH1, que es mucho menos seguro que SSH2.
quack quijote
2
Es cierto, pero Jeremy tenía la impresión de que la conexión era segura con solo -D 8080, simplemente dije que era mejor de lo que estaba usando. Haces un punto válido y es por eso que menciono el manual para más opciones.
ricbax
Tal vez debería cambiar su respuesta, ya que de lo contrario es útil.
endolito el
Olvidé preguntar esto, no use este sitio regularmente. Gracias por la aclaración ... tuve la fuerte impresión de que SSH era seguro por defecto.
REINSTATE MONICA -Jeremy Banks
99
¿WTF no es SSH usando encriptación por defecto?
LatinSuD
-3

Use estos ejemplos:

  • Reenvíe el puerto 80 desde un host remoto a 8888 en su host local

    ssh -fnN -L8888: localhost: 80 usuario @ servidor

    Use esto para acceder a servicios en un host remoto que solo están disponibles allí

  • Reenvíe el puerto 80 desde yourlocalhost a 8888 en un host remoto

    ssh -fnN -R8888: localhost: 80 usuario @ servidor

    Use esto para permitir que otros usuarios accedan a sus servicios: servidor web o lo que sea.

¡Salud! :)

Kolypto
fuente
Buen comentario, pero nada relacionado con lo que estamos hablando aquí. El ssh inverso permite que un SERVIDOR solicite que un CLIENTE enrute UN puerto de tráfico hacia él. Se necesitaría más configuración para luego enrutar ese tráfico a Internet. También tendría que configurar un túnel SSH para cada puerto. Y tiene que iniciarse desde el servidor, no desde el cliente, ¿por qué haría eso a menos que fuera necesario?
Beachhouse