Как заставить openvpn работать с докером

Недавно я установил приватность vpn, и оказалось, что openvpn отключает докер.

Когда я пытаюсь запустить 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

Ответ 1

Решение (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 значение 2 которое позволяет выполнять сценарии bash из контекста openvpn.

Спасибо

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

Ответ 2

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

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

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

docker network create your-network --subnet 172.24.24.0/24

В вашем докере создайте файл:

networks:
  your-network:
    external: true

Ответ 3

Основываясь на ответе Анаса Эль Баркани, приведу полный пошаговый пример использования PostgreSQL.

Пока VPN не подключен, создайте постоянную сеть докеров:

docker network create my-network --subnet 172.24.24.0/24

В файле docker-compose укажите сеть как внешнюю:

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

Все это. Теперь вы можете включить VPN и запускать/останавливать контейнер как обычно:

docker-compose up -d
docker-compose down

Нет необходимости каждый раз включать/выключать VPN или добавлять странные скрипты от имени root.

Ответ 4

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

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

Ответ 5

Возможно, один из способов сделать это - добавить все маршруты, кроме 172.16.0.0/12, для маршрутизации через VPN, поэтому мы уверены, что все выходы правильно обрабатываются:

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