This is an old revision of the document!
Table of Contents
socat con HTTP/HTTPS: Redireccionar tráfico / Crear Tuneles / Cifrar tráfico HTTP
Socat es una herramienta muy popular y útil para crear túneles que permitan redireccionar tráfico de una IP/Puerto a otro diferente, entre otras muchas cosas. También es usada para intermediar entre un protocolo no cifrado y uno cifrado. Hay entornos empresariales donde aplpicaciones antidiluvianas son el freno para poder desplegar protocolos de cifrado más modernos. Por ejemplo aplicaciones antiguas no suelen ser compatibles con TLS 1.3. En este tipo de casos, gracias a socat, sería factible crear un túnel para que la aplicación le mande el tráfico sin cifrar y socat lo redirija de manera cifrada al destino pertinente. También es muy socorrido usarlo para soportar cifrados en protocolos / aplicaciones que no lo implementen de manera nativa o bien lo hacen pero de forma engorrosa.
En este artículo nos centraremos en el protocolo HTTP para los ejemplos y explicaremos los casos más comunes a la hora de querer tunelizar conexiones HTTP/S. Socat y los ejemplos aquí expuestos son igual de válidos para otros protocolos / puertos de red.
HTTP > System
El tráfico entrante por localhost:8080 obtendrá como respuesta la salida de determinados comandos que se especifiquen en socat. Es muy útil cuando se necesita probar un software devolviendo una determinada respuesta a sus peticiones. Veamos un ejemplo devolviendo unas cabeceras “falsas” mediante HTTP.
socat -v -v TCP-LISTEN:8080,bind=127.0.0.1,crlf,reuseaddr,fork SYSTEM:"echo -e HTTP/4.0 200;echo -e Content-Type\: text/plain;echo 'Hola Caracola'" # Si se escriben los comandos en un script este puede ser ejecutado de la siguiente forma. socat -v -v TCP-LISTEN:8080,bind=127.0.0.1,crlf,reuseaddr,fork SYSTEM:"bash $HOME/script.sh.sh"
curl -v localhost:8080 * Trying ::1:8080... * connect to ::1 port 8080 failed: Conexión rehusada * Trying 127.0.0.1:8080... * Connected to localhost (127.0.0.1) port 8080 (#0) > GET / HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.74.0 > Accept: */* > < HTTP/4.0 200 < Content-Type: text/plain < Hola Caracola * Connection #0 to host localhost left intact
HTTP > HTTP
Escuchar peticiones en un puerto determinado (8080) y que las peticiones entrantes a dicho puerto sean redirigidas al puerto 80 del host “dominio.com ”
socat -d -d TCP-LISTEN:8080,fork,reuseaddr TCP:www.dominio.com:80
Por norma, las configuraciones de servidores suelen permitir peticiones con nombres de host que no tienen configurados. Es decir, en el caso anterior, dominio.com:80 recibirá la cabecera “Host: localhost:8080”. Socat simplemente redirecciona, no editará el tráfico (para ello hay otras aplicaciones). Pero si se quiere hacer peticiones indicando otro nombre de la cabecera HOST, puede usarse curl de la siguiente manera.
# Se enviará la cabecera Host: "www.ejemplo.com" y además usa localhost como ip del dominio www.ejemplo.com curl -vI --resolve www.ejemplo.com:8080:127.0.0.1 http://www.ejemplo.com:8080/bla/bla/page.php -H "Host: www.ejemplo.com"