Ошибки при соединении к OpenVPN-сети в Mac OS X/OS X/macOS через Tunnelblick



1. Ошибка выполнения скрипта "client.up.tunnelblick.sh" в Tunnelblick на Mac OS X/OS X/macOS

1. Ошибка выполнения скрипта "client.up.tunnelblick.sh"


Ошибка возникает при соединении с OpenVPN-цепью. Особенностью ошибки является тот факт, что Tunnelblick успешно подключается к VPN-серверу, однако, скрипт, выполняющий роль коллбека после подключения, завершается с ошибкой. Журнал подключения при этом выглядит примерно следующим образом.
/Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh -9 -d -f -m -w -ptADGNWradsgnw utun0 1500 1555 10.110.0.3 255.255.255.0 init
*Tunnelblick: **********************************************
*Tunnelblick: Start of output from client.up.tunnelblick.sh
*Tunnelblick: Retrieved from OpenVPN: name server(s) 45.77.66.120 45.76.3.244 ], search domain(s) ] and SMB server(s) ] and using default domain name openvpn ]
*Tunnelblick: WARNING: Ignoring ServerAddresses '45.77.66.120 45.76.3.244' because ServerAddresses was set manually and '-allowChangesToManuallySetNetworkSettings' was not specified
*Tunnelblick: Setting search domains to 'openvpn' because the search domains were not set manually (or are allowed to be changed) and 'Prepend domain name to search domains' was not selected
*Tunnelblick: Saved existing DNS servers from networksetup
*Tunnelblick: Saved existing search domains from networksetup
/Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh: line 317: 6565 Trace/BPT trap: 5 scutil > /dev/null <<-EOF
open
# Store our variables for the other scripts (leasewatch, down, etc.) to use
d.init
# The '#' in the next line does NOT start a comment; it indicates to scutil that a number follows it (as opposed to a string or an array)
d.add PID # ${PPID}
d.add Service ${PSID}
d.add LeaseWatcherPlistPath "${LEASEWATCHER_PLIST_PATH}"
d.add RemoveLeaseWatcherPlist "${REMOVE_LEASEWATCHER_PLIST}"
d.add ScriptLogFile "${SCRIPT_LOG_FILE}"
d.add MonitorNetwork "${ARG_MONITOR_NETWORK_CONFIGURATION}"
d.add RestoreOnDNSReset "${ARG_RESTORE_ON_DNS_RESET}"
d.add RestoreOnWINSReset "${ARG_RESTORE_ON_WINS_RESET}"
d.add IgnoreOptionFlags "${ARG_IGNORE_OPTION_FLAGS}"
d.add IsTapInterface "${ARG_TAP}"
d.add FlushDNSCache "${ARG_FLUSH_DNS_CACHE}"
d.add ResetPrimaryInterface "${ARG_RESET_PRIMARY_INTERFACE_ON_DISCONNECT}"
d.add RouteGatewayIsDhcp "${bRouteGatewayIsDhcp}"
d.add bAlsoUsingSetupKeys "${bAlsoUsingSetupKeys}"
d.add TapDeviceHasBeenSetNone "false"
d.add TunnelDevice "$dev"
d.add RestoreIpv6Services "$ipv6_disabled_services_encoded"
d.add NetworkSetupRestorednsserversInfo "$network_setup_restore_dns_info"
d.add NetworkSetupRestoresearchdomainsInfo "$network_setup_restore_searchdomains_info"
set State:/Network/OpenVPN
# Back up the device's current DNS and SMB configurations,
# Indicate 'no such key' by a dictionary with a single entry: "TunnelblickNoSuchKey : true"
# If there isn't a key, "TunnelblickNoSuchKey : true" won't be removed.
# If there is a key, "TunnelblickNoSuchKey : true" will be removed and the key's contents will be used
d.init
d.add TunnelblickNoSuchKey true
get State:/Network/Service/${PSID}/DNS
set State:/Network/OpenVPN/OldDNS
d.init
d.add TunnelblickNoSuchKey true
get Setup:/Network/Service/${PSID}/DNS
set State:/Network/OpenVPN/OldDNSSetup
d.init
d.add TunnelblickNoSuchKey true
get State:/Network/Service/${PSID}/SMB
set State:/Network/OpenVPN/OldSMB
# Initialize the new DNS map via State:
${SKP_DNS}d.init
${SKP_DNS}${SKP_DNS_SA}d.add ServerAddresses * ${FIN_DNS_SA}
${SKP_DNS}${SKP_DNS_SD}d.add SearchDomains * ${FIN_DNS_SD}
${SKP_DNS}${SKP_DNS_DN}d.add DomainName ${FIN_DNS_DN}
${SKP_DNS}set State:/Network/Service/${PSID}/DNS
# If necessary, initialize the new DNS map via Setup: also
${SKP_SETUP_DNS}${SKP_DNS}d.init
${SKP_SETUP_DNS}${SKP_DNS}${SKP_DNS_SA}d.add ServerAddresses * ${FIN_DNS_SA}
${SKP_SETUP_DNS}${SKP_DNS}${SKP_DNS_SD}d.add SearchDomains * ${FIN_DNS_SD}
${SKP_SETUP_DNS}${SKP_DNS}${SKP_DNS_DN}d.add DomainName ${FIN_DNS_DN}
${SKP_SETUP_DNS}${SKP_DNS}set Setup:/Network/Service/${PSID}/DNS
# Initialize the SMB map
${SKP_SMB}d.init
${SKP_SMB}${SKP_SMB_NN}d.add NetBIOSName ${FIN_SMB_NN}
${SKP_SMB}${SKP_SMB_WG}d.add Workgroup ${FIN_SMB_WG}
${SKP_SMB}${SKP_SMB_WA}d.add WINSAddresses * ${FIN_SMB_WA}
${SKP_SMB}set State:/Network/Service/${PSID}/SMB
quit
EOF
2019-07-03 19:58:14.268776 MANAGEMENT: Client disconnected
2019-07-03 19:58:14.269380 WARNING: Failed running command (--up/--down): external program exited with error status: 133
2019-07-03 19:58:14.269401 Exiting due to fatal error
2019-07-03 19:58:16.079844 *Tunnelblick: No 'post-disconnect.sh' script to execute
2019-07-03 19:58:16.094710 *Tunnelblick: Expected disconnection occurred.

Ошибка устраняется путем изменения кода скрипта client.up.tunnelblick.sh.
Все действия описанные ниже производятся только в терминале (консоли) Mac OS X/OS X/macOS через Tunnelblick.

Команды начинающиеся с приглашения # выполняются от root-пользователя, приглашение $ означает выполнение от обычного пользователя.

Открыв терминал (консоль) Mac OS X/OS X/macOS сперва следует зайти под root-пользователя, для этого необходимо ввести команду указанную ниже, а в ответ на запрос пароля ввести пароль пользователя (обычного пользователя).
$ sudo su

Если приглашение консоли сменилось с $ на # значит смена пользователя на root завершилась успешно.
Далее следует сделать резервную копию скрипта.
Абсолютный путь до скрипта client.up.tunnelblick.sh может быть отличен от рассмотренного в примере.
/Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh

# cp /Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh /Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh.backup

Затем можно безопасно изменить скрипт.
# echo '#!/bin/bash -e' > /Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh
# echo 'exit 0' >> /Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh

В конце следует проверить правильность выполнения команд. Результат команды cat должен иметь следующий вид.
# cat /Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh
#!/bin/bash -e
exit 0

Чтобы откатить изменения скрипта client.up.tunnelblick.sh достаточно под root-пользователем ввести следующую команду.
# cat /Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh.backup > /Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh