Как заставить 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