关闭终端窗口并不等于关闭隧道,杀死进程也不等于停止服务。在 Linux 上,真正断开连接的命令取决于是哪个组件启动了连接,从而拥有它的生命周期。下面的比较涵盖你最可能遇到的四种安排,以及每一种所需的标识符。

前台客户端与守护进程客户端

在终端里手动启动的客户端属于那个终端。Ctrl+C 会发送中断,客户端拆掉自己的接口,隧道随之结束。不需要再通知别的什么。

通过 shell 包装器启动并留在后台的客户端不属于任何特定对象,而这正是人们伸手去拿 killall 的场景。先找到进程,确认它的命令行提到了你想要的那个配置文件,然后发送正常的终止信号。被其监督者监管的进程如果在监督者之下被杀掉,只会被重新启动,所以识别所有者比选择信号更重要。只有在你确认没有其他隧道共享该进程组时,才向进程组发送信号。

SIGUSR1 不是断开连接;它要求客户端重新启动隧道。

systemd 实例

当某个 unit 拥有连接时,要停止的对象就是该 unit。像 openvpn-client@office 这样的模板实例带有配置文件名,停止模板目标而不是实例,可能会影响主机上的每一个客户端。

systemctl list-units 'openvpn-client@*'
systemctl stop [email protected]

当你不确定实例加载了哪个配置文件时,请阅读该 unit 的 ExecStart。

已启用的 unit 会在下次启动时回来,这与现在停止它是两个不同的决定。只有在决定连接不应再回来之后才禁用它,并把这一决定记录在下一任管理员能找到的地方。

NetworkManager 配置文件

由 NetworkManager 管理的配置文件不是你能够发送信号的进程。管理器拥有生命周期,要操作的对象是活动连接,它由 UUID 而不是显示名称来标识。先读取活动列表,还能看出是否有第二条隧道在你没预料到的名字下运行。

nmcli connection show --active
nmcli connection down uuid actual-uuid

显示名称会重复,而配置文件文件的名称并不是它的标识符,所以请从列表中复制 UUID。如果连接立刻回来,说明有东西正在激活它:基础连接上的 secondaries 条目、dispatcher 脚本,或自动连接标志。停止管理器的连接是正确的第一步,而重新激活则是下一个问题。不要为了阻止重新激活而删除配置文件,因为那也会删掉你明天可能需要的凭据。

管理器的命令参考文档说明了 down 目标是如何选择的。

OpenVPN 3 会话

OpenVPN 3 Linux 采用会话模型,而不是每个隧道一个进程。你查看服务已知的会话,然后针对某一个会话路径进行操作。路径就是标识符,它不能与配置名称互换。

openvpn3 sessions-list
openvpn3 session-manage --path /net/openvpn/v3/sessions/... --disconnect

断开每一个会话是另一种操作,应当是经过考虑的。

同一台主机可能保存多个用户的会话,所以在操作之前先列出清单,并确认你即将结束的那个会话的所有者。

之后要验证什么

在上述任何一种停止之后,检查三件事:活动连接列表中不再包含该隧道,接口已经消失,针对内部地址的路由查找不再选中隧道设备。然后决定下次启动时会发生什么。

ip -brief address
ip route get 10.8.0.1

手动删除接口并不能停止所有者,而且会让清理只做了一半。

现在断开、阻止下一次自动启动、以及之后允许非 VPN 流量,是三个彼此独立的选择。请把每一个都明确下来。

相关文章