我最近安装了隐私vpn,事实证明,启用openvpn打破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杰西,我的openvpn有以下版本字符串
OpenVPN 2.3.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jun 26 2017
很多人通过禁用openvpn“解决”了这个问题,所以我特别问一下如何让这两个同时工作。
参考文献:
- https://stackoverflow.com/a/45377351/7918
- 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
9条答案
按热度按时间0s0u357o1#
溶液(TL; DR;)
创建包含以下内容的
/etc/openvpn/fix-routes.sh
脚本:向文件添加可执行位:
chmod o+x /etc/openvpn/fix-routes.sh
。将此文件的所有者更改为root:chown root:root /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
,这样就允许从openvpn上下文执行bash脚本。谢谢
我要感谢github上这篇评论的作者,也要感谢ovpn support。
kb5ga3dv2#
如果在Docker合成文件中定义子网CIDR,也可以使Docker-compose工作:
另一种选择:首先创建具有子网CIDR的网络,然后在Docker合成文件中指定要使用此网络:
在Docker合成文件中:
ukxgm1gy3#
基于answer from Anas El Barkani,这里是一个使用PostgreSQL的完整的分步示例。
当VPN未连接时,创建永久docker network:
在Docker-compose文件中,将网络指定为外部:
现在您可以像往常一样启用您的VPN,并启动/停止container:
不需要打开/关闭VPN的每一次,或添加奇怪的脚本作为根。
wqsoz72f4#
免责声明:
此解决方案最初设计用于下一种配置:
并且对于其它配置可以不同。
问题
启动VPN连接。
当您尝试重新启动Docker守护进程时,您将在日志中获得:
当您尝试在以下情况下创建网桥网络(
docker
和docker-compose
隐式尝试创建此类网络)时:docker create network
,未定义子网参数docker-compose up
您将获得:
溶液(TL;业务流程重新设计)
1.从private address space中选择Docker网络的地址范围,该范围不打算用于VPN内部的资源。假设它是
172.26.0.0/16
。daemon.json
文件中:其中:
bip
**-又称"网桥IP":docker0
网桥网络的特定网桥IP地址,如果未指定other,则默认使用该地址。fixed-cidr
**-docker0
接口和本地容器的CIDR范围。仅当要限制bip
定义的IP范围时才需要。default-address-pools
**-docker_gwbridge
(docker-swarm
需要)接口和网桥网络的CIDR范围。size
参数设置此范围内新建网络的默认子掩码。在此示例中,我们将初始
172.26.0.0/16
范围除以相等的172.26.0.0 - 172.26.127.255
和172.26.128.0 - 172.26.255.255
池。请小心
daemon.json
,否则在重新启动docker守护进程时会出现如下错误tun0
172.26.0.0/16
将该池拆分到区块上的子网中。您可以使用this amazing calculator by David C。我们有:/etc/openvpn/mynetwork-route-up.sh
脚本,OpenVPN从路由中排除我们的子网,具有以下内容(请注意,我们排除了我们的网络):/etc/openvpn/mynetwork-route-pre-down.sh
脚本(请注意,我们排除了网络):.ovpn
配置的末尾1.重新启动Docker守护程序
原因
OpenVPN经常用来路由所有流量通过隧道,或至少,代理私有池.那么为什么Docker失败,当它启动?
当您启动Docker守护进程时,它会检查守护进程的配置网桥网络是否与路由重叠(up-〉down stacktrace):
正如您在这里看到的,您也可以在守护进程配置中禁用创建默认网桥网络来修复此错误。
当Docker的组件
libnetwork
尝试创建它的网络时,它会检查所有可用地址是否与路由重叠。如果没有发现,它会返回一个错误(up-〉down stacktrace):当然,其他情况下得到这个错误也存在。必须抓住他们所有!
变通方法(不推荐)
Docker允许您显式传递子网地址范围,在这种情况下似乎不执行重叠检查。
https://github.com/docker/libnetwork/blob/922cd533eac14b6e0754756c5cacf9f44af5d699/network.go#L1657
我不深潜,但我认为,OpenVPN不检查重叠.
附言
谢谢(https://stackoverflow.com/users/7918/jb)[jb][jb]) for his great answer,写这个答案给了我很多启发。
要深入了解Docker的网络,您可以阅读以下文章:
还有,don't forget this!
yyyllmsg5#
导致问题的默认路由被推到OpenVPN客户端的OpenVPN服务器.
与其创建一个脚本来删除路由,不如从一开始就停止创建有问题的路由。
有两种方法可以做到这一点:
1.如果您可以更改OpenVPN服务器上的设置,请编辑配置并删除
redirect-gateway
选项.在我的EdgeRouter上,相关行如下所示:openvpn-option "--push redirect-gateway def1"
一个Linux服务器,我相信它看起来像这样:
push "redirect-gateway def1"
1.如果您不能更改OpenVPN服务器上的设置,您可以告诉您的OpenVPN客户端忽略从服务器推送的路由.在我的Linux客户端上,相关行看起来像这样:
pull-filter ignore redirect-gateway
一旦你做了这些更改,并重新启动OpenVPN服务,你应该能够启动Docker容器没有可怕的
could not find an available, non-overlapping IPv4 address
错误.wnvonmuf6#
也许一种方法是将除www.example.com以外的所有路由添加172.16.0.0/12到通过VPN的路由中,这样我们就可以确保所有传出的路由都得到了正确处理:
irlmq6kh7#
对我有效的方法:看过之后
只需手动创建网络:
lymnna718#
这里有一些额外的背景:0.0.0.0和128.0.0.0路由仅在OpenVPN服务器(又称访问服务器)配置为推送路由,以通过VPN发送端点的所有Internet流量。通过添加这些宽路由,可以路由用户的Internet流量,而不会干扰本地LAN上的路由,并且确保端点保持能够将OpenVPN业务本身路由到本地路由器。
如果不需要通过OpenVPN服务器发送所有的互联网流量,您最好让您的VPN管理员创建一个配置文件,只通过VPN将流量路由到所需的目的地(如私有IP地址范围),而不是所有的目的地。
ego6inou9#
基于the answer from alexanderlukanin13。它对我的docker-compose文件版本有效:“3.8”。我从文档中添加了一个使用预先存在的网络。
1.关闭OpenVPN连接。
1.创建自定义Docker网络:第一个月
1.在Docker-compose文件的底部:
1.打开OpenVPN连接
之后:
sudo docker compose -f docker-compose.yml up -d --build
正常工作,没有错误:failed to create network your-network-name_default: Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network