在NAT后面配置L2TP/IPSec VPN连接,VPN错误代码809
由于在iOS中禁用了PPTP VPN支持,我的一位客户决定将运行Windows Server 2012 R2的VPN服务器从PPTP重新配置为L2TP/IPSec。来自内部局域网的内部VPN客户端可以毫无问题地连接到VPN服务器,但是,外部Windows客户端在尝试与L2TP VPN服务器建立连接时会收到错误809:
无法连接到L2TP-IPsec-VPN-Server.hostname如果通过PPTP连接到同一VPN服务器,则连接成功建立。
由于远程服务器没有响应,因此无法在计算机和VPN服务器之间建立网络连接。这可能是因为计算机和远程服务器之间的网络设备之一(例如防火墙,NAT,路由器等)未配置为允许VPN连接。请与管理员或者服务提供商联系,以确定可能是引起问题的设备。
在其他Windows版本中,连接错误" 800"," 794"或者" 809"可能表示相同的问题。
值得注意的是,VPN服务器位于NAT之后,并且路由器配置为转发L2TP端口:
- UDP 1701第2层转发协议(L2F)和第2层隧道协议(L2TP)
- UDP 500
- UDP 4500 NAT-TIPSec网络地址转换器遍历
- 协议50 ESP
这些端口也在Windows防火墙规则中打开以进行VPN连接。那些,使用经典配置。内置的Windows VPN客户端用于连接。
在某些情况下,为使VPN正常工作,我们需要为TCP 1701启用其他防火墙规则(在某些L2TP实现中,此端口与UDP 1701结合使用)。
NAT后Windows上的L2TP/IPSec的VPN错误809
事实证明,此问题已为已知,并在文章https://support.microsoft.com/zh-cn/kb/926179中进行了描述。 Windows内置VPN客户端默认不支持通过NAT进行L2TP/IPsec连接。这是因为IPsec使用" ESP"(封装安全有效载荷)来加密数据包,而ESP不支持" PAT"(端口地址转换)。如果要使用IPSec进行通信,Microsoft建议在VPN服务器上使用公共IP地址。
但是,也有一种解决方法。我们可以通过启用对" NAT-T"协议的支持来解决此缺陷,该协议允许我们将ESP 50数据包封装在端口4500上的UDP数据包中。默认情况下,几乎所有操作系统(iOS,Android,Linux)都启用NAT-T )(Windows除外)。
如果L2TP/IPsec VPN服务器在NAT设备后面,则为了正确地通过NAT连接外部客户端,我们必须对服务器和客户端上的注册表进行一些更改,以允许对L2TP和NAT-T进行UDP数据包封装IPsec中的支持。
- 打开注册表编辑器(
regedit.exe
),然后转到以下注册表项:
- Windows 10/8.1/Vista和Windows Server 2015/2012R2/2008R2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent
- Windows XP/Windows Server 2003
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPSec
- 创建一个名称为AssumeUDPEncapsulationContextOnSendRule的DWORD参数,值为2注意。可能的AssumeUDPEncapsulationContextOnSendRule值是:
- " 0"(默认值)表示服务器未连接NAT即可连接到Internet;
- " 1" VPN服务器在NAT设备后面;
- VPN服务器和客户端的" 2"都位于NAT之后。
- 只需重新启动计算机,并确保已成功建立VPN隧道
[警告]如果Windows VPN服务器和客户端都位于NAT之后,则需要在两个设备上都更改此设置。
另外,我们可以使用PowerShell cmdlet对注册表进行更改:
Set-ItemProperty -Path "HKLM:SYSTEM\CurrentControlSet\Services\PolicyAgent" -Name "AssumeUDPEncapsulationContextOnSendRule" -Type DWORD -Value 2 –Force;
启用NAT-T支持后,我们将能够通过NAT(包括双NAT)从客户端成功连接到VPN服务器。
NAT-T在较早的Windows 10版本(例如10240、1511、1607)中无法正常工作。如果我们使用的Windows版本较旧,建议我们升级Windows 10版本。
来自同一局域网的多个L2TP VPN连接
还有另一个有趣的VPN错误。如果本地网络有多台Windows计算机,则我们不能同时建立到外部L2TP/IPSec VPN服务器的多个连接。如果我们尝试从另一台计算机(具有来自不同设备的活动VPN隧道)连接到同一VPN服务器,则将显示错误代码809或者789:
Error 789: The L2TP connection attempt failed because the security layer encountered a processing error during initial negotiations with the remove computer.
有趣的是,此问题仅在Windows设备上发生。在同一本地网络上的Linux/MacOS/Android设备上,没有此类问题。我们可以轻松地同时从多个设备连接到VPN L2TP服务器。
根据TechNet,此问题与Windows上L2TP/IPSec客户端的错误实现有关(多年未修复)。
要修复此错误,我们需要在" HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters"注册表项中更改两个注册表参数,然后重新启动计算机:
- 将" AllowL2TPWeakCrypto"更改为" 00000001"(允许使用弱加密算法,对于L2TP/IPSec,使用MD5和DES算法);
- " ProhibitIPSec"更改为" 00000000"(启用IPsec加密,通常会被某些VPN客户端或者系统工具禁用)。
运行以下命令来更改以应用这些注册表更改:
`reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters" /v AllowL2TPWeakCrypto /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters" /v ProhibitIpSec /t REG_DWORD /d 0 /f`
这样可以通过共享的公用IP地址支持Windows上的并发L2TP/IPSec VPN连接(适用于从Windows XP到Windows 10的所有版本)。