Proxy transparente de un único contenedor de Docker a otro contenedor de docker

Tengo un par de contenedores docker ejecutándose en la máquina host, estos contenedores juntos hacen que mi aplicación funcione. Por lo tanto, para cada iteración/instancia de mi aplicación, se requiere un par de contenedores docker para ejecutarse. Hasta ahora estoy usando el parámetro --link mientras ejecuto el segundo contenedor para vincular el primer contenedor y obtener la IP del primer contenedor del archivo hosts para usarlo programáticamente.

Ahora, necesito configurar un proxy transparente para el segundo contenedor de docker. de modo que, todo el tráfico http (puerto 80) del segundo contenedor debería pasar por el puerto 8080 del primer contenedor.

IP del primer contenedor: 172.17.0.4 (Tiene servicio de proxy ejecutándose en el puerto 8080).IP del segundo contenedor: 172.17.0.6 (Tiene herramientas de cliente como navegador).Quería reenviar todo el tráfico http (Puerto 80) de la 172.17.0.6 al puerto 8080 de la 172.17.0.4.

i. e)> Tráfico a 80 de 172.17.0.4 < - - - 8080 de 172.17.0.6

He intentado agregar las reglas de iptables dentro del segundo contenedor para la configuración anterior. Pero ninguno de ellos funcionó.

~# sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:8080

No funciona.

~# sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:8080

No funciona.

~# sudo iptables -t nat -A POSTROUTING -j MASQUERADE

Entonces, mi pregunta es, ¿cómo puedo configurar un proxy transparente dentro de un contenedor docker que pueda reenviar todo el tráfico de un puerto específico al puerto de otro contenedor?

P. S: Si agrego manualmente la configuración del proxy al navegador en el segundo contenedor. Está funcionando bien. Pero quería configurar el proxy transparente para todo el contenedor, no solo para el navegador. de modo que cualquier solicitud de red de cualquier herramienta dentro del segundo contenedor se reenviará al puerto proxy del primer contenedor.

He leído algunos tutoriales sobre el proxy inverso de todos los contenedores que se ejecutan juntos usando nginx/HAProxy. Pero quería configurar un contenedor individual con su propio contenedor proxy como un par.

Gracias a todos por su tiempo para responder. Básicamente, lo que estoy tratando de hacer es proxy de la saliente / originado tráfico del segundo contenedor (NOTA: Estoy NI intentando proxy el tráfico entrante, por lo que no puede usar Apache mod_proxy o Nginx proxy_pass. Estos módulos funcionan para el tráfico entrante). el 1er contenedor ejecuta un servicio proxy en el puerto 8080.

Como sugirió Thierno, puedo usar las variables ENV http_proxy y https_proxy para proxy el tráfico saliente, pero desafortunadamente NI todas las aplicaciones/servicios que se ejecutan en su sistema operativo respetan estas variables de entorno http_proxy y https_proxy. Hay aplicaciones que fuerzan a omitir la configuración del proxy. Esa es la razón por la que quería usar iptables para hacer cumplir las reglas de tráfico. Por lo tanto, ninguna de las aplicaciones/servicios puede omitir el proxy.

El error que cometí en la configuración anterior de la pregunta es que estaba tratando de enrutar el tráfico entrante al puerto 80 al 8080 del servidor proxy. Como el 1er contenedor no tiene tráfico entrante, no funcionará y es lógicamente incorrecto para PRE-ENRUTAR/POST-ENRUTAR el tráfico para lograr lo que estaba buscando. Para enrutar el tráfico originado/saliente, necesitamos usar Cadena de salida de las iptables.

Mi Solución:

He usado la combinación de RedSocks con iptables para hacer cumplir el proxy para el tráfico saliente completo del servidor. Aquí está la configuración de iptables que he usado:

# Crear nueva cadena para RedSocks

root# iptables -t nat -N REDSOCKS

# Ignore las LAN y algunas otras direcciones reservadas

root# iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURNroot# iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURNroot# iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURNroot# iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURNroot# iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURNroot# iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURNroot# iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURNroot# iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN

# Redirigir todo el http al puerto local de redsocks

root# sudo iptables -t nat -A REDSOCKS -p tcp --dport 80 -j REDIRECT --to-ports 12345

# para el tráfico https, simplemente reemplace el puerto 80 con 443

# Use la cadena all REDSOCKS para todo el tráfico saliente en eth0

root# sudo iptables -t nat -A OUTPUT -p tcp -o eth0 -j REDSOCKS

Ahora, configure redsocks para que escuche el tráfico entrante en el puerto local 12345 y lo reenvíe a la IP y al puerto del servidor proxy. Para hacer esto edita redsocks.conf como esto,

redsocks {local_ip = 127.0.0.1;local_port = 12345;ip = 172.17.0.4;port = 8080;type = http-relay;}

solo guarda la configuración y reinicie el servicio redsocks. Ahora todo el tráfico saliente originado desde el 1er contenedor se aplicará para usar el proxy. (NOTA: He usado iptables-persistent para persistir las reglas durante los reinicios del servidor) En realidad, he implementado lo mismo para el tráfico http y https agregando otra línea a la configuración de iptables. Aunque no es un proxy transparente, hace el trabajo por mí.

Si alguien tiene alguna otra solución alternativa a esto, sugiéralo.

Creo que el uso de la $http_proxy env var debería ayudar.

Puede establecer un punto de entrada en su archivo docker (para el contenedor #2) para exportar la var env cuando se inicia el contenedor. En algún lugar de tu punto de entrada, deberías tener algo como esto:

export http_proxy=http://$CONATAINER1_PORT_8080_TCP_ADDR:$CONATAINER1_PORT_8080_TCP_PORT

No se exactamente si su cliente (navegador) puede usar la var env http_proxy env, pero debería existir un método similar. Por ejemplo, para firefox:

user_pref("network.proxy.http", "$CONATAINER1_PORT_8080_TCP_ADDR");user_pref("network.proxy.http_port", $CONATAINER1_PORT_8080_TCP_PORT);user_pref("network.proxy.type", 1);

Sugerencias: utilizar printenv en el segundo contenedor para saber qué nombre de variables debe usar en su punto de entrada

La vinculación recíproca no es algo que docker tenga, hasta donde yo sé ( información revelada en tiempo de ejecución sobre un contenedor portado o recíproco a un progenitor). Probablemente es por eso que la mayoría de los tutoriales tienen un tercer ancestro común, 'proxy' que se usa.

Si está dispuesto a usar marcos como fig o weave, que creo que tienen archivos de configuración yaml o json, probablemente pueda configurar esto con solo dos contenedores recíprocos.

Si está dispuesto a tener un tercero, entonces todos los puertos y tuberías podrían vincularse a través del ancestro común para sus dos contenedores "hermanos".