У меня есть RaspberryPi в доме моих родителей с PiVPN, настроенным и настроенным для предоставления личного VPN-сервиса мне и нескольким друзьям. Этот VPN работал безупречно с самого начала, я использовал его на своем ПК и никогда не получал ошибок.
Недавно я установил еще один компьютер с Windows10 в доме моих родителей, чтобы он работал в качестве сервера для различных целей (если это связано с этой проблемой, я использую его как домашний мультимедийный сервер с Plex Media Server, а также как репозиторий Git. для личного пользования). Мне нужно, чтобы он автоматически подключался к VPN, поэтому я сделал следующее:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
, и эта прямая ссылка содержала этот аргумент "C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect ServerW10.ovpn
Я настроил серверную BIOS на автоматическую загрузку при возобновлении подачи переменного тока (чтобы сервер снова загружался, если электричество отключилось), а также настроил его для автоматического входа в систему под пользователем, которого я создал при установке Win10. Таким образом, мы надеемся, что сервер всегда будет авторизован при каждом включении.
Поскольку меня беспокоит энергопотребление в доме моих родителей, я настроил этот сервер так, чтобы он спал после 3 часов бездействия (настройки Windows 10) и всегда спал (с помощью пакетного скрипта) при достижении 2 утра.
Из-за автоматического спящего режима я настроил BIOS на прием пакетов Wake-on-LAN для пробуждения сервера. Я тестировал это несколько раз, и он отлично работал. Таким образом, я мог разбудить сервер, когда мне нужно, на 3 часа (достаточно для моих целей).
Я потратил несколько дней на тестирование сервера: переводил его в спящий режим вручную, позволял ему спать после 3 часов бездействия, принудительно завершал работу и т. Д., И OpenVPN всегда работал нормально и без проблем переподключался.
Теперь проблема возникла, когда я тестировал VPN-соединение с сервером после "сна в 2 часа ночи". Я разбудил сервер, а затем попытался пропинговать его, как обычно, с его статическим IP-адресом VPN, но не смог связаться с ним. Я вошел в систему через TeamViewer, чтобы проверить, что происходит, и когда я открыл графический интерфейс OpenVPN, я обнаружил, что он застрял в таком цикле:
Thu Mar 01 10:26:28 2018 OpenVPN 2.4.4 x86_64-w64-mingw32 [SSL (OpenSSL)] [LZO] [LZ4] [PKCS11] [AEAD] built on Sep 26 2017
Thu Mar 01 10:26:28 2018 Windows version 6.2 (Windows 8 or greater) 64bit
Thu Mar 01 10:26:28 2018 library versions: OpenSSL 1.0.2l 25 May 2017, LZO 2.10
Thu Mar 01 10:26:29 2018 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Thu Mar 01 10:26:29 2018 TCP/UDP: Preserving recently used remote address: [AF_INET](my ip):(my port)
Thu Mar 01 10:26:29 2018 UDP link local: (not bound)
Thu Mar 01 10:26:29 2018 UDP link remote: [AF_INET](my ip):(my port)
Thu Mar 01 10:27:29 2018 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Thu Mar 01 10:27:29 2018 TLS Error: TLS handshake failed
Thu Mar 01 10:27:29 2018 SIGUSR1[soft,tls-error] received, process restarting
Thu Mar 01 10:27:34 2018 TCP/UDP: Preserving recently used remote address: [AF_INET](my ip):(my port)
Thu Mar 01 10:27:34 2018 UDP link local: (not bound)
Thu Mar 01 10:27:34 2018 UDP link remote: [AF_INET](my ip):(my port)
Thu Mar 01 10:28:34 2018 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Thu Mar 01 10:28:34 2018 TLS Error: TLS handshake failed
etc...
Я протестировал VPN на своем ПК и работает нормально, так что лучше всего, что это ошибка сервера.
Я лично думаю, что, возможно, это имеет какое-то отношение к пакетному сценарию, который я создал и запрограммировал для запуска в 2 часа ночи, чтобы перевести компьютер в режим сна в 2 часа ночи, потому что у меня не было проблем с другими методами сна (ручной сон и режим бездействия). Пакетный сценарий выглядит так:
rundll32.exe powrprof.dll,SetSuspendState 0,1,0
Я использовал этот сценарий, потому что видел учебник о том, как создать для этого пакетный сценарий. Как говорилось в этом руководстве, я также выполнил следующую команду, чтобы перейти в спящий режим вместо гибернации:
Powercfg -H OFF
В чем может быть проблема?
Я наконец исправил это, хотя у меня было 2 проблемы в моей настройке.
Прежде всего, «Настройка VPN» имела одну проблему: сервер OpenVPN (RaspberryPi с PiVPN) находился в той же подсети, что и серверный компьютер.
Файл конфигурации .ovpn указывал на мой личный DNS, поэтому серверный компьютер, чтобы подключиться к VPN RaspberryPi, должен был достичь DNS, а затем достичь моего RaspberryPi через общедоступный IP-адрес маршрутизатора моих родителей (который я связал с моим маршрутизатором) . Это проблема, потому что весь трафик VPN перенаправляется через фиксированный порт UDP на локальный IP-адрес RaspberryPi, что означает, что ответы RaspberryPi, отправленные на серверную машину, когда они прибыли на маршрутизатор, они попали в RaspberryPi из-за на перенаправленный UDP-порт, поэтому серверная машина так и не получил ответа.
Я исправил это, открыв файл .ovpn и изменив строку, содержащую целевой URL, для подключения к VPN из этого:
remote my.personal.dns {port_number}
к этому
remote {local_raspberry_pi_IP} {port_number}
Кроме того, в сценарии сна были какие-то ошибки с настройкой OpenVPN, и я не совсем уверен, почему, но я думаю, что это как-то связано с отключением гибернации. Я загрузил Microsoft PsTools и сделал новый скрипт, чтобы перевести компьютер в спящий режим в 2 часа ночи. Новый скрипт выглядит так C:\{path_where_pstools_was_extracted}\PsTools\psshutdown.exe -d -t 0 -accepteula
Благодаря этим модификациям сервер теперь, наконец, работает должным образом.