Получение VPN для автоматического переподключения при обрыве соединения

13

Я использую встроенный VPN на Mac OS X 10.7.3. Это IPSec, FWIW. Время от времени он отключается (вероятно, проблема с моим корпоративным сервером). Есть ли способ заставить его автоматически переподключаться? Иногда я не замечаю какое-то время, что немного раздражает.

Эндрю Ферье
источник

Ответы:

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

Я объяснил, как настроить это в этом ответе .

gentmatt
источник
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 /
coneybeare
8

Я внес некоторые изменения в предоставленный ответ, потому что если что-то стоит делать, это стоит делать в землю. Я хотел переподключиться, если VPN был сброшен, но НЕ переподключаться, если VPN был преднамеренно отключен. Решение, которое я придумал, было эффективным и не элегантным.

Сначала я добавил хуки для запуска и завершения работы pppd, чтобы отслеживать желаемое состояние VPN. Эти файлы должны принадлежать пользователю root и иметь мировые разрешения на чтение / выполнение ( sudo chmod 755 /etc/ppp/ip-*).

/ И т.д. / ррр / ф-до:

#!/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. Кроме того, при запуске файл «connect_vpn» не существует, поэтому я добавил логическое значение (startOnLogin), которое будет использоваться по умолчанию, когда файл не может быть найден. Мне нравится начинать немедленно, но если вы этого не сделаете, измените его на false.

У меня есть ощущение, что если вы относитесь именно к поведению VPN, то вы также относитесь к тому, кто любит возиться, пока не найдет решение, и поэтому у этого ответа нет аудитории. Но на всякий случай вот оно. Надеюсь, это кому-нибудь поможет.

rjarvis2010
источник
Это не будет работать с IKEv2 VPN. Вот как вы можете это сделать: matt.coneybeare.me/… -service-on-your-mac /
coneybeare
4

Есть приложение, которое называется VPN Auto-Connect (ссылка на Mac App Store). Это 0,99 $.

После запуска он живет в строке меню; когда вы используете его для включения VPN, он будет отслеживать профиль VPN-подключения, который вы настроили на панели сетевых настроек OS X, и следить за тем, чтобы вы всегда оставались подключенными к нему. Значок строки меню VPN Auto-Connect предоставляет список всех определенных вами VPN-подключений и позволяет выбрать, к какому из них всегда подключаться.

Джон
источник
Добро пожаловать, чтобы спросить другого! Спасибо за ваш ответ, Джон! Можете ли вы добавить больше информации о приложении, на которое вы ссылались? Как это отвечает на вопрос? Какие особенности делают это приложение необходимым ОП?
daviesgeek
VPN Auto-Connect работает с IKEv2 VPN. Вот как вы можете это сделать: matt.coneybeare.me/… -service-on-your-mac /
coneybeare
0

Новая опция - VPN Monitor, доступный в AppStore. Это позволяет выполнять больше настроек, таких как автоматический вход в систему, циклическое подключение через VPN-соединения и т. Д. Требуется как минимум OS X 10.9 Mavericks.

N1000
источник
0

Сценарий автоматического переподключения любого сброшенного сервиса VPN.

Я использовал rjarvis2010 «s решение , но я был не совсем доволен.

У меня много разных 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 «s решение

Кроме того, я бы рекомендовал вам не пытаться подключать несколько 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 перед входом пользователя (полезно для серверов).

Обновления для Yosemite (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 /
coneybeare
0

Я видел, что здесь есть несколько ответов, использующих хуки входа в систему, которые не рекомендуются в новых версиях OS X в пользу Launch Agent и Launch Daemons.

Я создал скрипт и запустил агент. Агент вызывает сценарий оболочки каждые 30 секунд и пытается пропинговать статический IP-адрес в сети vpn. Если это не может пропинговать тот IP, это включает Ваше соединение vpn.

Если вы сделали это через приложение Apple Script, значок приложения всегда будет в вашей док-станции. Я предпочитаю, чтобы это работало автоматически в фоновом режиме.

Клонируйте проект ниже и следуйте инструкциям в файле readme. Конечным результатом является установочный пакет, который поместит файл plist агента запуска в / Library / LaunchAgents / и скрипт оболочки в / Library / Application Support / melonsmasher /.

Обязательно отредактируйте сценарий оболочки (auto-vpn), указав имя VPN-подключения и IP-адрес в сети VPN. Вы можете изменить интервал выполнения в файле plist (com.melonsmasher.autovpn.plist).

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

almyz125
источник
-2

Прелесть AppleScripts в том, что вы можете делать с ней практически все, и это бесплатно, недостатком является то, что они обычно не очень отзывчивы (опросы через фиксированный интервал времени) и не имеют функций, которые могут иметь только собственные приложения MAC OS X. Хорошее и новое приложение для автоматического переподключения VPN - это «Монитор VPN» в магазине приложений, оно мгновенно переподключается в момент разрыва VPN-соединения, может повторно подключиться к другой службе VPN, если предпочтительная служба не работает, подключается при запуске, отслеживает время простоя и использует минимум системных ресурсов для запуска в фоновом режиме в качестве приложения строки состояния. VPN-монитор

Jos
источник
2
Пожалуйста, посмотрите FAQ, особенно часть о саморекламе
nohillside