.png)
Soy nuevo en el mundo de las redes, así que estoy probando esto por primera vez. Creé una ventana acoplable openvpn que se conecta a un servidor VPN. La ejecución wget -q -O - https://api.myip.com
dentro del contenedor de la ventana acoplable confirma que la red de la ventana acoplable está conectada correctamente a la VPN y que la IP es del servidor VPN. Ahora quiero intentar enrutar el tráfico del host a través del contenedor de la ventana acoplable y lograr el mismo resultado fuera del contenedor donde el tráfico del host usa la conexión VPN de la ventana acoplable. No me queda muy claro cómo hacer esto desde una relación de contenedor host <-> de la ventana acoplable, así que pensé que tal vez podría hacer uso de la función de mapeo de puertos en la ventana acoplable y también configurar un proxy web en la ventana acoplable para manejar cualquier http/https. peticiones.
Por lo tanto, instalé el servidor squid y openvpn dentro de la misma ventana acoplable y expuse el puerto 3128 (ya que eso es lo que escucha squid). El comando wget en el host se convierte en:
wget -q -O - https://api.myip.com -e use_proxy=yes -e http_proxy=localhost:12345
Pero las pruebas muestran que el tráfico no pasa por la conexión VPN de la ventana acoplable. En cambio, los resultados muestran que la comunicación se realiza a través de la conexión a Internet del anfitrión.
Ejecuto el contenedor usando el siguiente comando de ejecución de Docker:
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun --name vpn -it --sysctl net.ipv6.conf.all.disable_ipv6=0 -p 12345:3128 vpn-image
¿Es incorrecto el enfoque anterior? ¿Cuál es el mejor enfoque para enrutar el tráfico del host a través de múltiples conexiones VPN de Docker?
Los siguientes recursos indican que es posible, pero ofrecen soluciones propias específicas para su caso de uso. Sería bueno tener una herramienta de red de Linux como wget o curl que pueda ayudarme a depurar/probar el progreso de mi solución.
Respuesta1
Esta es una pregunta antigua, pero parece haber recibido al menos algo de tráfico recientemente, así que la responderé.
Dependiendo de lo que esté intentando hacer, hay 2 formas de hacer que su red pase a través de la VPN y, dependiendo de lo que esté intentando enrutar, hay 3 formas de lograrlo.
Proxy (proxy directo)
Esto requiere que su sistema host o contenedor en el que desea utilizar la VPN dirija explícitamente su tráfico a un proxy que se ejecuta en el contenedor VPN. Su contenedor VPN debe ejecutar un proxy además de la VPN activa. Gestiona de forma bastante eficaz el reenvío de red bidireccional.
La técnica requiere que exponga un puerto del servidor proxy del contenedor que haya configurado manualmente dentro del contenedor VPN y luego configure su sistema host para usarlo localhost:port
como proxy. Esto es bastante complicado y tiene muchas opciones, por lo que debes buscarlo específicamente en Google.
Control directo de la pila de red (del host)
Normalmente, el contenedor VPN tiene una pila de red separada que se ejecuta en un espacio de nombres separado, pero puede indicarle a Docker que no separe el espacio de nombres de la red y que le otorgue acceso completo a la pila de red como si se estuviera ejecutando de forma nativa en el host. Si está intentando utilizar una VPN en contenedores como si estuviera instalada de forma nativa en el host, esto es lo que haría. Sin embargo, el control del espacio de nombres de la red host es un permiso independiente del simple hecho de compartirlo, por lo que también es necesario agregar algunas capacidades. Las capacidades de 3xact dependen de su software VPN, pero generalmente son CAP_NET
, CAP_NET_RAW
y con frecuencia CAP_ADMIN
. Si no está seguro y no confía en su aplicación, puede usar el modo privilegiado para otorgar todas las capacidades (más algunos otros extras innecesarios). Entonces, para esto, agrega estas dos opciones a tu comando de ejecución: --net=host --cap=CAP_NET,CAP_NET_RAW,CAP_NET_ADMIN
.
Control directo de la pila de red (de otro contenedor)
Esta opción es el mismo concepto que el control directo de la pila de red del host, pero permite que otro contenedor utilice su VPN en lugar del host, como si se estuviera ejecutando dentro de ese contenedor. Para usarlo, solo tiene que agregar una línea al comando de ejecución del contenedor que no es VPN para indicarle que comparta la pila de red con su contenedor VPN:--net=container:vpn-container-name