Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

NAT 환경에서 L2TP/IPSec VPN 연결 구성하기 – VPN 오류 코드 809 해결 방법

iOS에서 PPTP VPN 지원이 중단되면서, 필자의 고객 중 한 곳은 Windows Server 2012 R2에서 운영 중이던 VPN 서버를 PPTP에서 L2TP/IPSec 방식으로 전환하기로 결정했습니다. 내부 LAN에 있는 클라이언트는 VPN 서버에 아무 문제 없이 접속되지만, 외부의 Windows 클라이언트에서는 L2TP VPN 서버에 연결을 시도할 때 오류 809가 발생합니다.

오류 메시지는 다음과 같습니다.

L2TP-IPsec-VPN-Server.hostname에 연결할 수 없습니다.

원격 서버가 응답하지 않아 컴퓨터와 VPN 서버 간의 네트워크 연결을 설정할 수 없습니다. 이는 컴퓨터와 원격 서버 사이의 네트워크 장치(방화벽, NAT, 라우터 등) 중 하나가 VPN 연결을 허용하도록 구성되지 않았기 때문일 수 있습니다. 관리자 또는 서비스 제공업체에 문의하여 문제를 일으키는 장치를 확인하시기 바랍니다.

다른 Windows 버전에서는 800, 794, 809 오류 코드가 동일한 문제를 나타낼 수 있습니다.

여기서 주목할 점은 VPN 서버가 NAT 뒤에 위치해 있고, 라우터에 다음과 같은 L2TP 포트 포워딩이 설정되어 있다는 것입니다.

  • UDP 1701 — Layer 2 Forwarding Protocol(L2F) 및 Layer 2 Tunneling Protocol(L2TP)
  • UDP 500
  • UDP 4500 — NAT-T(IPSec NAT 통과)
  • 프로토콜 50 ESP

이 포트들은 Windows 방화벽의 VPN 연결 규칙에서도 열려 있습니다. 즉, 전형적인 구성이며, 연결에는 Windows 내장 VPN 클라이언트를 사용합니다. 참고로 동일한 VPN 서버에 PPTP로 접속하면 연결이 정상적으로 성립됩니다.

NAT 뒤의 Windows에서 발생하는 L2TP/IPSec VPN 오류 809

조사해 보니 이 문제는 이미 알려진 사항으로, Microsoft 지원 문서(https://support.microsoft.com/en-us/kb/926179)에 설명되어 있습니다. Windows 내장 VPN 클라이언트는 기본적으로 NAT를 통한 L2TP/IPsec 연결을 지원하지 않습니다. 그 이유는 IPsec이 패킷 암호화에 ESP(Encapsulating Security Payload)를 사용하는데, ESP는 PAT(Port Address Translation)를 지원하지 않기 때문입니다. IPsec을 사용한 통신을 원한다면 Microsoft는 VPN 서버에 공인 IP 주소를 사용할 것을 권장합니다.

하지만 우회 방법도 존재합니다. NAT-T 프로토콜 지원을 활성화하면 이러한 단점을 해결할 수 있습니다. NAT-T는 ESP 50 패킷을 UDP 4500 포트의 패킷으로 캡슐화할 수 있게 해줍니다. NAT-T는 Windows를 제외한 거의 모든 운영체제(iOS, Android, Linux)에서 기본적으로 활성화되어 있습니다.

L2TP/IPsec VPN 서버가 NAT 장비 뒤에 있는 경우, 외부 클라이언트가 NAT를 통해 정상적으로 접속하려면 서버와 클라이언트 양쪽의 레지스트리를 수정하여 L2TP의 UDP 패킷 캡슐화와 IPsec의 NAT-T 지원을 허용해야 합니다.

  • 레지스트리 편집기(regedit.exe)를 열고 다음 레지스트리 키로 이동합니다.
    • Windows 10/8.1/Vista 및 Windows Server 2016/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 없이 인터넷에 직접 연결되어 있음을 의미
    • 1 — VPN 서버가 NAT 장비 뒤에 있음
    • 2 — VPN 서버와 클라이언트 모두 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 서버에 성공적으로 접속할 수 있습니다.

일부 경우에는 VPN이 정상 작동하도록 TCP 1701에 대한 추가 방화벽 규칙을 활성화해야 할 수도 있습니다(일부 L2TP 구현에서는 이 포트가 UDP 1701과 함께 사용됩니다).

또한 초기 Windows 10 빌드(예: 10240, 1511, 1607)에서는 NAT-T가 올바르게 작동하지 않았습니다. 구버전 Windows를 사용 중이라면 Windows 10 빌드를 업그레이드하는 것을 권장합니다.

동일한 LAN에서 여러 개의 L2TP VPN 동시 연결 문제

또 다른 흥미로운 VPN 버그가 있습니다. 로컬 네트워크에 Windows 컴퓨터가 여러 대 있는 경우, 외부 L2TP/IPSec VPN 서버에 동시에 두 개 이상의 연결을 설정할 수 없습니다. 다른 컴퓨터에서(이미 다른 장치의 VPN 터널이 활성화된 상태에서) 동일한 VPN 서버에 접속을 시도하면 오류 코드 809 또는 789가 나타납니다.

오류 789: 원격 컴퓨터와의 초기 협상 중 보안 계층에서 처리 오류가 발생하여 L2TP 연결 시도가 실패했습니다.

흥미롭게도 이 문제는 Windows 장치에서만 발생합니다. 동일한 로컬 네트워크의 Linux/macOS/Android 장치에서는 이러한 문제가 없으며, 여러 장치에서 동시에 L2TP VPN 서버에 쉽게 접속할 수 있습니다.

TechNet에 따르면 이 문제는 Windows의 L2TP/IPSec 클라이언트가 잘못 구현되었기 때문이며(수년간 수정되지 않음), 이는 Windows 고유의 문제입니다.

이 버그를 해결하려면 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters 레지스트리 키에서 두 개의 레지스트리 값을 변경한 후 컴퓨터를 재시작해야 합니다.

  • AllowL2TPWeakCrypto00000001로 변경(약한 암호화 알고리즘 허용, L2TP/IPSec에서는 MD5와 DES 알고리즘이 사용됨)
  • ProhibitIPSec00000000으로 변경(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까지 모든 버전에서 작동).