OpenVPN CLI 用于终止开关或连接回退预防

OpenVPN CLI 用于终止开关或连接回退预防

我通过命令行使用 OpenVPN 连接到当前 Linux 发行版上的 VPN,因为没有可用的 GUI(其中有一个终止开关复选框)。

我的问题是,我找不到任何方法来添加终止开关或防止在 VPN 断开时回退到默认连接。

这是我当前用于连接的命令:

openvpn --config /etc/openvpn/gateway.conf

基本上,我想找到一种简单的方法来防止我的 VPN 在出现故障时回退到默认连接。我只是希望我的连接处于中断状态,直到 VPN 连接恢复为止。

网关配置文件

client
dev tun
proto udp
remote us-california.privateinternetaccess.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
tls-client
remote-cert-tls server
auth-user-pass /etc/openvpn/login.conf
comp-lzo
verb 1
reneg-sec 0
crl-verify /etc/openvpn/crl.pem


auth-nocache
script-security 2
up /etc/openvpn/update-resolv-conf.sh
down /etc/openvpn/update-resolv-conf.sh

源文件:https://aur.archlinux.org/packages/private-internet-access-vpn

答案1

您应该能够通过设置具有更高度量的黑洞规则来做到这一点:对于每个路由规则,您希望添加一个具有较低优先级(较高度量)的重复路由,当 OpenVPN 的路由被拆除时,该路由将保留在原处。该附加路线是blackhole,prohibitunreachable路线。

您应该能够通过以下方式做到这一点:

#!/bin/sh
set -e
ip route replace blackhole "$ifconfig_local/$ifconfig_netmask"

i=1
while true; do
  route_network_i="$(eval echo \$route_network_$i)"
  route_netmask_i="$(eval echo \$route_netmask_$i)"
  route_metric_i="$(eval echo \$route_metric_$i)"
  if [ -z "$route_network_i" ]; then
    break
  fi
  ip route replace blackhole "$route_network_i"/"$route_netmask_i" metric $(( $route_metric_i + 1 ))
  i=$(( $i + 1 )
done

答案2

当保护 VPN 隧道免遭泄漏时,最好避免 VPN 客户端尝试自行管理的机制。在大多数情况下,这意味着您应该使用iptablesnft来代替ip route,因为 OpenVPN 以多种方式操纵后者。

以下是一种防泄漏方法,可以阻止除发往隧道设备和 OpenVPN 链路本身的任何流量之外的所有流量 - 无论如何配置路由。


首先,添加一个供 VPN 客户端使用的特殊组(如果您愿意,您可以选择其他组名称,只要它尚未被系统上的其他用户或程序使用即可):

sudo groupadd -r -f tunnel

然后是需要root在每次系统启动时或 VPN 启动之前运行的防火墙规则:

#!/bin/sh
iptables -F OUTPUT
iptables -P OUTPUT DROP
iptables -A OUTPUT -p all -m owner --gid-owner tunnel -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

请注意,组 ID“tunnel”是网络访问的条件,就像将隧道设备“tun+”作为输出一样。如果您的 openvpn 配置使用tap设备,则可以指定“tap+”而不是“tun+”。

最后,您可以在特殊组ID下运行VPN客户端:

sudo sg tunnel -c 'openvpn --config /etc/openvpn/gateway.conf --group tunnel'

组名“tunnel”在命令行中指定了两次,因为我们必须确保 openvpn 进程的组 ID 在其初始启动期间和建立连接后均已设置。如果 openvpn 是从 systemd 服务而不是命令行或脚本运行,那么Group=将使用分配而不是sg.

无论 openvpn 是否运行,上述技术都应该在 iptables 规则处于活动状态时保护您免受 Clearnet 泄漏。这包括数据和 DNS 数据包。并且OUTPUT链的策略可以用作开关来有效地打开或关闭规则(使用DROP或ACCEPT)。

相关内容