Как заставить openvpn работать с docker

недавно я установил конфиденциальность vpn, и оказывается, что включен openvpn breaks docker.

когда я пытаюсь запустить docker-compose up Я получаю следующую ошибку

ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

отключение vpn устраняет проблему (однако я бы не хотел ее отключать). Есть ли способ сделать так, чтобы эти двое сосуществовали мирно? Я использую debian jessie, и мой openvpn имеет следующую строку версии

 OpenVPN 2.3.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jun 26 2017

многие люди "решили" эту проблему, отключив openvpn, поэтому я спрашиваю в частности, о том, как заставить эти два работать одновременно.

ссылки:

  1. https://stackoverflow.com/a/45377351/7918
  2. https://stackoverflow.com/a/42499393/7918

если это имеет значение, мой VPN-провайдер:https://www.ovpn.com/ и вот (несколько отредактированный) файл конфигурации:

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

4 ответов


решение (TL;DR;)

создать /etc/openvpn/fix-routes.sh скрипт со следующим содержимым:

#!/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

добавить исполняемый бит в файл:chmod o+x /etc/openvpn/fix-routes.sh. Измените владельца этого файла на root:chown root:root /etc/openvpn/fix-routes.sh.

добавьте в свою конфигурацию следующие две строки:

 script-security 2
 route-up  /etc/openvpn/fix-routes.sh

объяснение

Openvpn добавляет маршруты, которые для следующих сетей:0.0.0.0/1 и 128.0.0.0/1 (эти маршруты охватывают весь диапазон IP), и docker не может найти диапазон IP-адресов для создания это собственная частная сеть.

вам нужно добавить маршрут по умолчанию (для маршрутизации всего через openvpn) и отключить эти два конкретных маршрута. fix-routes скрипт делает это.

этот скрипт вызывается после того, как openvpn добавляет свои собственные маршруты. Для выполнения скриптов вам необходимо установить script-security to 2 что позволяет выполнять скрипты bash из контекста openvpn.

спасибо

спасибо автор этого комментария к github, также благодаря поддержка ovpn.


вы также можете заставить docker-compose работать, если вы определяете cidr подсети в файле docker compose:

networks:
  your-network:
   ipam:
      config:
      - subnet: 172.16.238.0/24
        gateway: 172.16.238.1

другой вариант: сначала создайте сеть с подсетью CIDR, а затем укажите в файле docker compose, что вы хотите использовать эту сеть:

network create your-network --subnet 172.24.24.0/24

в вашем файле docker compose:

networks:
  your-network:
    external: true

некоторый дополнительный контекст здесь: маршруты 0.0.0.0 и 128.0.0.0 создаются только в том случае, если сервер OpenVPN (он же сервер доступа) настроен на push-маршруты для отправки всего интернет-трафика конечной точки через VPN. Добавляя эти широкие маршруты, интернет-трафик пользователя можно маршрутизировать, не вмешиваясь в маршрутизацию по локальной сети, и гарантируя, что конечная точка остается в состоянии маршрутизировать сам трафик OpenVPN к локальному маршрутизатору.

при отправке всего интернет-трафика через сервер OpenVPN не является требованием, вам может быть лучше попросить вашего администратора VPN создать профиль, который только направляет трафик в требуемые пункты назначения (например, частные диапазоны IP-адресов) через VPN вместо всего. Это должно избежать необходимости связываться с маршрутами на конечной точке.


Если openVpn настроен для запуска при загрузке. В качестве временного решения-вы можете попробовать:

1. sudo service openvpn stop
2. reboot your system
3. docker-compose up

оба docker и openvpn должны работать после перезагрузки.