Tengo la siguiente configuración:
- Un host CentOS que ejecuta el servicio acoplable
- Una red de puente acoplable definida por el usuario
- 2 contenedores Docker conectados a esa red puente definida por el usuario
- Una instalación de OpenVPN (actualmente se ejecuta en el host. También se puede ejecutar en un contenedor acoplable)
- Algunos clientes conectados a OpenVPN
¿Cómo puedo permitir que los contenedores docker en la red del puente docker se comuniquen con los clientes openvpn en la red tun0?
Me gustaría poder tener una comunicación basada en TCP entre docker1 (10.10.0.3) y los clientes conectados a vpn (rango 172.19.0.x) de manera transparente.
¿Qué necesito configurar en el lado del acoplador (red / iptables / ...) y en el host (iptables?)
tap
, locotun
, he estado trabajando en eso durante más de 12 horas sin éxito hasta ahora.Respuestas:
Contexto
He estado usando el muy buen contenedor Docker de Kyle Manna ( https://github.com/kylemanna/docker-openvpn ). Estoy usando la llamada documentación "paranoica" para configurar mi servidor OpenVPN, pero en mi opinión, esta debería ser la forma estándar y no la paranoica.
Configuración
Para permitir la conexión bidireccional entre los contenedores Docker seleccionados y los clientes VPN, debe crear una red Docker en la que vaya a conectar el contenedor al que los clientes VPN deben poder acceder. El servidor VPN será uno de esos contenedores.
El servidor VPN debe tener el
client-to-client
,topology subnet
,dev tun0
(u otro dispositivo tun) ypush "route <docker net IP> <docker net mask>"
configurado.El host del servidor VPN debe configurarse para admitir el reenvío de paquetes IP de una subred a otra. Esto significa establecer sysctl ip_forward en 1 (debería ser el caso si tiene la instalación de Docker), permitiendo que los paquetes del dispositivo tun pasen por la cadena FORWARD de iptables y estableciendo el enrutamiento adecuado. Esto se puede resumir con estos comandos:
De todos modos, estas son las opciones que he usado para configurar el servidor:
Esto debería generar un archivo de configuración del servidor similar a:
Ejemplo concreto
Ahora tomaré un ejemplo concreto. En este ejemplo, ejecutaré el servidor OpenVPN mencionado anteriormente dentro de Docker en el host vpn.example.com. Este contenedor está conectado a la red Docker docker-net-vpn. Estos son los comandos (en este ejemplo, genero la configuración del servidor directamente en el servidor y omito la generación de CA; en su lugar, siga la documentación paranoica del proyecto mencionado anteriormente):
El primer comando crea una nueva red Docker dedicada que define una nueva subred. Adjuntaremos el servidor OpenVPN a esta red.
El segundo crea la configuración de OpenVPN utilizando la misma subred definida en el primer comando.
El tercero crea el servidor OpenVPN. Está conectado a la red Docker recién creada y utiliza una IP fija.
Los comandos cuarto y quinto configuran el reenvío de IP.
El último comando agrega una nueva ruta hacia la configuración del cliente VPN a través de la IP fija del contenedor OpenVPN.
Nota
No lo he probado, pero debería ser posible restringir la regla ADELANTE para iptables. La creación de la red Docker creó un nuevo dispositivo puente. Este puente se nombra
br-<ID>
con ID siendo los primeros 12 caracteres de la ID de red Docker. Esta identificación se puede obtener condocker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12
. Por lo tanto, el siguiente comando es quizás más restrictivo (por lo que es mejor en términos de seguridad) pero aún debería permitir que nuestro tráfico se enrute:fuente
1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !H
pero no puedo hacer ping ni alcanzar puertos abiertos.docker network…
.