docker - 如何使 openvpn 与 docker 一起工作

标签 docker debian openvpn docker-networking

我最近安装了privacy 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 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

最佳答案

解决方案 (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/1128.0.0.0/1(这些路由覆盖整个 IP 范围),而 docker 不能查找 IP 地址范围以创建它自己的专用网络。

您需要添加一个默认路由(通过 openvpn 路由所有内容)并禁用这两个特定路由。 fix-routes 脚本就是这样做的。

openvpn 添加自己的路由后调用此脚本。要执行脚本,您需要将 script-security 设置为 2,这允许从 openvpn 上下文执行 bash 脚本。

谢谢

感谢author of this comment on github , 还要感谢 ovpn support .

关于docker - 如何使 openvpn 与 docker 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45692255/

相关文章:

docker - 如何更改正在运行的 docker 容器的网络?

debian - 如何在 Gnome Shell 3.16.2 中显示 gnome-shell 扩展的堆栈跟踪?

python - 在 Fabric 中,如何检查 Debian 或 Ubuntu 软件包是否存在,如果不存在则安装它?

c# - 如何通过互联网向多个客户端发送音频/视频?

android - 检查 Android 上 openVPN 的 VPN 连接状态

docker - 将持久卷声明添加到容器中的现有文件

Docker 以 root 身份挂载卷

mysql - 无法连接到 mysql docker 图像连接被拒绝

svg - 是否有提供错误消息的 SVG 查看器?

android - OpenVPN 和安卓 NDK