如何使用Network-Manager自动连接到VPN。

我确实有一个可用的VPN连接。现在我希望当我处于特定无线网络时,这个VPN连接能够自动激活。是否有一种不会干扰的图形方式,可以使用network-manager-applet实现?如果我没记错的话,它曾经起作用,但现在不再有效。

针对这个无线连接,我使其对所有用户都可用,以免每次都输入密码。

所使用的CLI程序是vpnc,并启用了混合认证(兼容思科VPN客户端),来自sroecker的PPA

编辑:由于eduroam的原因,我无法再尝试这些答案了,而且由于没有任何答案获得多数票数,我暂时不选择任何答案,直到有一个得到赞同为止。


你在这方面进展如何? - rlemon
我现在已经很长时间不需要它了。也许四月份入读新大学的时候会用到。 - turbo
可能是重复的问题吗?http://askubuntu.com/questions/86365 - fossfreedom
@fossfreedom 不完全是重复,因为我的问题是关于vpnc而不是openconnect。 - turbo
我写了一篇简短的博客文章,介绍如何在VPN未连接时阻止互联网连接:http://mentat.za.net/blog/2015/01/24/vpn-only-internet/ - Stefan van der Walt
12个回答

由con-f-use建议的解决方案应该有效,但由于一个长期存在的错误,它并不起作用。

https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/280571

有办法可以解决。对于最近的NetworkManager版本,有一个命令行实用工具叫做nmcli,可以编辑并保存为/etc/NetworkManager/dispatcher.d/vpn-up之类的东西。
#! /bin/bash

REQUIRED_CONNECTION_NAME="<name-of-connection>"
VPN_CONNECTION_NAME="<name-of-vpn-connection>"


activ_con=$(nmcli con status | grep "${REQUIRED_CONNECTION_NAME}")
activ_vpn=$(nmcli con status | grep "${VPN_CONNECTION_NAME}")
if [ "${activ_con}" -a ! "${activ_vpn}" ];
then
    nmcli con up id "${VPN_CONNECTION_NAME}"
fi

[我还没有测试过这个,请随意测试并根据结果进行编辑]

请参考: https://wiki.archlinux.org/title/NetworkManager#Use_dispatcher_to_connect_to_a_VPN_after_a_network_connection_is_established 了解更多信息。


请注意,在13.04版本中,我不得不将该脚本放在/etc/network/if-up.d目录下,并根据http://askubuntu.com/questions/198136/error-when-trying-to-connect-to-vpn-on-startup修复/etc/NetworkManager/system-connections/connection-name文件,以避免出现“无有效的VPN密码”错误。 - OlegYch
实际上,Arch Wiki中的黑客方法确实有效! 我在2013年7月11日尝试了Arch Wiki上的脚本,并将其从'nmcli ...'修改为'su [user] -c "nmcli..."'并不起作用!按照wiki上的说明操作,并不要忘记chmod +x;) 祝好! - user174385
Hugo Eden提到的错误(https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/280571)已经在5个月前修复了。然而,我在Precise版本中仍然遇到这个问题... 这是怎么回事? - iGadget
这对我没有用,所以我决定查看/var/log/syslog,并看到以下错误: Mar 4 13:49:51 oleg-HP nm-dispatcher.action: Cannot execute /etc/NetworkManager/dispatcher.d/vpn-up': not executable by owner. 解决方案是sudo chmod 755 /etc/NetworkManager/dispatcher.d/vpn-up`。 - Oleg Belousov

在个人保存的Wi-Fi设置中,您可以在nm-connection-editor图形界面中找到VPN自动连接选项。在Ubuntu 14.04中,您可以在以下位置找到它: 系统设置 -> 网络 -> Wi-FiLan -> 设置(常规选项卡)-> 自动连接到VPN... (自Gnome 42以来,此路径将导致一个新的简化菜单,但完整的菜单仍然可以直接通过nm-connection-editor访问)

Screenshot of GUI

保存后,在配置文件的[connection]部分中添加了一个secondaries=行。它将包含要激活的辅助连接UUID列表。配置文件通常位于/etc/NetworkManager/system-connections/
如果您需要激活多个辅助连接,这些信息可能会很有用。您可以在配置文件中使用;分隔的多个连接UUID。尽管GUI(截至2022年)不允许选择多个条目,但您仍然可以在配置文件中添加多个连接UUID。

这正是我所需要的!虽然非常不直观。我注意到在我的VPN连接配置中,该选项被灰掉了,我没有想到它可能是用于连接到不同连接配置文件的选项。 - B T

我能够在Ubuntu 20.04上使用nm-connection-editor使其工作。由于某种原因,该选项不再出现在Wifi /以太网或VPN配置UI中。
  1. 打开终端

  2. 输入nm-connection-editor

  3. 选择您想要自动连接的网络连接

    Network connections selection window, settings button in red

  4. 单击齿轮图标以打开该连接的设置

  5. 转到“常规”选项卡

  6. 启用“自动连接到VPN”选项,并在右侧的下拉菜单中选择VPN

    Network configuration window, general tab, auto-connect option in red

  7. 点击保存


1太棒了!谢谢你,midopa! - Valentin Bajrami

如果您喜欢终端,您可以使用nmcli,我使用以下命令完成:

首先,找到并打开您要更新的VPN连接

➜  ~ nmcli c show --active |grep vpn
MyVPN           115ae594-aa91-4d13-8c92-421af245f935  vpn     wlp61s0         
➜  ~ nmcli c edit MyVPN

这将打开nmcli提示符,从这里您可以查询和设置值,就像这样:
===| nmcli interactive connection editor |===
...
nmcli> print connection.autoconnect
connection.autoconnect: no
nmcli> set connection.autoconnect yes
nmcli> save persistent
Saving the connection with 'autoconnect=yes'. That might result in an immediate activation of the connection.
Do you still want to save? (yes/no) [yes] yes
Connection 'MyVPN' (115ae594-aa91-4d13-8c92-421af245f935) successfully updated.

并且你应该完成了!

对我来说,只有这个选项有效。顺便说一下,如果你知道它的名称,你可以直接使用grep命令进行搜索,而不需要先连接它,然后再去掉--active参数。 - Ramon Melo

如果我记得没错的话,它曾经工作过一段时间,但现在不再工作了。
这可能很明显,但有时候我没有考虑到。你试过重新安装吗,像这样:
sudo apt-get purge network-manager-vpn sudo apt-get install network-manager-vpnc
然后: enter image description here 现在我希望当我连接到特定的无线网络时,自动激活这个VPN连接。
有一种方法可以抑制“无法连接”类型的消息,当用户连接到错误的网络时,但我忘记了具体是怎么做的。我看不到其他以图形方式自动连接的方法。也许你需要编写一个脚本,在所述的无线局域网中进行连接。
希望对你有所帮助。

我还没有真正开始测试这个。等我测试完了,我会标记为已回答的。保证。 - turbo
根据我的经验,这实际上是行不通的。我相信这是NetworkManager中的一个错误。 - Conor Rynne
3是的,这个出了问题,甚至在 Precise 里也是。它不会自动连接 O_o - eggonlegs
是的--损坏了。不工作(Ubunutu 12.04)。 - user48956

我可以确认这个解决方案对我有效。我正在使用Ubuntu 14.04 LTS。
我点击了关机图标,然后进入系统设置。
当设置界面打开时,我进入了“网络”选项,并选择了我连接的WiFi网络。网络名称旁边有一个小箭头。

Settings screen shot, its in Arabic

点击那个图标,你应该会看到一个叫做“设置”或者“选项”(或类似的名称)的选项在这里:

Click settings

当下一个窗口打开时,只需转到“常规”选项卡,您应该会看到一个选项,让您自动连接到VPN。选择您想要在连接到此WiFi时连接的VPN,然后就大功告成了!每次您连接到这个网络时,Ubuntu也会将您连接到该VPN。 :)
对我来说,它有效。希望对其他人也有效。 不需要任何文本编辑器、代码编辑器或其他任何东西..

你不再需要任何调度脚本了!在14.04(Trusty Tahr)中,只需在NetworkManager GUI中设置自动连接选项后,按照以下步骤进行操作。
将vpn-secrets明文存储在VPN连接的配置文件中,路径为/etc/NetworkManager/system-connections/YourVPNConnectionName
您可以通过在配置文件中设置IPSec secret-flags=0Xauth password-flags=0来实现此目的。然后转到NetworkManager GUI并再次保存您的VPN连接设置。现在,配置文件中应该存在一个名为[vpn-secrets]的部分。请仔细检查它,自动连接现在应该正常工作!

你可以通过在主要连接的“secondaries”字段中添加VPN配置文件的uuid来实现。
例如,/etc/NetworkManager/system-connections/Wired
[connection]
id=Wired
uuid=95ad54f8-9d72-3e65-a4a7-b106aa310eed
type=ethernet
secondaries=66ecf287-8b26-413b-86f2-caca7608bc67;

参考 https://developer.gnome.org/NetworkManager/stable/nm-settings.html


尽管man页面列出nmcli con status作为一个有效的命令,但是由Hugo Heden提供的上述解决方案返回了一个错误"Error: Object 'status' is unknown, try 'nmcli help'"
我正在使用nmcli 1.2.2 (nmcli -v),并且我已经测试和修改了以下内容/etc/NetworkManager/dispatcher.d/vpn-up,它完美地工作。
#! /bin/bash

REQUIRED_CONNECTION_NAME="<name-of-connection>"
VPN_CONNECTION_NAME="<name-of-vpn-connection>"


default_conn=$(nmcli con show --active | grep "${REQUIRED_CONNECTION_NAME}")
vpn_conn=$(nmcli con show id | grep "${VPN_CONNECTION_NAME}")
if [ "${default_conn}" -a ! "${vpn_conn}" ];
then
    nmcli con up id "${VPN_CONNECTION_NAME}"
fi

注意:您可以使用nmcli con show命令查看所有连接名称,因为它们并不总是与网络连接图形界面中列出的名称相同。

用户正在询问有关Ubuntu的问题。 - fosslinux
Kali和Ubuntu都是基于Debian的,所以解决方案通常是相同的。我刚刚在一个Ubuntu 15.10实例上进行了测试,nmcli错误与我之前提到的一样。解决方案也同样有效。安装在15.10版本上的nmcli版本是1.0.4。 - jw00druff

使用以下Python脚本Gist #1547663
脚本的第一个参数是NetworkManager中VPN连接的名称,第二个参数是以逗号分隔的应该被忽略的网络名称(例如,在家中使用VPN连接是无用的)。
安装并在启动时运行的示例:
git clone git://gist.github.com/1547663.git /home/user/autovpn/
echo "python /home/user/autovpn/autovpn.py 'myvpn' 'Auto homenetwork,Auto worknetwork' > /var/log/autovpn.log&" > /etc/rc.local
/etc/rc.local

现在,如果您连接到一个网络(无论是wifi还是以太网),它也会尝试建立VPN连接。

1我认为这种方法不够优雅,因为它需要一直运行一个后台进程,而可以像@hugoheden的回答中那样采用事件驱动的方式。 - gertvdijk
它做得比他的回答更多:它还处理 VPN 重新连接以及用户手动禁用 VPN 连接的情况(这意味着在那种情况下它不应尝试重新连接 VPN)。 - iElectric