hub - Cómo hacer que openvpn funcione con docker
docker tag (5)
Solución (TL; DR;)
Cree el script /etc/openvpn/fix-routes.sh
con el siguiente contenido:
#!/bin/sh
echo "Adding default route to $route_vpn_gateway with /0 mask..."
ip route add default via $route_vpn_gateway
echo "Removing /1 routes..."
ip route del 0.0.0.0/1 via $route_vpn_gateway
ip route del 128.0.0.0/1 via $route_vpn_gateway
Agregue un bit ejecutable al archivo: chmod o+x /etc/openvpn/fix-routes.sh
. Cambie el propietario de este archivo a root: chown root:root /etc/openvpn/fix-routes.sh
.
Agregue a su configuración dos líneas siguientes:
script-security 2
route-up /etc/openvpn/fix-routes.sh
Explicación
Openvpn agrega rutas para las siguientes redes: 0.0.0.0/1
y 128.0.0.0/1
(estas rutas cubren todo el rango de IP), y la ventana acoplable no puede encontrar un rango de direcciones IP para crear su propia red privada.
Debe agregar una ruta predeterminada (para enrutar todo a través de openvpn) y deshabilitar estas dos rutas específicas. fix-routes
script de fix-routes
hace eso.
Este script se llama después de que openvpn agrega sus propias rutas. Para ejecutar scripts, deberá establecer script-security
en 2
que permite la ejecución de scripts de bash desde el contexto de openvpn.
Gracias
Me gustaría agradecer al autor de este comentario en github , también gracias al https://www.ovpn.com/ .
Recientemente instalé la privacidad vpn, y resulta que openvpn habilitado rompe la ventana acoplable.
Cuando intento ejecutar docker-compose up
obtengo el siguiente error
ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
Deshabilitar vpn soluciona el problema (sin embargo, prefiero no deshabilitarlo). ¿Hay alguna manera de hacer que estos dos coexistan pacíficamente? Yo uso debian jessie, y mi openvpn tiene la siguiente cadena de versión
OpenVPN 2.3.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jun 26 2017
Mucha gente "resolvió" este problema al deshabilitar el openvpn, así que estoy preguntando específicamente cómo hacer que estos dos funcionen al mismo tiempo.
Referencias:
- https://stackoverflow.com/a/45377351/7918
- https://stackoverflow.com/a/42499393/7918
Si esto hace alguna diferencia, mi proveedor de vpn es: https://www.ovpn.com/ y aquí está el archivo de configuración (algo redactado):
client
dev tun
proto udp
remote host port
remote-random
mute-replay-warnings
replay-window 256
push "dhcp-option DNS 46.227.67.134"
push "dhcp-option DNS 192.165.9.158"
remote-cert-tls server
cipher aes-256-cbc
pull
nobind
reneg-sec 432000
resolv-retry infinite
comp-lzo
verb 1
persist-key
persist-tun
auth-user-pass /etc/openvpn/credentials
ca ovpn-ca.crt
tls-auth ovpn-tls.key 1
Basado en la respuesta de Anas El Barkani , aquí hay un ejemplo completo paso a paso que usa PostgreSQL.
Mientras VPN no está conectada, cree una red de conexión permanente:
docker network create my-network --subnet 172.24.24.0/24
En el archivo de la ventana acoplable, especifique la red como externa:
version: "2"
services:
postgres:
container_name: postgres
image: postgres
volumes:
- ./volumes/postgres/data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=dummy
- POSTGRES_USER=user
- POSTGRES_PASSWORD=123456
- POSTGRES_HOST=localhost
networks:
- default
ports:
- "127.0.0.1:5432:5432"
networks:
default:
external:
name: my-network
Eso es todo. Ahora puede habilitar su VPN e iniciar / detener el contenedor de la forma habitual:
docker-compose up -d
docker-compose down
No es necesario activar o desactivar la VPN cada vez, o agregar scripts extraños como root.
Tal vez una forma de hacerlo es agregar todas las rutas, excepto 172.16.0.0/12 para enrutar a través de VPN, por lo que estamos seguros de que todo lo que sale se maneja adecuadamente:
sudo ip route add 192.0.0.0/2 via $route_vpn_gateway
sudo ip route add 128.0.0.0/3 via $route_vpn_gateway
sudo ip route add 176.0.0.0/4 via $route_vpn_gateway
sudo ip route add 160.0.0.0/5 via $route_vpn_gateway
sudo ip route add 168.0.0.0/6 via $route_vpn_gateway
sudo ip route add 174.0.0.0/7 via $route_vpn_gateway
sudo ip route add 173.0.0.0/8 via $route_vpn_gateway
sudo ip route add 172.128.0.0/9 via $route_vpn_gateway
sudo ip route add 172.64.0.0/10 via $route_vpn_gateway
sudo ip route add 172.32.0.0/11 via $route_vpn_gateway
sudo ip route add 172.0.0.0/12 via $route_vpn_gateway
# And finally delete the default route which handle 172.16.0.0/12
sudo ip route del 128.0.0.0/1 via $route_vpn_gateway
También puede hacer que Docker-Compose funcione si define la subred CIDR en su archivo de redacción de Docker:
networks:
your-network:
ipam:
config:
- subnet: 172.16.238.0/24
gateway: 172.16.238.1
Otra opción: cree primero la red con la subred CIDR y luego especifique en el archivo de composición de la ventana acoplable que desea usar esta red:
network create your-network --subnet 172.24.24.0/24
En su docker compose el archivo:
networks:
your-network:
external: true
Un poco de contexto adicional aquí: las rutas 0.0.0.0 y 128.0.0.0 solo se crean si el servidor OpenVPN (también conocido como Servidor de acceso) está configurado para impulsar rutas para enviar todo el tráfico de Internet del punto final a través de la VPN. Al agregar estas rutas amplias, el tráfico de Internet del usuario se puede enrutar sin interferir con el enrutamiento en la LAN local, y garantizar que el punto final siga siendo capaz de enrutar el tráfico de OpenVPN al enrutador local.
Si enviar todo el tráfico de Internet a través del servidor OpenVPN no es un requisito, es mejor que solicite a su administrador de VPN que cree un perfil que solo enrute el tráfico a los destinos requeridos (como los rangos de direcciones IP privadas) a través de la VPN en lugar de todo. Eso debería evitar tener que meterse con las rutas en el punto final.