如何断开OpenVPN连接?

我正在使用VPNBook服务器进行连接,使用这个命令效果很好:
 sudo openvpn --config /etc/openvpn/vpnbook-udp-53.ovpn --auth-user-pass /etc/openvpn/password.txt

但是我似乎无法找到停止它而不重新启动的方法。
我尝试了service openvpn stop/etc/init.d/vpnbook stop,但似乎没有影响。

ifconfig怎么用? - Adam
会是哪一个呢? eth0, lo, tun2, 还是wlan0? - Adam
只需执行以下命令即可:sudo /etc/init.d/network-manager restart - Qasim
我很好奇,如果以这种方式启动VPN,它不会在网络管理器中显示出来吗?我一直只使用网络管理器进行连接和断开操作,目前没有VPN可以测试,但我想知道。 - Dennis
23个回答

这个命令对我来说绝对有效,而且对你也应该有效。
sudo killall openvpn

1在某些构建上可能需要sudo apt-get install psmisc - geotheory
我不得不在Ubuntu 16.04上使用kill -9命令终止它(是的,我知道...) - Gregor
1这会杀掉所有的OpenVPN进程。我有几个进程,只想关闭其中一些。有没有更好的方法? - johannes_lalala
4@johannes_lalala,你可能已经弄清楚了,但这在我的一侧起作用:openvpn3 session-manage --config "$CONFIGURATION_PROFILE_NAME" --disconnect 希望这能帮助到某人。顺便说一下,我是从这个维基页面上找到这个命令的:https://community.openvpn.net/openvpn/wiki/OpenVPN3Linux - Spencer D
@SpencerD 我尝试了一下,得到了 If 'openvpn3' is not a typo you can use command-not-found to lookup the package that contains it, like this: cnf openvpn3. 我还尝试了 openvpn session-manage --config "$CONFIGURATION_PROFILE_NAME" --disconnect(没有 3),但是参数似乎不匹配: Options error: I'm trying to parse "session-manage" as an --option parameter but I don't see a leading '--' Use --help for more information. - Cadoiz
@johannes_lalala 你可以使用 ps 或者 lsof -i 命令来查找所有进程,并且使用 grep 来过滤出包含 openvn 的进程 如此处所建议的。在获得进程ID之后,你可以使用 kill -9 <yourPIDhere> 来终止单个进程。 - Cadoiz
@Cadoiz,听起来你安装的OpenVPN版本与我在评论中提到的版本不同。 - Spencer D

我曾经遇到过与openvpn3断开连接的问题。
最后,我创建了一个小仓库这个小仓库来帮助管理openvpn3会话。
要断开会话,你需要知道会话的路径。
openvpn3 session-manage --session-path $OPENVPN3_SESSION_PATH --disconnect

会话路径可以通过以下方式找到

openvpn3 sessions-list

> -----------------------------------------------------------------------------
>         Path: /net/openvpn/v3/sessions/7a42f37asc8d9s424c8b534sd331d6dd56e8
>      Created: Tue Dec  8 10:44:57 2020                  PID: 9495
>        Owner: shmalex                                Device: tun0
>  Config name: client.ovpn  (Config not available)
> Session name: ***.***.***.***
>       Status: Connection, Client connected
> -----------------------------------------------------------------------------

OPENVPN3_SESSION_PATH=/net/openvpn/v3/sessions/7a42f37asc8d9s424c8b534sd331d6dd56e8
openvpn3 session-manage --session-path $OPENVPN3_SESSION_PATH --disconnect

你可以使用我的存储库来借助bash文件执行相同的操作。

8这是正确答案,也应该被接受。然而,我可以理解为什么带有"kill"命令的答案被赞得很高,我不会责怪他们或投票者,我希望"disconnect"命令真正地成为一个实用的命令。 - 0xc0de
2这确实是正确的答案,谢谢你写那些Bash文件——让生活变得更轻松了! - jonsedar

在我的案例中,成功的步骤包括:
# stop the service    
$ sudo /etc/init.d/openvpn stop

# find the process if it is still running for some reason
$ lsof -i | grep openvpn

# kill the proccess(s) by its PID
$ kill -9 <PID>

# if necessary restart the service again
$ sudo /etc/init.d/openvpn start

由于某种原因,对我来说killall -SIGINT openvpn没有起作用,但上述步骤确实有效。

好的,这是我个人认为最好的答案。终止进程是一种奇怪的方法,但请求停止服务应该能够完成必要的事情。 - Sopalajo de Arrierez
1通常情况下,在尝试中断或以其他方式正常退出之前,不应该使用"kill -9"来终止进程。程序可以捕获中断信号并进行清理操作,但无法捕获信号九(终止信号)。特别是在openvpn的情况下,使用"-9"终止它将不会运行后续脚本,并且很可能会留下无效的路由。理想情况下,您应该使用"kill -SIGINT",然后等待几秒钟让进程结束,只有在此之前进程没有退出时才使用"-SIGTERM" / "-9"。 - dannysauer
仅供参考: "9" 是 SIGKILL,"15" 是 SIGTERM - 请参见 kill -L - Gerd
如何选择性关闭特定的VPN连接? - johannes_lalala
尚未测试,但您可以使用kill -9 $(pidof <进程名称>) - funder7

我偶然发现有两个使用相同配置路径的开放会话。 所以我无法使用
openvpn3 session-manage --disconect --config session-manage: ** ERROR ** 找到多个具有给定配置文件名的会话。
因此,我编写了一个脚本来循环遍历会话(会话ID并不总是与配置路径相同)。
ACTIVE_SESSIONS=$(openvpn3 sessions-list | grep -i 'path' | awk '{p=index($0, ":");print $2}')
echo $ACTIVE_SESSIONS
for instance in $ACTIVE_SESSIONS; do
    openvpn3 session-manage --disconnect --session-path ${instance}
done 

1哇,这真不错! 我已经将第一个命令作为外部工具集成到phpstorm中。顺便说一下,如果我有更多的活动会话,我会使用脚本的!我会保留它,以防万一...做得好! :-) - funder7

如果 sudo killall openvpn 没有完成工作(我遇到过几次),那么一个迅速而致命的解决方案是:
pgrep openvpn | xargs sudo kill -9

3sudo pkill openvpn同样可以完成任务。 - ShahinSorkh


杀死所有的openvpn进程 -SIGINT openvpn openvpn(15360): 操作不允许 openvpn: 未找到进程sudo killall -SICINT openvpn SICINT: 未知信号; killall -l 列出信号列表。 - Adam
1在一个新的终端窗口中,运行命令sudo killall openvpn对我来说起到了作用。 - Adam
@Adam:是SIGINT,不是SICINT - Dzamo Norton
kill和killall命令默认发送SIGTERM信号,文档中称其效果与SIGINT相同。因此,两者都可以等效地使用——如果拼写正确的话。;) - dannysauer

刚刚在您启动OpenVPN的终端中按下CTRL+C

2如果使用了-daemon(后台)标志启动会怎样呢?在这种情况下是不可能的。 - mr-sk
1同时,这会将“tun0”保留为一个接口,因此在运行时无法进行重启,除非重新启动或进行一些系统配置文件编辑。 - Dennis
1如果终端意外关闭了,怎么办? - varun
1@Dennis 在这种情况下,ifconfig tun0 down 会有所帮助。 - gnysek

sudo openvpn3 session-manage --disconnect --config $'client'.ovpn
将client替换为相应的名称。 这将关闭会话。

在运行sudo killall openvpnservice openvpn stop之后,虚拟接口"tun0"仍然保持打开状态并在路由表中引用,因此实际相关的连接会丢失,因为openvpn服务被终止了。
解决方案是在终止openvpn服务后删除这个虚拟连接,因为每次openvpn服务连接时都会创建它。
所以你需要运行以下命令来断开openvpn连接:
$ sudo killall openvpn
$ sudo ip link delete tun0

这是一个简单的一行命令,可以使用 grepcut 轻松获取会话路径。
openvpn3 session-manage --disconnect --session-path $(openvpn3 sessions-list | grep Path | cut -b 15-)

  • 相关问题