
Quiero configurar mi sistema OSX de manera que todo el tráfico de la red se realice a través de un túnel SSH.
He escrito un pequeño script para este propósito y estos son los comandos que ejecuta:
# setup tunnel
ssh -fN -D 1080 -p 22 user@remote
# start up redsocks
sudo redsocks -c /tmp/redsocks.conf -p /tmp/redsocks.pid
# forward all tcp traffic to tunnel
sudo ipfw add 0010 \
fwd 127.0.0.1,12345 \
tcp from me \
to any not dst-port 12345 \
not dst-port 1080 \
not dst-ip REMOTE_IP
Utilizo redsocks para crear un proxy http para mi túnel ssh (para poder reenviartodotráfico tcp a través de ipfw), redsocks.conf se ve así:
base {
log_debug = on;
log_info = on;
log = "file:/tmp/redsocks.log";
redirector = generic;
}
redsocks {
local_ip = 127.0.0.1;
local_port = 55660;
ip = 127.0.0.1;
port = 1080;
type = socks4;
}
Todo parece funcionar hasta ahora, todo el tráfico TCP en mi sistema OSX se realiza a través del túnel ssh, pero el problema está en el tráfico UDP y por eso las consultas DNS no funcionan.
¿Cómo puedo hacer que DNS en mi máquina local funcione a través del túnel SSH?
Respuesta1
Su ipfw …
línea sólo reenvía tráfico TCP. ¿Quizás agregar la siguiente línea?
sudo ipfw add 0011 fwd 127.0.0.1,12345 \
udp from me \
to any not dst-port 12345 \
not dst-port 1080 \
not dst-ip REMOTE_IP
También es una buena idea agregar set -x
(para depurar) y set -e
(para fallar inmediatamente si alguno de los comandos falla).
- Generalmente se debería utilizar el término 'túnel SSH' para referirse a
tun
/tap
con SSH. - El reenvío de puertos es una forma específica de tunelización, pero en este contexto debería denominarse únicamente "reenvío de puertos".
- No utilice túneles SSH (como en
-oTunnel
y-oTunnelDevice
) excepto para trabajos rápidos ad hoc.- TCP sobre TCP es una muy mala idea:
- UDP sobre TCP agrega excesivamente latencia a las aplicaciones que normalmente lo utilizan. Los programas que utilizan UDP deben tener control total sobre su propia confiabilidad y control de congestión, como es el caso de RTP.
- DNS puede utilizar TCP como transporte. No está restringido a UDP, aunque ese es elprivilegiadotransporte.
Respuesta2
Usarlanzadera¿en cambio? sshuttle afirma manejar DNS y TCP correctamente, sin tanta manipulación, solo la --dns
opción.
IME SOCKS parecía un poco viejo y poco querido. Y realmente no entiendo este uso de ipfw y redsocks.
Sin embargo, señalaría que SOCKS4 no admite la tunelización de DNS, por lo que no me sorprende que tengas problemas. Las versiones posteriores de SOCKS lo admiten, por lo que puedes consultarlo. Y aparentemente SSH puede soportar SOCKS5.
Respuesta3
Además de lo que ya estás usando, sSH permite tunelizar todo el tráfico IP, independientemente del protocolo de capa 4 empleado. Su servidor remoto debe tener PermitTunnel yes
y el cliente debe solicitar un túnel usando la Tunnel
directiva. Luego podrá utilizar ese nuevo enlace como puerta de enlace predeterminada. Verinstrucciones detalladas para el túnel aquí.