Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 87. Hyper-V의 네트워크 유형 (3) [링크 복사], [링크+제목 복사],
조회: 21614
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)
(시리즈 글이 12개 있습니다.)
개발 환경 구성: 83. Hyper-V의 네트워크 유형 (1)
; https://www.sysnet.pe.kr/2/0/910

개발 환경 구성: 84. Hyper-V의 네트워크 유형 (2)
; https://www.sysnet.pe.kr/2/0/915

개발 환경 구성: 87. Hyper-V의 네트워크 유형 (3)
; https://www.sysnet.pe.kr/2/0/918

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

개발 환경 구성: 330. Hyper-V VM의 Internal Network를 Private 유형으로 만드는 방법
; https://www.sysnet.pe.kr/2/0/11299

Windows: 174. WSL 2의 네트워크 통신 방법
; https://www.sysnet.pe.kr/2/0/12347

개발 환경 구성: 517. Hyper-V Internal 네트워크에 NAT을 이용한 인터넷 연결 제공
; https://www.sysnet.pe.kr/2/0/12352

개발 환경 구성: 522. WSL2 인스턴스와 호스트 측의 Hyper-V에 운영 중인 VM과 네트워크 연결을 하는 방법
; https://www.sysnet.pe.kr/2/0/12494

개발 환경 구성: 656. Internal Network 유형의 스위치로 공유한 Hyper-V의 VM과 호스트가 통신이 안 되는 경우
; https://www.sysnet.pe.kr/2/0/13199

개발 환경 구성: 660. WSL 2 내부로부터 호스트 측의 네트워크로 UDP 데이터가 1개의 패킷으로만 제한되는 문제
; https://www.sysnet.pe.kr/2/0/13230

개발 환경 구성: 665. WSL 2의 네트워크 통신 방법 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/13256

개발 환경 구성: 670. WSL 2에서 호스팅 중인 TCP 서버를 외부에서 접근하는 방법
; https://www.sysnet.pe.kr/2/0/13280




Hyper-V의 네트워크 유형 (3)

이번에 살펴볼 내용은, 다음과 같은 시나리오를 위한 것입니다.

  • 호스트 측의 네트워크를 어지럽히지 않고, (즉, 별도의 네트워크로 분리하기 위해 Internal 유형 사용)
  • VM <-> VM
  • VM <-> HOST
  • VM <-> 인터넷
  • VM <-> HOST가 참여하고 있는 네트워크의 다른 PC

정리해 보면, Hyper-V의 네트워크 유형 (2) 글에서 살펴 본 "Internal + ICS" 상태의 네트워크에 다음 기능을 추가한 것입니다.

  • VM <- HOST가 참여하고 있는 네트워크(또는 인터넷)의 다른 PC

그렇군요. 기존 네트워크와 동등한 레벨로 하나의 완전한 독립 네트워크를 생성하기 위한 작업입니다.

참고로, 이에 관한 것은 다음의 글들을 기반으로 작성된 것입니다.

How to use Hyper-V with a wireless network connection
; http://blogs.msdn.com/b/nicold/archive/2008/04/15/how-to-use-hyper-v-with-a-wireless-network-connection.aspx

Access Hyper-V VM Internal Networks from outside the host computer
; http://blogs.msdn.com/b/mihail_popescu/archive/2009/10/22/access-hyper-v-vm-internal-networks-from-outside-the-host-computer.aspx




"Internal" 유형의 네트워크로부터 천천히 한 단계씩 해결해 볼까요? ^^ (만약 기존 실습 과정에서 ICS를 걸어두었다면 해제합니다.)

우선, "Internal" 네트워크는 기본적으로 다음과 같은 통신만 제공합니다.

  • VM <-> VM
  • VM <-> HOST

예제에 사용될 VM 하나와 호스트의 기본 IP 구성은 다음과 같습니다.

A-VM
   IP: 169.254.222.37 / 16

Host 
   (Internal 가상 NIC) IP: 169.254.139.48 / 16
   (물리 NIC) IP: 192.168.1.2 / 24

Internal 네트워크에 대한 관리 편의를 위해 기본 제공되는 IP 대역을 쓰지 않고 임의의 "C 클래스"를 정하겠습니다. (물론, B 클래스도 상관 없는데, 어차피 한 대의 Hyper-V에서 제공되는 VM 수를 생각하면 "C 클래스"로도 충분합니다.)

A-VM
   IP: 192.168.50.2 / 24
   Gateway: 192.168.50.1

Host 
   (Internal 가상 NIC) IP: 192.168.50.1 / 24

   (물리 NIC) IP: 192.168.1.2
              Gateway: 192.168.1.0

Host 네트워크의 다른 PC
   (물리 NIC) IP: 192.168.1.3
              Gateway: 192.168.1.0

당연히, 지금 단계에서 "A-VM <-> Host" 사이에서는 서로 같은 네트워크(192.168.50.0)에 주어진 IP를 가지고 Ping을 하게 되면 응답이 옵니다.

첫 번째 문제는 "A-VM -> 호스트가 참여하고 있는 다른 PC"로의 통신이 가능해야 하는 것인데요. 즉, A-VM에서 "ping 192.168.1.3"이 가능하게 만들어야 합니다.

일단, 길 찾기를 한번 해볼까요?

A-VM에서 "ping 192.168.1.3"을 치면, 게이트웨이가 "192.168.50.1"로 되어 있으니 호스트 PC에 패킷이 전달됩니다. 그런데, 호스트 PC는 "Internal 가상 NIC"에 전달된 그 패킷을 어떻게 처리해야 할지를 모르기 때문에 더 이상 패킷 전달이 안됩니다.

만약, 호스트로 하여금 "192.168.1.3"으로의 패킷 전달을 하도록 만들고 싶다면 호스트 PC를 "라우터"로 만들어야 합니다. 따라서, 앞으로의 실습 진행을 위해서 아래의 글에 따라 ^^ 호스트 PC에 라우터 기능을 설치합니다.

"Routing and Remote Access"의 "Routing" 기능 활성화 방법
; https://www.sysnet.pe.kr/2/0/917

이렇게 설치해 주면, "이론상, VM -> Host 네트워크의 다른 PC"로의 통신은 가능합니다. "ping 192.168.1.3"을 치면,

VM (192.168.50.2) 
==> 디폴트 게이트웨이(192.168.50.1)을 거쳐서 
==> 호스트 PC가 라우터 기능이 있기 때문에 (물리 NIC) 192.168.1.2로 전달
==> (물리 NIC) 192.168.1.2에서 네트워크의 다른 PC(192.168.1.3)에 도착

그런데, 문제는 ICMP 응답입니다. 192.168.1.3으로부터의 응답 IP 헤더에는 주소가 "192.168.50.2"로 되어 있을 텐데, 경로 풀이가 다음과 같이 됩니다.

네트워크의 다른 PC (192.168.1.3)
==> 디폴트 게이트웨이(192.168.1.0)을 거쳐서
==> (192.168.50.1에 대한 라우팅 정보가 없으므로) 디폴트 게이트웨이의 다른 외부망으로 패킷 전달

이 때문에 Ping은 정상 동작하지 않게 됩니다. 따라서, 이런 경우에 네트워크의 대상 PC에 "192.168.50.0" 네트워크 주소에 대한 올바른 라우팅 경로를 VM을 호스팅하고 있는 PC로 다음과 같이 설정해 주어야 합니다.

C:\>route add 192.168.50.0 mask 255.255.255.0 192.168.1.2 
OK!

이렇게 되면 ICMP 응답은 다음과 같이 바뀝니다.

네트워크의 다른 PC (192.168.1.3)
==> PC에 설정된 라우팅 정보에 따라 (192.168.1.2)로 응답이 전송되고
==> 192.168.1.2의 라우팅 서비스에 따라 가상 NIC(192.168.50.1)으로 전달되고
==> A-VM의 192.168.50.2에 도착

결국, Internal 네트워크는 다음과 같이 확장됩니다.

  • VM <-> VM
  • VM <-> HOST
  • VM <-> HOST가 참여하고 있는 네트워크의 다른 PC




그런데, 문제가 2가지 있습니다.

  1. "네트워크의 다른 PC"들에 모두 돌아다니면서 일일이 "route add ..." 정보를 써주는 것은 매우 불편하다는 점과,
  2. VM에서 인터넷이 안된다는 것!

재미있게도 위의 문제는 동시에 풀려질 수 있습니다.

우선, 1번 문제는 위에서 자세히 알아봤으니 생략하고, 그렇다면 2번의 인터넷이 왜 안되는지를 살펴보겠습니다.

사실, 이번에도 "이론상, VM -> 인터넷" 접근은 가능합니다. 예를 들어, "http://203.252.3.60"로 접근하면,

VM (192.168.50.2)
==> 디폴트 게이트웨이(192.168.50.1)를 거쳐서 
==> 호스트 PC가 라우터 기능이 있기 때문에 (물리 NIC) 192.168.1.2로 전달
==> (물리 NIC) 192.168.1.2에 설정된 디폴트 게이트웨이(192.168.1.0)을 거쳐서 
==> 디폴트 게이트웨이(192.168.1.0)는,
    보통 NAT(Network Address Translation) 기능을 이용해서 다음과 같은 맵을 내부적으로 구성하고,
        192.168.50.2 : 포트 12000 <==> 게이트웨이의 공용 IP(121.139.108.3): 포트 12000

    인터넷으로 나가야 될 패킷의 Source IP에 디폴트 게이트웨이에 설정된 공용 IP를 설정합니다.
        Source IP: 121.139.108.3 / Port 12000,
        Dest IP: 203.252.3.60 / Port 80
==> ... 인터넷의 라우터들을 거쳐서 ...
==> 203.252.3.60 웹 서버에 도착

이번에도 문제는 응답인데요, 과정은 다음과 같습니다.

웹 서버 203.252.3.60
==> ... 인터넷의 라우터들을 거쳐서 ...
==> 공용 IP 121.139.108.3을 가진 게이트웨이에 12000 포트로 전달 (즉, 192.168.1.0 게이트웨이)
==> NAT 정보에 의해 내부에 전달해야 할 패킷의 대상이 192.168.50.2 / 포트 12000임을 알고,
==> 192.168.50.2로 전달하려고 하지만 라우팅 정보가 없으므로 다시 인터넷 밖으로 튕김.

자... 이 때문에 인터넷 통신이 안되는 것입니다.

그럼, 해결방법은? 당연히 ^^ 인터넷으로 나가는 게이트웨이(192.168.1.0)로 사용되는 라우터에 "192.168.50.0" 네트워크에 대한 라우팅 정보를 192.168.1.2라고 알려주어야 합니다.

이게 문제라면 문제겠지요?

만약, 여러분이 게이트웨이를 만질 수 있는 권한을 가진 사람이라면 지금 당장 접속해서 설정해 주면 되겠고... 그렇지 않다면 네트워크 관리자에게 부탁을 해야 합니다.

여기서는, ^^ 당연히 제가 만질 수 있는 권한이 있긴 하지만 아쉽게도 시스코 라우터같은 대단한 네트워크 장비는 아니고 그저 우리집에서 사용하고 있는 "ipTime N3004" 무선 액세스 포인트가 실험 대상입니다.

그래서, 다음과 같이 설정 가능합니다.

router_plus_host_pc_1.png

이렇게 호스트 PC의 물리 NIC에서 바라보고 있는 "Default Gateway" 장비 수준에서 라우팅 정보를 지정하게 되면 다른 PC들을 일일이 돌아다니면서 "route add..." 명령어를 내려줄 필요도 없고 인터넷까지 자연스럽게 연결된다는 장점이 있습니다.




팁 성격으로 한 가지 더 살펴볼까요?

그렇다면 A-VM(192.168.50.2)를 웹 서버로 한 경우, 인터넷에 어떻게 노출시켜 줄 수 있을까요? 그렇죠... 게이트웨이 측에서 포트 포워딩 같은 기능을 제공해 주면 됩니다. "ipTime N3004 의 경우에는 다음과 같이 지정해 줄 수 있습니다.

router_plus_host_pc_2.png

즉, Internal 네트워크에 묶인 VM으로의 포트 포워딩도 아주 잘 동작합니다. ^^

[정리: 가능한 접근 방식]

  • VM <-> VM
  • VM <-> HOST
  • VM <-> 같은 Bridge의 다른 어탭터들이 참여하고 있는 네트워크의 PC
  • VM <-> 인터넷
  • VM <-> HOST가 참여하고 있는 네트워크의 다른 PC





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

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/19/2023]

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

비밀번호

댓글 작성자
 




... 16  17  18  19  [20]  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13150정성태10/30/20226046C/C++: 160. Visual Studio 2022로 빌드한 C++ 프로그램을 위한 다른 PC에서 실행하는 방법
13149정성태10/27/20226016오류 유형: 825. C# - CLR ETW 이벤트 수신이 GCHeapStats_V1/V2에 대해 안 되는 문제파일 다운로드1
13148정성태10/26/20225949오류 유형: 824. msbuild 에러 - error NETSDK1005: Assets file '...\project.assets.json' doesn't have a target for 'net5.0'. Ensure that restore has run and that you have included 'net5.0' in the TargetFramew
13147정성태10/25/20225026오류 유형: 823. Visual Studio 2022 - Unable to attach to CoreCLR. The debugger's protocol is incompatible with the debuggee.
13146정성태10/24/20225878.NET Framework: 2060. C# - Java의 Xmx와 유사한 힙 메모리 최댓값 제어 옵션 HeapHardLimit
13145정성태10/21/20226181오류 유형: 822. db2 - Password validation for user db2inst1 failed with rc = -2146500508
13144정성태10/20/20226071.NET Framework: 2059. ClrMD를 이용해 윈도우 환경의 메모리 덤프로부터 닷넷 모듈을 추출하는 방법파일 다운로드1
13143정성태10/19/20226572오류 유형: 821. windbg/sos - Error code - 0x000021BE
13142정성태10/18/20225897도서: 시작하세요! C# 12 프로그래밍
13141정성태10/17/20227193.NET Framework: 2058. [in,out] 배열을 C#에서 C/C++로 넘기는 방법 - 세 번째 이야기파일 다운로드1
13140정성태10/11/20226509C/C++: 159. C/C++ - 리눅스 환경에서 u16string 문자열을 출력하는 방법 [2]
13139정성태10/9/20226212.NET Framework: 2057. 리눅스 환경의 .NET Core 3/5+ 메모리 덤프로부터 모든 닷넷 모듈을 추출하는 방법파일 다운로드1
13138정성태10/8/20227608.NET Framework: 2056. C# - await 비동기 호출을 기대한 메서드가 동기로 호출되었을 때의 부작용 [1]
13137정성태10/8/20225909.NET Framework: 2055. 리눅스 환경의 .NET Core 3/5+ 메모리 덤프로부터 닷넷 모듈을 추출하는 방법
13136정성태10/7/20226480.NET Framework: 2054. .NET Core/5+ SDK 설치 없이 dotnet-dump 사용하는 방법
13135정성태10/5/20226770.NET Framework: 2053. 리눅스 환경의 .NET Core 3/5+ 메모리 덤프를 분석하는 방법 - 두 번째 이야기
13134정성태10/4/20225453오류 유형: 820. There is a problem with AMD Radeon RX 5600 XT device. For more information, search for 'graphics device driver error code 31'
13133정성태10/4/20225821Windows: 211. Windows - (commit이 아닌) reserved 메모리 사용량 확인 방법 [1]
13132정성태10/3/20225725스크립트: 42. 파이썬 - latexify-py 패키지 소개 - 함수를 mathjax 식으로 표현
13131정성태10/3/20228523.NET Framework: 2052. C# - Windows Forms의 데이터 바인딩 지원(DataBinding, DataSource) [2]파일 다운로드1
13130정성태9/28/20225399.NET Framework: 2051. .NET Core/5+ - 에러 로깅을 위한 Middleware가 동작하지 않는 경우파일 다운로드1
13129정성태9/27/20225704.NET Framework: 2050. .NET Core를 IIS에서 호스팅하는 경우 .NET Framework CLR이 함께 로드되는 환경
13128정성태9/23/20228387C/C++: 158. Visual C++ - IDL 구문 중 "unsigned long"을 인식하지 못하는 #import파일 다운로드1
13127정성태9/22/20226861Windows: 210. WSL에 systemd 도입
13126정성태9/15/20227472.NET Framework: 2049. C# 11 - 정적 메서드에 대한 delegate 처리 시 cache 적용
13125정성태9/14/20227707.NET Framework: 2048. C# 11 - 구조체 필드의 자동 초기화(auto-default structs)
... 16  17  18  19  [20]  21  22  23  24  25  26  27  28  29  30  ...