仅当通过 Ubuntu 上的 VPN 访问时才允许互联网访问

仅当通过 Ubuntu 上的 VPN 访问时才允许互联网访问

有没有办法阻止我的系统使用常规互联网,而仅限制其在 Ubuntu 17 上使用 VPN?仅供参考,我已经通过 .ovpn 文件设置了 protonvpn,目前只需通过菜单中的下拉菜单将其打开即可连接到它。

我想强制所有连接仅使用 VPN,如果 VPN 无法访问,它应该阻止所有类型的互联网连接。

我知道这与设置 IPv4 部分的路由有关,但我不确定是什么。

在此处输入图片描述

答案1

是的。使用ufw

当您连接到 VPN 时,它会创建一个虚拟设备。假设您的以太网名称是,enp3s0并且您的 VPN 服务器监听端口 1194,请使用这些命令。

# Default policies
 ufw default deny incoming
 ufw default deny outgoing
 
 # Openvpn interface (adjust interface accordingly to your configuration)
 ufw allow in on tun0
 ufw allow out on tun0
 
 # Openvpn (adjust port accordingly to your configuration)
 ufw allow in on enp3s0 from any port 1194
 ufw allow out on enp3s0 to any port 1194

您可能想要启用本地网络,但是这将泄露 DNS如果您的路由器正在处理您的 DNS 请求(通常情况如此):

 # Local Network (adjust IP, mask according to your configuration)
 ufw allow in on enp3s0 from 192.168.1.0/24
 ufw allow out on enp3s0 to 192.168.1.0/24

如果您通过域(而不是 IP 地址)连接到 VPN 服务器,则需要明确允许此类泄漏到达 DNS 服务器。添加以下命令:

 # DNS
 ufw allow in from any to any port 53
 ufw allow out from any to any port 53

然后用来ufw enable打开这些规则。ufw disable如果出现问题或者您想要直接访问。

由 ArchWiki 提供。

答案2

解决方案是使用 iptables 拒绝除通过隧道之外的所有传出流量。

如果隧道中断,则无法再访问互联网,直到隧道重新建立为止。

我假设您正在使用基于 TUN 的路由连接到 OpenVPN 服务器,并且您正在使用重定向网关 OpenVPN 客户端选项。

在任何地方创建一个文件(例如/root/iptables.vpn),你必须更改[VPN IP][VPN端口]使用 VPN 服务器的 ip:port

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

# Set a default DROP policy.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

# Allow basic INPUT traffic.
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

# Allow basic OUTPUT traffic.
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT

# Allow traffic to the OpenVPN server and via the tunnel.
-A OUTPUT -o tun+ -j ACCEPT
-A OUTPUT -p udp -m udp -d [VPN_IP] --dport [VPN_PORT] -j ACCEPT

# Reject everything else.
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT

与 VPN 服务器建立连接后,您必须启用以下规则:

iptables-restore < /root/iptables.vpn

现在所有交通都将通过该隧道进行。

编辑 正如作者所写,他使用类似网络管理器的方法运行连接,因此问题在于他不知道服务器的远程 IP,因为它是从池中获取的。我认为(但目前我还没有时间测试这个解决方案)一种方法可能是:

  1. 修改先前创建的文件(在我们的示例中为 /root/iptables.vpn),将 [VPN_IP] 替换为$route_vpn_gateway和 [VPN_PORT]$远程端口
  2. 创建脚本(例如/etc/openvpn/route.sh):
while read line
  do eval "echo ${line}"
done < /root/iptables.vpn | /sbin/iptables-restore -v

https://stackoverflow.com/questions/5289665/use-external-file-with-variables

  1. 修改(然后重新加载)你的 .openvpn 文件并附加:

脚本安全 2

/etc/openvpn/route.sh

OpenVPN 连接成功后如何运行脚本?

每次建立与 vpn 的连接时,该脚本都会运行。

如上所述,我还没有测试过这个...

记得在关闭 VPN 连接后刷新 iptables

答案3

方法有很多,但取决于您使用的特定 VPN 软件。

您可以通过编辑接口配置来阻止系统在未使用 VPN 时访问网络,无论是在NetworkManager 中/etc/network/interfaces还是在 NetworkManager 中(如果您使用的是桌面系统,则更可能这样做)。打开 NM,选择“配置网络”或类似选项,然后编辑每个接口如何获取其地址的选项,以使用不包含默认路由的静态路由(或将默认路由添加到 blackhole)。然后设置您的 VPN,以便在启动时通过该路由为您提供默认路由。

如果没有关于您的设置的更多详细信息,我只能说这么多。

答案4

由于您正在使用 ProtonVPN,请注意他们现在已经发布了一个命令行客户端来处理大多数功能,包括设置和连接管理。

关于你的问题,最重要的是,这个客户包括一个终止开关功能。我已经测试过了,它运行良好。 一句警告但是:您需要断开连接并重新连接才能启用您对终止开关配置所做的任何更改(启用、禁用和允许或不允许本地子网)。我个人对该工具的不满是它没有提供检查您处于哪种终止开关配置状态的方法。所以希望您的使用不需要频繁更改配置。

protonVPN.com 上详细介绍了安装和使用方法: 适用于 Linux 的 ProtonVPN 命令行工具

供参考,以下是有关终止开关部分的副本:


ProtonVPN-CLI 具有内置的 Kill Switch,可以在您的 VPN 连接中断或意外切断时保护您的数据。

启用终止开关

要启用 Kill Switch,请使用 打开配置菜单protonvpn configure,然后选择 5 作为 Kill Switch,并根据您的喜好使用 1 或 2 确认激活。

1 将阻止来自您直接连接的网络(例如公共 WiFi)的访问,建议用于可能连接到不受信任网络的笔记本电脑。

2 将允许从您的直接连接网络进行访问,并且适用于不离开安全可信的 LAN(如家庭网络)的计算机。

下次连接时,将启用 Kill Switch。

相关内容