笔记
这个问题最初是关于 OpenVPN 不设置默认网关的,如果默认网关尚不存在,即使您指定--redirect-gateway local
或--redirect-gateway def1
。自 2.4.1 起, 开放VPN做使用此选项设置默认网关,无论是否已存在,因此如果您使用该版本,它就已过时。
请注意,Ubuntu Zesty 中的 OpenVPN 版本是 2.4.0,并且没有此更改。但 Artful 的版本在 Zesty 上安装没有问题。
我在 Ubuntu 14.04.5 下创建了一个网络命名空间,并计划在其中运行 VPN(使用 OpenVPN 2.3.2 和配置文件)。这个想法是,在 VPN 运行之前,任何流量都不能路由出命名空间。
我通过不创建默认路由,而是将 VPN 服务器 IP 地址列入白名单来实现这一点。所以我的路由表如下所示:
# ip netns exec testns ip route add A.B.C.D/32 via 10.200.200.1 dev veth1
# ip netns exec testns ip route show
10.200.200.0/24 dev veth1 proto kernel scope link src 10.200.200.2
A.B.C.D via 10.200.200.1 dev veth1
请注意,这是虚拟接口( )另一端10.200.200.1
的地址。我已经确认根命名空间中的规则和 IP 转发可以在存在路由时让流量进出命名空间。是 VPN 服务器地址。veth0
veth1
10.200.200.2
iptables
testns
A.B.C.D
为了启动 VPN,我运行ip netns exec testns openvpn abcd.ovpn
.该配置文件包含一个pull
指令,push
来自服务器的 ed 配置包含:
PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1,dhcp-option[...]
但过了一会儿,我看到:
NOTE: unable to redirect default gateway -- Cannot read current default gateway from system
因此,我的命名空间中没有设置默认路由testns
。
根据手册,redirect-gateway def1
不尝试替换默认路由,它只会创建两个新路由0.0.0.0/1
和128.0.0.0/1
。没有默认路由如何阻止创建这些路由?当默认路由最初不存在时,如何让 OpenVPN 自动路由所有通过 VPN 的流量?
答案1
根据手册,redirect-gateway def1不会尝试替换默认路由,它只是创建两个新路由0.0.0.0/1和128.0.0.0/1。没有默认路由如何阻止创建这些路由?
如果 OpenVPN 仅覆盖默认网关,它将不再能够通过原始网关到达其对等端点。因此,它首先要做的是查看默认网关并通过该网关为其对等端点设置显式主机路由。
OpenVPN 的手册页对此非常明确:
--重定向网关标志...
自动执行路由命令以使所有传出 IP 流量通过 VPN 重定向。这是一个客户端选项。
该选项执行三个步骤:
(1) 为 --remote 地址创建静态路由,转发到预先存在的默认网关。这样做是为了 (3) 不会创建路由环路。
(2) 删除默认网关路由。
(3) 将新的默认网关设置为 VPN 端点地址(来自 --route-gateway 或指定 --dev tun 时的 --ifconfig 的第二个参数)。
当隧道被拆除时,上述步骤全部相反,恢复原来的默认路由。
然后你问
当默认路由最初不存在时,如何让 OpenVPN 自动路由所有通过 VPN 的流量?
OpenVPN 客户端必须(某处)存在一条路由才能到达其对等端点(即服务器)。因此,无论该路线是什么,您都需要在脚本中实现上述三个任务--up
。当然,您需要编写这个脚本。
答案2
两个解决方案:
- 设置一个假的默认网关(例如 127.0.0.1)并允许 OpenVPN 覆盖它。
- 使用运行后脚本通过 ip 路由设置网关