apache proxy https ssh tunnel

apache - Túnel sobre HTTPS



proxy ssh (13)

En mi lugar de trabajo, el bloqueador / firewall de tráfico ha empeorado progresivamente. No puedo conectarme a la máquina de mi casa en el puerto 22, y la falta de acceso a SSH me entristece. Anteriormente pude usar SSH moviéndolo al puerto 5050, pero creo que algunos filtros recientes ahora tratan este tráfico como IM y lo redirigen a través de otro proxy, tal vez. Esa es mi mejor suposición; en cualquier caso, mis conexiones ssh ahora terminan antes de que pueda iniciar sesión.

En estos días he estado usando Ajaxterm sobre HTTPS, ya que el puerto 443 todavía no ha sido molestado, pero esto está lejos de ser ideal. (Sucky emulación de terminal, falta de reenvío de puertos, mi navegador pierde memoria a un ritmo increíble ...) Intenté configurar mod_proxy_connect sobre mod_ssl , con la idea de que podía enviar un CONNECT localhost:22 HTTP/1.1 solicitud CONNECT localhost:22 HTTP/1.1 través de HTTPS , y entonces estaría todo listo. Lamentablemente, esto parece no funcionar; la conexión HTTPS funciona, hasta que termino de enviar mi solicitud; entonces SSL craps out. Parece como si mod_proxy_connect se mod_proxy_connect cargo de toda la conexión en lugar de seguir canalizando a través de mod_ssl , confundiendo al cliente HTTPS.

¿Hay alguna manera de hacer que esto funcione? No quiero hacer esto a través de HTTP simple, por varias razones:

  • Dejar un proxy abierto gordo como ese solo apesta
  • Un gran proxy abierto gordo tampoco es bueno en HTTPS, pero con la autenticación requerida, me parece bien
  • HTTP pasa por un proxy: no me preocupa demasiado que mi tráfico sea analizado, ya que es ssh el que irá en "texto plano" a través del túnel, pero es mucho más probable que se destruya que HTTPS, que fundamentalmente no puede modificarse. ser procesado

Requisitos:

  • Debe funcionar sobre el puerto 443, sin perturbar el tráfico de otros HTTPS (es decir, no puedo simplemente poner el servidor ssh en el puerto 443, porque ya no podría enviar páginas a través de HTTPS)
  • Tengo o puedo escribir un cliente de reenvío de puerto simple que se ejecuta en Windows (o Cygwin)

Editar

DAG: Tunneling SSH sobre HTTP (S) me ha sido señalado, pero no ayuda: al final del artículo, mencionan el error 29744 - CONNECT no funciona a través de la conexión SSL existente que evita la creación de túneles a través de HTTPS, exactamente el problema con el que me estaba encontrando En este punto, probablemente esté buscando algún script CGI, pero no quiero enumerarlo como un requisito si hay mejores soluciones disponibles.


Debe funcionar sobre el puerto 443, sin perturbar el tráfico de otros HTTPS (es decir, no puedo simplemente poner el servidor ssh en el puerto 443, porque ya no podría enviar páginas a través de HTTPS)

¿Es posible vincular su servidor HTTPS a un puerto diferente? Dependiendo de para qué se utiliza, puede incluso evitar el problema de no poder acceder directamente al trabajo desde SSHing a casa y desde ahí usar lince.


¿Podrías establecer un hombre del medio?

Ejecute una instancia pequeña / gratuita / barata en la nube escuchando en 443 para SSH, luego, a través de ese túnel de instancia en la nube hasta su casa en su puerto favorito - 22 o lo que sea.

Agregará algo de latencia, estoy seguro, pero resuelve el problema de dejar intacta la configuración de inicio original.


¿Qué le parece usar 2 direcciones IP en su máquina?

Enlaza apache / https en una IP_1: 443 y tu sshd en la otra IP_2: 443?


Configure el servidor OpenVPN 2.1 en su hogar, use el puerto 443 (si configura su hogar con cualquier servicio HTTPS en el puerto 443, active la opción de puerto compartido de OpenVPN para manejar las transacciones OpenVPN y HTTPS en el puerto 443; esta función solo está disponible para no Sistema operativo Windows)

Luego, configure su cliente OpenVPN en su computadora portátil en el modo road-warrior para acceder al servidor OpenVPN en casa. Podrá llamar a su casa o al lugar que desee dentro de una red VPN segura que haya creado con OpenVPN. Ya no se requiere el uso de SSH para este propósito.


Creo que tendrás que encontrar un puerto que no estés usando actualmente para poder salir, y escuchar eso. 443 es el candidato obvio, pero dices que eso no es posible. ¿Qué pasa con el correo (25, 110, 143), telnet (23), ftp (21), DNS (53) o incluso whois (43)?


Debería poder usar iptables para reenviar el tráfico ssh de sus máquinas de trabajo a ssh, mientras que todas las demás máquinas conectadas a su servidor doméstico en el puerto 443 obtienen el servidor Apache.

Pruebe una regla como esta:

iptables -t nat -A PREROUTING -p tcp -s 111.111.111.111 --dport 433 -j REDIRECT --to-port 22

Donde 111.111.111.111 es la dirección IP de su computadora de oficina.

Todo eso supone que está ejecutando Linux> = 2.4, que debería ser ahora. Ha estado fuera por casi una década.

La documentación para iptables está en http://www.netfilter.org .


Descubra por qué la compañía tiene una política tan restrictiva. Puede ser por una buena razón.

Si aún encuentra que desea eludir la política, podría escribir un pequeño proxy que escuche en su servidor en el puerto 443 y luego, dependiendo de la solicitud, reenviará el tráfico a su servidor web o al daemon SSH. Sin embargo, hay dos capturas.

  1. Para determinar si se trata de una solicitud HTTPS o una solicitud SSH, debe intentar leer algunos datos con un tiempo de espera (pequeño), esto se debe a que los handshakes TLS / SSL comienzan con el cliente enviando algunos datos, mientras que el protocolo SSH comienza con el servidor enviando algunos datos. El tiempo de espera debe ser lo suficientemente grande como para retrasar la entrega de los datos iniciales del cliente en el protocolo de enlace TLS / SSL, por lo que hará que el establecimiento de conexiones SSH sea más lento.

  2. Si el proxy HTTP en su empresa es inteligente, escuchará a escondidas el esperado "saludo" TLS / SSL cuando se CONNECT al puerto 443 y, cuando detecte que no es un protocolo de enlace TLS / SSL, podría terminar el SSH intento de conexión. Para abordar eso, puede ajustar el daemon SSH en un túnel TLS / SSL (por ejemplo, stunnel ), pero deberán diferenciar las solicitudes basadas en la versión TLS / SSL en su solicitud de cliente para determinar si se debe enrutar el TLS / Conexión SSL al servidor web o al daemon SSH con túnel / SSL.



Logré pasar por alto el firewall de mi empresa usando el siguiente diseño a través de AjaxTerm, me funciona.

PC en la red de la empresa -> proxy de la compañía a través de https -> INTERNET -> Mi servidor proxy inverso Apache en SSL + .htprotección en tiempo real -> Servidor AjaxTerm (A partir de ahora, puedo SSH a cualquier otro servidor).

Todavía no es el mundo perfecto ... sería bueno si puedo hacer túneles en mi red doméstica a través de HTTPS.


Realmente lo siento por ser el defensor del diablo aquí, pero si están bloqueando puertos en su trabajo, es probable porque no quieren que la gente viole la seguridad.

Ahora, si tienes permiso para abrir un túnel con tu jefe, está bien, pero SI algo sucede, CUALQUIER COSA, y ellos descubren que tienes un túnel, casi puedo asegurarte, serás el chivo expiatorio. Entonces, si fuera usted, no estaría abriendo túneles en el trabajo si están configurando firewalls contra él.


Túnel de proxy puede ser tu respuesta

http://proxytunnel.sourceforge.net/

digamos que mi servidor ssh es host.domain.tld y mi servidor proxy de trabajos es 10.2.4.37

Agregaría esto a mi configuración ssh local

Host host.domain.tld ProxyCommand / usr / local / bin / proxytunnel -q -p 10.2.4.37:3128 -d% h:% p ProtocolKeepAlives 30



Ya que apache no tiene ningún problema con CONNECT cuando no hay SSL involucrado, apago las características SSL y uso stunnel para servir una versión https de mi sitio. Esto no requiere ninguna recopilación y permite que su sitio web sirva https normalmente. Hasta ahora, la solución más limpia que conozco.

Ver http://chm.duquesne.free.fr/blog/?p=281 para más detalles.