Objetivo
Necesitamos pasar por una VPN para acceder a algunos servicios, pero para el resto de nuestras conexiones queremos evitar dicha VPN.
Una posible solución seria usar IPTABLES con discriminación por usuario pero puede resultar demasiado complejo.
Por ello aquí se presenta una alternativa que consiste en crear una imagen docker con un servidor SSH levantado y con la VPN configurada y activada de manera que podamos hacer conexiones a través de la imagen solo cuando nos interese ir a través de la VPN.
Nota: Este desarrollo esta montado sobre VPNC (Cisco VPN) porque es lo que actualmente tengo que usar en el curro, pero sería fácilmente modificable para usar con OpenVPN u otra alternativa.
Piezas
config/default.confdebe contener la configuración de nuestra VPNCconfig/authorized_keysdebe incluir la clave pública con la que nos queremos poder conectar a la máquina dockerconfig/init.shes el script que arrancara el servidor SSH y conectara la VPNC al iniciar la imagen dockerDockerfilees la definición de nuestra imagen dockerinstall.shes un pequeño script que crea una imagen y configura un serviciosystemdpara manejarla
Pasos
Clave SSH
Para crear la clave ssh podemos hacer:
$ ssh-keygen -t rsa -f ~/.ssh/docker-vpnc -C "docker-vpnc"
$ cp ~/.ssh/docker-vpnc.pub config/authorized_keys
Instalar imagen y servicio
Para crear la imagen y arrancarla:
$ sudo ./install.sh
$ sudo systemctl daemon-reload
$ sudo systemctl start dvpnc.service
Ejemplo de uso (~/.ssh/config)
Como ejemplo, podemos configurar muestro ~/.ssh/config de esta manera:
Host docker-vpnc
HostName localhost
User vpnc
Port 52022
IdentityFile ~/.ssh/docker-vpnc
Host in
HostName 10.2.42.162
IdentityFile ~/.ssh/in
User myuser
ProxyJump docker-vpnc
Host out
HostName 10.2.42.162
IdentityFile ~/.ssh/out
User myuser
y cuando queramos entrar a la máquina 10.2.42.162 que es solo accesible a
través de la VPN nos bastara con hacer ssh in, mientras que si queremos
entrar en la máquina 10.2.42.162 que esta fuera de la VPN podremos hacer
ssh out. Así ambas máquinas serán accesibles a la vez.
Nota: Si se quiere usar un puerto distinto a 52022 hay que editar ./install.sh
y ~/.ssh/config
Repositorio con todo el código en github.com/s-nt-s