使VPN在连接断开时自动重新连接


13

我在Mac OS X 10.7.3上使用内置的VPN。是IPSec,FWIW。它有时会断开连接(可能是我的公司服务器出现问题)。有没有办法让它自动重新连接?有时我一会儿没注意到,这很烦人。

Answers:


9

您可以使用以下AppleScript,将其另存为应用程序并将其设置为代理(没有停靠图标)。

如果没有,此脚本将建立VPN连接。因此,它也应该在连接断开后不久重新连接。您可以更改检查VPN连接的间隔,脚本中为120秒。

on idle
    tell application "System Events"
        tell current location of network preferences
            set myConnection to the service "VPN University"
            if myConnection is not null then
                if current configuration of myConnection is not connected then
                    connect myConnection
                end if
            end if
        end tell
        return 120
    end tell
end idle

我已经在这个答案中解释了如何设置它。


Can’t get «class svce» "MyVPN" of «class locc» of «class netp» of application "System Events". System Events got an error: Can’t get service "MyVPN" of current location of network preferences. (-1728)
菲尔·皮罗

这不适用于IKEv2 VPN。这是您可以执行的操作:matt.coneybeare.me/…-service-on-your-mac /
起来,conyybeare

8

我对提供的答案进行了一些更改,因为如果某件事值得做,那么就值得深入研究。如果VPN掉线,我想重新连接,但如果VPN故意断开连接,则不希望重新连接。我想出的解决方案既有效又微不足道。

首先,我在pppd启动和关闭中添加了挂钩,以跟踪所需的VPN状态。这些文件应归root所有,并具有世界范围的读/执行权限(sudo chmod 755 /etc/ppp/ip-*)。

/ etc / ppp / ip-up:

#!/bin/sh
echo true > /var/run/reconnect_vpn
chmod 644 /var/run/reconnect_vpn

/ etc / ppp / ip-down:适用于OS X 10.9.5及更低版本

#!/bin/sh
tail /var/log/ppp.log | grep '\[DISCONNECT\]'
if [ $? == 0 ] ; then
echo false > /var/run/reconnect_vpn
fi

/ etc / ppp / ip-down:适用于OS X 10.10及更高版本

#!/bin/sh
tail /var/log/ppp.log | grep '\[TERMINATE\]'
if [ $? == 0 ] ; then
echo false > /var/run/reconnect_vpn
fi

然后通过修改上面的AppleScript,我能够检查'/ var / run / reconnect_vpn'状态变量以确定是否恢复VPN:

on idle
    tell application "System Events"
        tell current location of network preferences
            set myConnection to the service "VPN"
            set startOnLogin to true
            local doReconnect
            try
                set doReconnect to (do shell script "cat /var/run/reconnect_vpn")
            on error errMsg
                set doReconnect to startOnLogin
            end try
            if myConnection is not null and doReconnect then
                if current configuration of myConnection is not connected then
                    connect myConnection
                end if
            end if
        end tell
        return 120
    end tell
end idle

和以前一样,将线路更改为set myConnection to the service "VPN"您的VPN所需要的名称。另外,启动时'reconnect_vpn'文件不存在,因此当找不到该文件时,我添加了一个布尔值(startOnLogin)作为默认值。我喜欢立即开始,但如果您不这样做,则将其更改为false。

我有一种感觉,如果您是那种非常喜欢VPN行为的人,那么您也是喜欢摸索直到找到解决方案的人,因此这个答案没有听众。但以防万一,这是。希望它能帮助到别人。


这不适用于IKEv2 VPN。您可以按照以下方法进行操作:matt.coneybeare.me/…-service-on-your-mac /
起来

4

有一个名为VPN自动连接的应用程序(Mac App Store链接)。0.99美元。

一旦启动,它就会出现在您的菜单栏中。当您使用它打开“ VPN”时,它将监视您在OS X的“网络”偏好设置窗格中设置的VPN连接配置文件,并确保始终保持连接状态。VPN Auto-Connect的菜单栏图标提供了您已定义的所有VPN连接的列表,并让您选择始终连接到哪个。


欢迎询问不同!约翰,谢谢您的回答!您可以添加有关链接到的应用程序的更多信息吗?它如何回答这个问题?OP需要哪些特定功能使其成为应用程序?
daviesgeek

VPN自动连接可与IKEv2 VPN一起使用。您可以按照以下方法进行操作:matt.coneybeare.me/…-service-on-your-mac /
起来

0

新的选项是AppStore上可用的VPN Monitor。它允许进行更多自定义,例如自动登录,通过VPN连接循环等等。至少需要OS X 10.9 Mavericks。


0

脚本自动重新连接任何已删除的VPN服务。

我一直在使用rjarvis2010解决方案,但对此不太满意。

我连接了许多不同的VPN服务,因此我想要一个脚本,该脚本可以自动重新连接我连接到的任何VPN。

on idle
    tell application "System Events"
        tell location "Uni" of network preferences
            -- keep checking for VPN name until a VPN is connected
            set empty to true
            repeat until empty is false
                try
                    -- set variable "myVPN" to the name of the service that is connected and is a VPN
                    set myVPN to get name of first service whose (kind is greater than 11 and kind is less than 17) and connected of current configuration is true
                    set empty to false
                on error
                    set empty to true
                    delay 15
                end try
            end repeat

            -- doReconnect is a file that reads from the ppp.log and contains "true" by default, "false" if the vpn service was manually disconnected recently
            local doReconnect
            set doReconnect to (do shell script "cat /var/run/reconnect_vpn")

            repeat while doReconnect contains "true"
                set ConfProp to get current configuration of service myVPN
                if connected of ConfProp is false then
                    delay 1
                    set doReconnect to (do shell script "cat /var/run/reconnect_vpn")
                    if doReconnect contains "true" then
                        try
                            connect service myVPN
                        on error errorMessage
                        end try
                    else
                        exit repeat
                    end if
                end if
                delay 5
            end repeat
        end tell
    end tell
    return 1
end idle

为了使其适合您,您需要更换

  • Uni 无论您的位置名称是什么

完成后,将其另存为应用程序并将其放置在“登录项”中,一切就很好了。

此外,这是非常重要的,你需要建立PPP钩子描述rjarvis2010解决方案

另外,我建议您不要尝试同时连接多个VPN。要停止此脚本,您可能需要通过活动监视器强制退出它(因为重复循环不允许它有时不接收外部输入)。


0

我正在使用不同的方法来保持我的VPN连接有效。这涉及到launchd运行一个非常简单的守护程序,该守护程序允许在没有任何用户登录的情况下保持VPN连接(这也避免了从睡眠模式恢复时VPN断开弹出窗口)。

launchd从终端创建一个plist文件:

sudo nano /Library/LaunchDaemons/my.vpn.connector.plist

并输入以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <dict>
        <key>NetworkState</key>
        <true/>
    </dict>
    <key>Label</key>
    <string>my.vpn.connector</string>
    <key>ProgramArguments</key>
    <array>
        <string>bash</string>
        <string>-c</string>
        <string>(test $(networksetup -showpppoestatus MyVPN) = 'disconnected' &&  ping -o my.vpn.server.url && networksetup -connectpppoeservice MyVPN) ; sleep 10</string>
    </array>
</dict>
</plist>

您可以使用以下命令启动守护程序并进行测试:

launchctl load /Library/LaunchDaemons/my.vpn.connector.plist

这样,您就有一个为所有用户运行的守护程序,仅当互联网连接可用时才尝试连接。此外,重新建立互联网连接后,VPN会自动重新连接…

编辑:

我发现此方法最可靠,因为它允许在用户登录之前自动建立VPN连接(对服务器有用)。

优胜美地(OSX 10.10)的更新

    <key>KeepAlive</key>
    <dict>
        <key>NetworkState</key>
        <true/>
    </dict>

在优胜美地折旧。您可以改用以下内容

    <key>KeepAlive</key>
    <true/>

networksetup -connectpppoeservice MyVPN

在优胜美地不再可用。您可以改用它

scutil --nc start MyVPN

scutil --nc list没有列出我的VPN连接,该连接可以通过网络设置看到并可以连接。
菲尔·皮罗

@philpirozhkov这不适用于IKEv2 VPN。您可以按照以下方法进行操作:matt.coneybeare.me/…-service-on-your-mac /
起来

0

我看到这里有一些使用登录挂钩的答案,在较新版本的OS X中已弃用了这些挂钩,而使用了启动代理和启动守护程序。

我创建了一个脚本和启动代理。代理每30秒调用一次Shell脚本,并尝试ping VPN网络上静态的IP地址。如果无法ping通该IP,则启用您的vpn连接。

如果您通过Apple Script App执行此操作,则该应用程序图标将始终在您的扩展坞中。我更喜欢让它在后台自动运行。

克隆下面的项目,并按照自述文件中的说明进行操作。最终结果是一个安装程序包,该程序包会将启动代理plist文件放在/ Library / LaunchAgents /中,并将外壳程序脚本放在/ Library / Application Support / melonsmasher /中。

确保使用您的VPN连接名称和VPN网络上的IP地址编辑shell脚本(auto-vpn)。您可以在plist文件(com.melonsmasher.autovpn.plist)中更改运行间隔。

https://github.com/MelonSmasher/OSX-AutoVPN


-2

AppleScripts的优点在于您几乎可以用它做任何事,而且它是免费的,缺点是它们通常反应不灵敏(以固定的时间间隔轮询),并且缺少本机MAC OS X应用程序可以拥有的功能。一个不错的新的VPN自动重新连接应用程序是应用商店中的“ VPN Monitor”,它可以在VPN连接断开时立即重新连接,如果首选服务关闭,则可以重新连接到其他VPN服务,在启动时就可以连接,跟踪您的停机时间,并使用最少的系统资源在后台作为状态栏应用程序运行。VPN监控器


2
请看一下常见问题,尤其是关于自我促进
nohillside
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.