65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 UFW 创建 VPN kill switch

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (2投票s)

2018年11月14日

CPOL

12分钟阅读

viewsIcon

34956

实现一个 VPN kill switch,在 VPN 断开时停止所有互联网流量

随着 ISP 和政府对您的浏览习惯越来越感兴趣,通过 VPN 连接到互联网正变得越来越普遍。但是,如果您忘记使用 VPN,或者连接断开而您没有注意到,那么 VPN 有什么用?如果您已经致力于匿名浏览网页,那么在您的 Linux 桌面设置 VPN killswitch 将确保您的数据得到加密。

什么是 VPN killswitch?

VPN killswitch 是一组防火墙规则,当 VPN 未连接时,它会停止所有互联网流量。它们是完全自动化的,killswitch 仅在您的安全连接出现问题时才会启动。

如果您曾经因为在 VPN 断开时不知不觉地浏览网页而自责,那么使用 UFW 创建 VPN killswitch 是一个相当容易的解决方法。

什么是 UFW?

UFW 是一组脚本,它们充当 Linux iptables 防火墙的包装器。iptables 是一个强大的工具,但它并不容易使用。UFW 使构建有用的规则集变得更加简单,特别是如果您不是一个精通 iptables 的 Linux 高级用户。

如果您曾经在 Linux 网络方面遇到困难,但仍需要一个安全且用户友好的防火墙,我推荐 UFW。

开始之前

在您开始之前,最好确保您的系统是最新的。我将在本指南中使用 Ubuntu 18 LTS。只要您使用的是基于 Debian 的 Linux 操作系统,步骤就会相同。

使用以下命令更新您的操作系统和已安装的软件

sudo apt update
sudo apt upgrade -y

命令执行完毕后,您就可以开始使用 UFW 设置 VPN killswitch 了。

禁用 IPv6

许多 VPN 提供商仍然没有充分的 IPv6 支持,这可能导致数据泄露和其他问题。我认为最好完全禁用 IPv6,除非您确信您的提供商支持它。

此步骤是可选的,如果需要,您可以跳过。

如何禁用 IPv6

您需要为操作系统和 UFW 同时禁用 IPv6,以确保您的 VPN 提供商不会以未加密的方式传输 IPv6 流量。在 Ubuntu 中,这意味着您需要编辑以下文件

  • /etc/sysctl.conf 禁用 IPv6 网络
  • /etc/default/ufw 阻止 UFW 自动创建 IPv6 规则

开始之前,请使用以下控制台命令打开 /etc/sysctl.conf 进行编辑

sudo nano /etc/sysctl.conf

滚动文件直到您看到 net.ipv6.conf 的条目,并将以下三行添加到配置文件的末尾

net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1

使用 Ctrl+XY 保存更改,并使用以下命令强制系统重新加载 sysctl.conf 并应用您的更改

sudo sysctl -p

您可以通过查看 /proc 中的文件来确认更改是否成功应用,其中包含有关您系统的​​信息。在这种情况下,请使用以下命令确保 IPv6 已在操作系统级别禁用

cat /proc/sys/net/ipv6/conf/all/disable_ipv6

如果您的系统显示 1 作为输出,则表示 IPv6 已成功禁用。

接下来,您需要阻止 UFW 自动创建 IPv6 防火墙规则。即使协议已在操作系统级别禁用,UFW 仍会坚持添加 IPv6 规则,直到告知其停止。这样做将减少规则集的混乱,并可能节省您以后的一些麻烦。

要关闭 UFW 中的 IPv6,请使用此命令打开 /etc/default/ufw 文件进行编辑

sudo nano /etc/default/ufw

滚动直到找到 IPv6 规则的设置,并将其更改为

IPV6=no

Ctrl+XY 保存更改。如果您在此项目开始之前已经启用了 UFW则需要使用以下命令禁用它

sudo ufw disable

现在 IPv6 已在系统范围内禁用,您可以继续收集设置 UFW VPN killswitch 所需的信息了。

获取所需信息

为了在 UFW 中设置 VPN killswitch,您需要三条信息

  • 您连接到的 VPN 服务器的公网 IP 地址
  • 您的服务器用于通信的端口和协议
  • 您的本地网络的子网

这些设置可以在您的 VPN 服务器的配置文件中找到。为了获取有关您连接的信息,您需要查看配置文件并记下您的设置。

显示 VPN 服务器设置

在大多数情况下,您的 VPN 配置文件将存储在 /etc/openvpn 中,但它也可以设置在任何位置。如果您在 /etc/openvpn 中看不到 *.ovpn*.conf 文件,请检查您的主目录

您需要的端口、协议和公网 IP 地址将位于配置文件的顶部附近。我使用此命令显示了我的,如上所示

head /etc/openvpn/config.ovpn

记下所有三个,因为您在设置 UFW 时需要它们。

显示子网

您还需要知道您的计算机所在的 LAN 子网。在许多情况下,它将是 192.168.1.0/24,但如果您不确定,最好在设置 UFW VPN killswitch 之前进行确认。

有几种不同的方法可以获取所需信息,但我推荐此命令

ip addr | grep inet

您将看到系统中每个网络适配器的 inet 条目。在大多数情况下,只会有一个条目;一个用于您的环回适配器,一个用于您的 LAN 适配器。忽略环回适配器,它将始终具有 127.0.0.1/8 的子网,并记下另一个条目。

使用 UFW 设置 VPN killswitch

一旦您获得了所需的信息,您就可以使用 UFW 设置 VPN killswitch。这个过程有三个步骤

  • 明确允许 LAN 流量,这样网络服务即使在 VPN 断开时也能正常工作
  • 禁止所有其他流量,除非它通过加密连接运行
  • 启用 UFW 以激活规则集

完成后,VPN killswitch 将处于活动状态。所有设置即使您重新启动计算机也将保持活动状态。

允许本地流量

即使 VPN 断开,也要允许您的计算机访问 LAN,这一点很重要,特别是如果您依赖任何本地网络资源。由于大多数人使用网络打印,并且许多 Linux 用户依赖 SSH,因此我强烈建议您不要跳过此步骤。

请注意,这只会允许进出您 LAN 的流量。当 VPN 断开时,您的互联网连接将按预期被禁用。

您需要知道上一步中的 LAN 子网,并在您自己的子网 192.168.1.0/24 中替换它。

使用以下命令允许 LAN 访问您的计算机

sudo ufw allow in to 192.168.1.0/24

sudo ufw allow out to 192.168.1.0/24

如上所示,您应该在每个规则添加时收到确认。

配置 VPN killswitch

接下来,您将设置 killswitch 本身。您只需要输入 4 或 5 个命令,但这将完全关闭您的互联网连接,当 VPN 断开连接时。

首先,使用这两个命令将默认策略设置为拒绝所有流量

sudo ufw default deny outgoing

sudo ufw default deny incoming

接下来,在规则集中添加一个例外,允许您连接到 VPN 服务器。没有这一行,您将无法进行身份验证,您的 VPN 会话将无法成功启动。使用您在前面步骤中记录下来的 VPN 端口、协议和公网 IP 地址

一旦您确定您已获得所需信息,请使用您自己的设置替换我的设置来运行此命令

sudo ufw allow out to 107.152.104.216 port 1194 proto udp

现在您可以通过防火墙连接到 VPN 了,您需要编写一两个规则,强制所有出站流量通过该连接。在本指南中,我假设您的 VPN 使用 tun0 网络设备连接,因为这是默认设置。

如果您需要确认,可以连接到您的 VPN 并再次运行 ip addr | grep inet。您将看到 VPN 连接的附加条目,并且可以从列出的信息中找出您的 VPN 隧道适配器的名称。

一旦您确定知道 VPN 使用哪个网络设备,请运行此命令强制所有出站流量使用 VPN

sudo ufw allow out on tun0 from any to any

可选地,您可能希望允许通过 VPN 传入连接。例如,您可能有一个带有 Web 界面的 BitTorrent 客户端,您需要从 Web 连接到它,或者像 Plex 这样的服务需要通过 VPN 进行入站连接。如果需要,请运行此命令允许入站连接

sudo ufw allow in on tun0 from any to any

执行完最后一个命令后,您的 VPN killswitch 就可以启用了。

启用 UFW

使用您的自定义规则集启用 UFW 非常简单。运行此命令,UFW 将在启动时启动

sudo ufw enable

如果您需要禁用您的 killswitch,可以使用此命令

sudo ufw disable

UFW 会记住您创建的规则集,因此您可以随时启用和禁用防火墙。但请记住,当 UFW 被禁用时,您的互联网流量不保证是加密的。

当然,可以轻松检查 UFW 是否处于活动状态,以及哪些规则正在应用于您的网络。使用此命令检查 UFW 的状态

sudo ufw status

这就是设置 UFW 的全部内容,但我还建议您采取一些额外的步骤,以便更轻松地将 OpenVPN 与 killswitch 一起使用。

配置您的 VPN 自动连接

尽管此步骤是可选的,但除非您自动连接到 VPN,否则设置 killswitch 将没有用。开箱即用的 OpenVPN 出了名的难以配置,但有一些技巧可以简化连接到 VPN。

我推荐以下方法

  • 使用 *.conf 文件而不是 *.ovpn 配置文件将 OpenVPN 作为服务运行
  • 保存您的用户名和密码,以便 OpenVPN 可以自动连接
  • 使用 chmod 锁定您的 VPN 配置

如果您实施了这三个建议,您将能够自动连接到 VPN,并知道您的登录凭据是安全的。您还可以从系统控制台控制您的 VPN 连接,这使得停止和重新启动 VPN 连接变得更加简单。

将 OpenVPN 作为服务运行

大多数人的 VPN 配置都保存为 *.ovpn 文件扩展名。但是,如果您将扩展名更改为 *.conf,并确保文件位于 /etc/openvpn 中,您就可以像管理任何其他系统服务一样管理连接。

将 OpenVPN 连接设置为作为服务运行就像重命名一个文件一样简单。首先,将您现有的 *.ovpn 配置文件移动到 /etc/openvpn (如果它还不在那里)。

然后重命名配置文件,使其具有 *.conf 文件扩展名。在我的例子中,我将 OpenVPN 配置文件保存为 nord-usa.ovpn,因此我将使用以下命令重命名它

sudo mv /etc/openvpn/nord-usa.ovpn /etc/openvpn/nord-usa.conf

重命名后,您可以像管理任何其他 systemd 服务一样启动和停止 OpenVPN。例如,我将使用此命令进行连接

sudo systemctl start openvpn@nord-usa

以及此命令进行断开连接

sudo systemctl stop openvpn@nord-usa

您会注意到 OpenVPN 每次都会提示您输入用户名和密码。这并不理想,但您可以通过保存用户名和密码来解决。

保存您的用户名和密码

在您的 OpenVPN 配置文件中,有一行告诉您的客户端如何进行身份验证。有些组织使用 RSA 密钥,但几乎所有消费者 VPN 都需要用户名和密码。通过对该行进行一次更改,您可以存储您的密码,再也不会被提示登录。

首先打开您的 OpenVPN 配置文件进行编辑。您需要替换为正确的​​文件名,但我使用了此命令

sudo nano /etc/openvpn/nord-usa.conf

滚动直到您找到写着 auth-user-pass 的行,并将其更改为如下所示

auth-user-pass /etc/openvpn/passwd

这会告诉 OpenVPN 在 /etc/openvpn/passwd 中查找您的凭据。您只需要创建该文件并包含您的用户名和密码,OpenVPN 就会自动连接。使用此命令创建文件并打开它进行编辑

sudo nano /etc/openvpn/passwd

结构非常简单,您的用户名在第一行,密码在第二行。确保它看起来像我上面那样,然后按 Ctrl+XY 保存。

现在尝试再次使用此命令进行连接,替换为您配置文件的名称

sudo systemctl start openvpn@nord-usa

您会注意到不再有用户名和密码提示,您的 VPN 会话会立即开始。

锁定配置

任何时候在纯文本文件中存储用户名和密码时,您都应该将其锁定以确保未经授权的用户无法访问。另外,确保相关文件归 root 用户所有也是个好主意。请注意,这代表了最低限度的安全性——对文件进行哈希处理是更好的选择,但这超出了本指南的范围。

要锁定配置,您需要执行以下步骤

  • 更改 /etc/openvpn/passwd 和您的 VPN 配置文件的所有权为 root 用户
  • 更改这两个文件的权限以限制访问

完成后,您的目录列表应如我上面所示。

要更改所有权,您将使用 chown 命令,如下所示,用您的 OpenVPN 配置文件名称替换我的名称

sudo chown root:root /etc/openvpn/nord-usa.conf
sudo chown root:root /etc/openvpn/passwd 

将所有权设置为 root 将阻止用户将权限更改为不安全的设置。正确的权限只允许 root 用户读取文件,而 OpenVPN 作为服务运行时只需要这些权限即可连接。您系统上的其他任何用户都无法看到纯文本凭据。

要更改权限,请使用这些命令

sudo chmod 400 /etc/openvpn/nord-usa.conf
sudo chmod 400 /etc/openvpn/passwd

完成后,使用此命令列出 OpenVPN 目录的内容

ls -la /etc/openvpn/

您将看到所有者现在是 root,并且只有 root 对文件具有读取访问权限。完成锁定文件权限后,就可以设置 OpenVPN 在启动时自动启动了。

自动连接到您的 VPN

剩下要做的就是告诉 systemd 您希望 OpenVPN 在您的计算机启动时进行连接。您可以使用一个命令完成此操作,用您的配置文件名称替换 nord-usa

sudo systemctl enable openvpn@nord-usa

您已完成,OpenVPN 将在每次启动计算机时自动连接。它受到 UFW killswitch 的完全保护,您可以确信您的工作站不会有任何未加密的流量离开网络。

© . All rights reserved.