大家可能都听说过针对 VPN 的 Tunnelvision 攻击。基本上,它是这样的:恶意 LAN 中的攻击者滥用 DHCP 选项 121 在 VPN 用户的系统上设置比大多数 VPN 使用的路由更具体的路由。通过滥用此选项,本地网络上的攻击者可以设置优先级高于目标 VPN 创建的虚拟网络接口路由的路由规则。因此可以窃听目标计算机。
那么解决方案是什么呢?
一种方法是忽略 DHCP 选项 121,但更好的办法可能是实施“VPN 终止开关” - 阻止所有互联网活动,除非,它将前往 VPN 服务器。
以下是我的脚本。首先运行这个(只有一次):
MyVPN="xx.xx.xx.xx"
sudo ufw default deny incoming
sudo ufw default deny outgoing
# If you are using default OpenVPN istallation on 1194/UDP:
sudo ufw allow out to $MyVPN port 1194 proto udp
# If you are using OpenVPN on 443/TCP:
sudo ufw allow out to $MyVPN port 443 proto tcp
# If you are using default Wireguard installation on 451194/UDP:
sudo ufw allow out to $MyVPN port 51194 proto udp
# Assuming OpenVPN uses tun0 interface:
sudo ufw allow out on tun0 from any to any
# Assuming Wireguard uses wg0 interface:
sudo ufw allow out on wg0 from any to any
# If we want to allow connections from VPN network to our computer (again, OpenVPN - tun0, Wireguard - wg0)
sudo ufw allow in on tun0 from any to any
sudo ufw allow in on wg0 from any to any
# Enable UFW
sudo ufw enable
现在“VPN 终止开关”已打开。
如果你想把它离开:
sudo ufw default allow outgoing
如果你想扭转局面在:
sudo ufw default deny outgoing
(您可以在 OpenVPN 或 Wireguard 的“post up”/“post down”命令中使用这些命令)。因此,当您的 VPN 连接建立时,会自动打开开关。
现在,存在几个问题。
1.这很有效,但在我打开开关后,NetworkManager 的 WiFi 图标(我正在使用 WiFi 连接到计算机上的 LAN)显示我未连接到互联网。为什么,因为wlp3s0
网络接口(我的 WiFi)正在尝试连接到connectivity-check.ubuntu.com
。并且它被“VPN 终止开关”阻止。请注意,如果我connectivity-check.ubuntu.com
从终端 ping,则连接已建立,但这是因为终端使用了tun0
/wg0
接口。
现在的问题是,UFW 无法允许(或阻止)与域(FQDN)的连接,但可以允许(或阻止)与 IP 地址的连接。并且connectivity-check.ubuntu.com
有一个始终在变化的 IP 地址池。
一个快速而粗糙的解决方案是使用/etc/hosts
文件,但是如果 Canonical 更改其服务器的 IP 地址怎么办?
因此,一个选择是将所有流量从wlp3s0
VPN(tun0
/wg0
接口)重定向。
我的问题是:
- 怎么做?
wlp3s0
如果我从接口重定向所有流量,是否会出现严重的缺点?
2.我读到过,允许某些连接wlp3s0
(和其他本地接口)是明智之举。例如 DHCP 和类似协议。
所以我的问题是:如何仅在特定的本地接口上允许 DHCP 协议?
顺便说一句,Android 有一个非常好的功能,称为“阻止不使用 VPN 的连接”。不幸的是,Ubuntu 没有这样的设置。有没有计划实现这个功能?是否有一些 GUI 应用程序已经实现了这个“终止开关”?