Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 493. OpenVPN의 네트워크 구성 [링크 복사], [링크+제목 복사]
조회: 2637
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

OpenVPN의 네트워크 구성

지난 글에서 설명한,

윈도우에 OpenVPN 설치 - 서버 측 구성
; https://www.sysnet.pe.kr/2/0/12224

윈도우에 OpenVPN 설치 - 클라이언트 측 구성
; https://www.sysnet.pe.kr/2/0/12225

방식으로 설치했으면 VPN 서버와 그 서비스에 접속한 클라이언트 PC는 다음과 같은 네트워크 구성을 갖게 됩니다.

openvpn_network_1.png

OpenVPN은 저 그림에서 "VPN이 제공하는 가상 네트워크: 10.8.0.0"을 제공하기 위해 서버와 클라이언트 모두에 제품 설치 시 "TAP-Windows Adapter V9"이라는 Network Adapter를 생성합니다. (제어판의 "Network Connections"에서 확인할 수 있습니다.)

실제로 VPN 서버와 클라이언트 PC에서 ipconfig을 실행해 보면 각각의 네트워크 환경이 나옵니다.

// [서버]

C:\> ipconfig

Windows IP Configuration

...[생략]...

Unknown adapter Local Area Connection:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::a135:b01c:66f4:5d58%10
   IPv4 Address. . . . . . . . . . . : 10.8.0.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.252
   Default Gateway . . . . . . . . . :

...[생략]...


// [클라이언트]

C:\>ipconfig

Windows IP Configuration

...[생략]...

Unknown adapter Local Area Connection:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::2143:82b7:fd24:b855%89
   IPv4 Address. . . . . . . . . . . : 10.8.0.6
   Subnet Mask . . . . . . . . . . . : 255.255.255.252
   Default Gateway . . . . . . . . . :

...[생략]...

따라서, (방화벽에서 Ping 허용이 되었다면) 서버는 클라이언트에게 ping 10.8.0.6으로, 클라이언트는 서버에게 ping 10.8.0.1로 접근 여부를 쉽게 확인할 수 있습니다.




그렇다면 이제 통신은 어떤 식으로 이뤄질까요? 이에 대한 힌트를, OpenVPN의 클라이언트 측에서 접속했을 때 출력한 로그를 통해 알 수 있습니다.

...[생략]...
Thu Jun 11 09:42:24 2020 C:\WINDOWS\system32\route.exe ADD 10.8.0.0 MASK 255.255.255.0 10.8.0.5
...[생략]...

(클라이언트 측의) openvpn.exe가 실행하는 위의 명령어로 인해 (클라이언트 측의) 윈도우 운영체제에는 다음과 같은 route 테이블이 구성됩니다.

C:\> route PRINT -4
===========================================================================
Interface List
...[생략]...
 79...00 ff ed bb 9a ae ......TAP-Windows Adapter V9
...[생략]...
===========================================================================

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.0.1     192.168.0.19    291
         10.8.0.0    255.255.255.0         10.8.0.5         10.8.0.6     25
         10.8.0.4  255.255.255.252         On-link          10.8.0.6    281
         10.8.0.6  255.255.255.255         On-link          10.8.0.6    281
         10.8.0.7  255.255.255.255         On-link          10.8.0.6    281
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
...[생략]...
===========================================================================
Persistent Routes:
  Network Address          Netmask  Gateway Address  Metric
...[생략]...
===========================================================================

이로 인해 클라이언트 측에서는 "10.8.0.0" 관련 패킷이 발생하는 경우 "10.8.0.6" 주소를 소유한 Network Adapter(TAP-Windows Adapter V9)가 통신을 담당하게 됩니다. 하지만, 그 외의 주소에 대한 통신은 "192.168.0.19" 주소를 소유한 기존 Network Adapter가 처리합니다.

이런 상황에서는 웹 브라우저를 이용해 10.8.0.0 이외의 사이트에 접속하는 경우 클라이언트 측의 기존 네트워크 망을 이용해 통신을 하게 되고, 예를 들어 "https://ipconfig.tools/en/"과 같은 사이트를 방문하게 되면 보이는 IP 주소가 OpenVPN을 사용하기 전과 달라지는 것이 없습니다.




물론, 대개의 경우 위와 같은 네트워크 구성은 VPN을 사용하려는 목적에 부합합니다. 하지만, 때로는 모든 통신을 VPN 서버 측의 네트워크로 라우팅 되는 것을 원할 수도 있습니다. (예를 들어, 비주얼 스튜디오의 업데이트 속도를 빠르게 하기 위해 VPN 서버 측의 네트워크를 사용하고 싶을 수 있습니다.)

이러한 구성을 OpenVPN에서 하려면, 서버 측의 server.ovpn 파일에 다음의 구성을 활성화해야 합니다

push "redirect-gateway def1 bypass-dhcp"

위의 설정으로 변경하고, 서버 측 OpenVPN을 다시 실행한 후, 클라이언트 측에서 연결을 다시 하면 이번에는 클라이언트 측의 연결 로그에 다음과 같은 route 명령어를 볼 수 있습니다.

Thu Jun 11 10:02:42 2020 C:\WINDOWS\system32\route.exe ADD 52.231.8.55 MASK 255.255.255.255 192.168.0.1
Thu Jun 11 10:02:42 2020 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=35 and dwForwardType=4
Thu Jun 11 10:02:42 2020 Route addition via IPAPI succeeded [adaptive]
Thu Jun 11 10:02:42 2020 C:\WINDOWS\system32\route.exe ADD 0.0.0.0 MASK 128.0.0.0 10.8.0.5
Thu Jun 11 10:02:42 2020 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=25 and dwForwardType=4
Thu Jun 11 10:02:42 2020 Route addition via IPAPI succeeded [adaptive]
Thu Jun 11 10:02:42 2020 C:\WINDOWS\system32\route.exe ADD 128.0.0.0 MASK 128.0.0.0 10.8.0.5
Thu Jun 11 10:02:42 2020 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=25 and dwForwardType=4
Thu Jun 11 10:02:42 2020 Route addition via IPAPI succeeded [adaptive]
Thu Jun 11 10:02:42 2020 C:\WINDOWS\system32\route.exe ADD 10.8.0.0 MASK 255.255.255.0 10.8.0.5
Thu Jun 11 10:02:42 2020 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=25 and dwForwardType=4
Thu Jun 11 10:02:42 2020 Route addition via IPAPI succeeded [adaptive]

이로 인해 라우팅 테이블의 설정이 바뀌는데,

C:\> route PRINT -4
===========================================================================
Interface List
 89...00 ff ed bb 9a ae ......TAP-Windows Adapter V9
...[생략]...
===========================================================================

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.0.1     192.168.0.19    291
          0.0.0.0        128.0.0.0         10.8.0.5         10.8.0.6     25
         10.8.0.0    255.255.255.0         10.8.0.5         10.8.0.6     25
         10.8.0.4  255.255.255.252         On-link          10.8.0.6    281
         10.8.0.6  255.255.255.255         On-link          10.8.0.6    281
         10.8.0.7  255.255.255.255         On-link          10.8.0.6    281
...[생략]...
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
...[생략]...
===========================================================================
Persistent Routes:
  Network Address          Netmask  Gateway Address  Metric
...[생략]...
===========================================================================

보는 바와 같이 "Destination"의 설정에 "0.0.0.0" 항목이 2개로 늘어났는데 "10.8.0.6" Interface의 Metric이 "192.168.0.19"가 가진 291보다 낮은 25로 설정되어 우선순위가 더 높아졌습니다.




그렇다면, 이제 웹 브라우저 등을 이용해 서버에 접속하려고 하면 "10.8.0.6"이 속한 네트워크로의 우선순위가 높아져 그쪽으로 패킷이 흐르게 됩니다. 하지만, 여기서 문제가 하나 발생합니다. VPN 서버는 "10.8.0.0" 네트워크로 흘러 들어오는 패킷을 자신이 기존에 속한 네트워크로 라우팅 하지는 않는다는 점입니다.

따라서, 이로 인해 "push "redirect-gateway def1 bypass-dhcp" 설정이 적용된 OpenVPN 네트워크에서는 클라이언트 측의 컴퓨터에서 웹 브라우징 등이 안 되는 문제가 발생합니다. (사실 설정에 따른 것이므로, 이것은 문제라고 볼 수 없고 의도된 현상입니다.)

이 문제를 해결하려면, VPN 서버 측에서 "10.8.0.0"으로 흘러온 패킷을 VPN 서버의 또 다른 네트워크 어댑터 - 즉, 인터넷이 연결된 네트워크 어댑터로 흘러들어가도록 만들어야 하고, 이것을 쉽게 할 수 있는 것이 바로 "ICS (Internet Connection Sharing)"를 설정하는 것입니다.

아래의 그림은,

openvpn_network_2.png

VPN 서버 측에서 인터넷과 연결된 "Ethernet 2" 어댑터의 속성 창을 통해 ICS를 활성화시켜 "TAP-Windows Adapter V9"으로부터의 라우팅을 허용하게 만듭니다. 이렇게 구성이 되면, 웹 브라우저를 실행해 외부 사이트에 접속하는 경우, 가령 "https://ipconfig.tools/en/" 등의 사이트를 방문하면 사용된 IP 주소가 VPN 서버 측의 IP인 것을 확인할 수 있습니다.




참고로, OpenVPN의 문제인지 ICS의 문제인지는 알 수 없으나 종종 클라이언트에서의 인터넷 접속이 잘 안 될 때가 있습니다. 그런 경우에는 서버 측의 ICS를 재활성하든가, 클라이언트 측의 VPN 접속을 다시 해보면 잘 되기도 합니다. (불안정한 원인을 잘 모르겠군요. ^^)

게다가 이론상 ICS로 인해 클라이언트 측의 네트워크 동작에 문제가 없어야 하는 것이 맞지만 웬일인지 오피스 제품의 Outlook을 실행했을 때 첫 화면에서 "We are unable to connect right now. Please check your network and try again later."라는 오류가 발생하는 걸로 봐서 100% 안정적인 통신이 보장된다고 볼 수 없습니다.

마지막으로, ICS와 함께 Bridge로 엮은 구성을 다룬 다음의 글을 소개하며 글을 마칩니다. ^^

Hyper-V Internal 네트워크 VM 의 인터넷 접속
; https://www.sysnet.pe.kr/2/0/1335

Hyper-V의 네트워크 유형 (2)
; https://www.sysnet.pe.kr/2/0/915

따지고 보면, OpenVPN의 네트워크 구성과 "Hyper-V Internal 네트워크 VM 의 인터넷 접속" 글에서 다룬 네트워크 구성은 다를 바 없습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]


donaricano-btn



[최초 등록일: ]
[최종 수정일: 6/19/2020]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 쓴 사람
 



2021-11-09 04시59분
[질문드립니다] 수고하십니다. 질문 하나 드려도 될까요
route.exe ADD 52.231.8.55 MASK 255.255.255.255 192.168.0.1 << 이렇게 서버쪽에서 미리 설정해 둘 수 있는 방법이 있을까요? client가 접속하면 자동적으로 routing 경로가 추가되도록~
[손님]
2021-11-09 09시05분
그게 되려면 ovpn 서버와 클라이언트 측에서 그 용도로 동작하도록 정의한 옵션이 있어야 하는데... 글쎄요. 그 옵션이 있을까요? ^^ 혹시 발견하시게 되거든 덧글 부탁드립니다.
정성태

... 16  17  18  19  20  21  22  23  24  [25]  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
12254정성태7/2/20202054오류 유형: 626. git - REMOTE HOST IDENTIFICATION HAS CHANGED!
12253정성태7/2/20202293.NET Framework: 922. C# - .NET ThreadPool의 Local/Global Queue파일 다운로드1
12252정성태7/2/20202868.NET Framework: 921. C# - I/O 스레드를 사용한 비동기 소켓 서버/클라이언트파일 다운로드2
12251정성태7/1/20202326.NET Framework: 920. C# - 파일의 비동기 처리 유무에 따른 스레드 상황 [1]파일 다운로드2
12250정성태6/30/20203408.NET Framework: 919. C# - 닷넷에서의 진정한 비동기 호출을 가능케 하는 I/O 스레드 사용법 [1]파일 다운로드1
12249정성태6/29/20201929오류 유형: 625. Microsoft SQL Server 2019 RC1 Setup - 설치 제거 시 Warning 26003 오류 발생
12248정성태6/29/20201843오류 유형: 624. SQL 서버 오류 - service-specific error code 17051
12247정성태6/29/20202260.NET Framework: 918. C# - 불린 형 상수를 반환값으로 포함하는 3항 연산자 사용 시 단축 표현 권장(IDE0075) [2]파일 다운로드1
12246정성태6/29/20201999.NET Framework: 917. C# - USB 관련 ETW(Event Tracing for Windows)를 이용한 키보드 입력을 감지하는 방법
12245정성태6/24/20202608.NET Framework: 916. C# - Task.Yield 사용법 (2) [2]파일 다운로드1
12244정성태6/24/20202221.NET Framework: 915. ETW(Event Tracing for Windows)를 이용한 닷넷 프로그램의 내부 이벤트 활용 [1]파일 다운로드1
12243정성태6/23/20201755VS.NET IDE: 147. Visual C++ 프로젝트 - .NET Core EXE를 "Debugger Type"으로 지원하는 기능 추가
12242정성태6/23/20202134오류 유형: 623. AADSTS90072 - User account '...' from identity provider 'live.com' does not exist in tenant 'Microsoft Services'
12241정성태6/23/20203169.NET Framework: 914. C# - Task.Yield 사용법파일 다운로드1
12240정성태6/23/20202950오류 유형: 622. 소켓 바인딩 시 "System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions" 오류 발생
12239정성태6/21/20201908Linux: 30. (윈도우라면 DLL에 속하는) .so 파일이 텍스트로 구성된 사례
12238정성태6/21/20201973.NET Framework: 913. C# - SharpDX + DXGI를 이용한 윈도우 화면 캡처 라이브러리
12237정성태6/20/20201929.NET Framework: 912. 리눅스 환경의 .NET Core에서 "test".IndexOf("\0")가 0을 반환
12236정성태6/19/20202172오류 유형: 621. .NET Standard 대상으로 빌드 시 dynamic 예약어에서 컴파일 오류 - error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
12235정성태6/19/20202383오류 유형: 620. Windows 10 - Inaccessible boot device 블루 스크린
12234정성태6/19/20201977개발 환경 구성: 494. NuGet - nuspec의 패키지 스키마 버전(네임스페이스) 업데이트 방법
12233정성태6/19/20201775오류 유형: 619. SQL 서버 - The transaction log for database '...' is full due to 'LOG_BACKUP'. - 두 번째 이야기
12232정성태6/19/20201690오류 유형: 618. SharePoint - StoreBusyRetryLater 오류
12231정성태6/15/20202139.NET Framework: 911. Console/Service Application을 위한 SynchronizationContext - AsyncContext
12230정성태6/15/20201966오류 유형: 617. IMetaDataImport::GetMethodProps가 반환하는 IL 코드 주소(RVA) 문제
12229정성태6/13/20202508.NET Framework: 910. USB/IP PROJECT를 이용해 C#으로 USB Keyboard + Mouse 가상 장치 만들기 [1]
... 16  17  18  19  20  21  22  23  24  [25]  26  27  28  29  30  ...