Как заставить 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, поэтому я спрашиваю в частности, о том, как заставить эти два работать одновременно.
ссылки:
если это имеет значение, мой 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 должны работать после перезагрузки.