IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Сети (http://www.imho.ws/forumdisplay.php?f=145)
-   -   OpenVPN Tap Device идентифицирует сеть как неопознанную/общественную (http://www.imho.ws/showthread.php?t=148570)

Plague 19.11.2018 16:21

OpenVPN Tap Device идентифицирует сеть как неопознанную/общественную
 
Столкнулся недавно с проблемой того, что соединение на OpenVPN Tap Device идентифицируется Windows (от Vista и далее) как неопознанная/общественная сеть со всеми вытекающими. Например, правильно настроенный виндовый фаер блочит пинги, SMB и прочие плюшки, открытые для внутренних сетей, и во имя которых как раз VPN зачастую и мутится.
Происходит это из-за того, что пока винда не видит шлюз для сети, она почему-то за нормальную сеть это не считает. Существует вариант прописать шлюз с какой-нибудь адской метрикой, но лично мне он не понравился.

Более изящный способ:
В ветке реестра
Цитата:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\
находим раздел, отвечающий за нужный Tap-Device (признаки: ProductName - TAP-Windows Adapter Vx) и пишем туда параметр DWORD *NdisDeviceType (звёздочку не пропускаем, это не опечатка) со значением 1.
После перезагрузки соединение из "Центра управления сетями и общим доступом" пропадает вообще (остается как адаптер в "Панель управления\Сеть и Интернет\Сетевые подключения") но начинает работать как частная сеть.
Через этот же параметр реализован, например, виртуальный сетевой адаптер у VirtualBox, только там все это делается автоматом.

Если влом искать раздел адаптера в рукопашную, есть пара скриптов: один - cmd, второй - powershell:

tapfix.cmd
Код:

FOR /F "USEBACKQ" %%A IN (`REG QUERY HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318} /K /F "*"`) DO (REG QUERY %%A /V DriverDesc | (FIND "TAP-Win" && REG ADD %%A /V *NdisDeviceType /T REG_DWORD /D 1 /F))
fix-vmnet-adapters.ps1
Код:

# see http://msdn2.microsoft.com/en-us/library/bb201634.aspx
#
# *NdisDeviceType
#
# The type of the device. The default value is zero, which indicates a standard
# networking device that connects to a network.
#
# Set *NdisDeviceType to NDIS_DEVICE_TYPE_ENDPOINT (1) if this device is an
# endpoint device and is not a true network interface that connects to a network.
# For example, you must specify NDIS_DEVICE_TYPE_ENDPOINT for devices such as
# smart phones that use a networking infrastructure to communicate to the local
# computer system but do not provide connectivity to an external network.
#
# Usage: run in an elevated shell (vista/longhorn) or as adminstrator (xp/2003).
#
# PS> .\fix-vmnet-adapters.ps1

# boilerplate elevation check

$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = new-object Security.Principal.WindowsPrincipal $identity
$elevated = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if (-not $elevated) {
        $error = "Sorry, you need to run this script"
        if ([System.Environment]::OSVersion.Version.Major -gt 5) {
                $error += " in an elevated shell."
        } else {
                $error += " as Administrator."
        }
        throw $error
}

function confirm {
$host.ui.PromptForChoice("Continue", "Process adapter?", [Management.Automation.Host.ChoiceDescription[]]@("&No", "&Yes"), 0) -eq $true}

# adapters key
pushd 'hklm:\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}'

# ignore and continue on error
dir -ea 0 | % {
        $node = $_.pspath
        $desc = gp $node -name driverdesc
        if ($desc -like "*TAP-Win*") {
                write-host ("Found adapter: {0} " -f $desc.driverdesc)
                if (confirm) {
                        new-itemproperty $node -name '*NdisDeviceType' -propertytype dword -value 1
                }
        }
}
popd

# disable/enable network adapters
gwmi win32_networkadapter | ? {$_.name -like "*TAP-Win*" } | % {

        # disable
        write-host -nonew "Disabling $($_.name) ... "
        $result = $_.Disable()
        if ($result.ReturnValue -eq -0) { write-host " success." } else { write-host " failed." }

        # enable
        write-host -nonew "Enabling $($_.name) ... "
        $result = $_.Enable()
        if ($result.ReturnValue -eq -0) { write-host " success." } else { write-host " failed." }
}

нарыл у майкрософта

ps. и не забываем установить высокий приоритет для сервиса OpenVPN:
Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\OpenVPN]
"priority"="HIGH_PRIORITY_CLASS"



Часовой пояс GMT +4, время: 03:06.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.