通过命令行连接/断开VPN

我在我的Ubuntu机器上设置了两个VPN,一个使用vpnc,另一个使用PPTP。这两个都是使用GNOME网络管理器界面进行设置的,并且运行良好。然而,偶尔我需要远程访问这台机器 - 有没有办法通过命令行连接或断开这些VPN?

这里详细介绍的vpnc命令对您无效吗?此外,这里还有配置和连接PPTP的说明。它们也不起作用吗? - Kris Harper
2个回答

如果你想通过命令行与NetworkManager进行交互,可以使用"nmcli"命令。
列出所有NM连接:`nmcli con`
启动连接(wifi、vpn等):`nmcli con up id 连接名称`
断开连接:`nmcli con down id 连接名称`
(更多nmcli命令请参考nmcli手册)。
请注意,普通用户通常没有权限控制网络。使用上述命令时,加上sudo应该适用于大多数连接,但VPN可能会出现错误:“错误:连接激活失败:没有有效的VPN密码。”
如果发生这种情况,很可能是VPN密码存储在您用户的gnome-keyring中,这使得根用户无法访问。这条评论解释了原因。
要解决此问题,请编辑/etc/NetworkManager/system-connections/ConnectionName,在[vpn]下,将password flags行更改为:
password-flags=0

如果有一行以Xauth password-flags开头的内容,请将其更改。
然后在[vpn]块下面添加以下内容:
[vpn-secrets]
password=YourPassword

(如果在上一步中您更改了行Xauth password-flags,请改为添加Xauth password=...。)
现在通过以下方式重新启动网络管理器:
sudo service network-manager restart

然后使用sudo nmcli con up id ConnectionName启动VPN连接应该没有问题。


2我希望有一个通用的断开连接命令,可以在不指定其ID的情况下断开任何VPN连接。这可能会使得实现此功能(我想要的)更容易。 - Lonnie Best
如果您正在使用IPsec(例如vpnc),您可能还需要在相应的位置添加“IPSec secret-flags=0”和“IPSec secret=<grouppw>”。 - Matt
这个还是没能解决我的问题 :( 我收到了一个错误信息:“错误:连接激活失败:原因未知。” - dano
我收回之前的话...在第三次运行命令后,它成功了。第一次很快失败了。第二次慢慢失败了。第三次成功了! - dano
请注意,id是一个字面值。例如,要启动连接workvpn,您需要输入nmcli con up id workvpn - Rick Mohr
2明文密码?真的吗?有没有人有一个安全的解决方案? - user447607
@ihashacks的解决方案在我使用Ubuntu 16.04上起作用,但是在修改文件后,我不得不执行以下操作:sudo service network-manager restart请将此步骤添加到您的解决方案中作为最后一步。 - tomaszkubacki
顺便说一下:"nmcli c" 输出的内容是相同的。感谢您发布这个。 - DimiDak
这个方法是有效的,但是在断开连接后,VPN的DNS条目仍然位于/etc/resolvd.conf文件的顶部,导致DNS解析出现问题。系统日志会报告类似于dns-sd-resolved[0xblah]: Failed: GDBus.Error:org.freedesktop.resolve1.NoSuchLink: Link 24 not known的错误信息。 - partofthething
在最新的Ubuntu 22.04版本以及之后的版本中,您无需进行任何更改,只需要添加--ask参数,就像这样:nmcli con up id VPNNAME --ask - Hpsaturn

ihashacks回答的 Matt的评论对我来说起作用了...差一点。只需要调整一行代码。
我的密码标记行实际上是这样写的:"Xauth password-flag"。直到我改为以下内容,才能使得被接受的答案对我有效。
[vpn]
...
Xauth password-flag=0
IPSec secret-flags=0

[vpn-secrets]
Xauth password=<my pw> ## This is the one I changed.
IPSec secret=<group pw>

不确定为什么我的VPN连接在每次提到密码之前都有"Xauth"。

3这适用于某些类型的VPN,例如Cisco VPN;对于这些情况非常有帮助!不过有一个错误:正确的密钥是IPSec secret - 否则,NM无法识别。 - Marcus