Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)

윈도우 서버의 80 포트에 대한 port forwarding 설정 방법

어느 고객사의 상황이었습니다. ^^

원래는 다음과 같이 내부 사용자를 대상으로 서비스를 했다고 합니다.

windows_port_forward_1.png

그런데, 외부 사용자에게도 서비스를 오픈하게 되는 요구 사항이 나오면서 문제가 발생했습니다. 방화벽 외부에서는 "내부 웹 서버"를 곧바로 들어오지 못하도록 보안상 막혀 있기 때문이었습니다.

그래서, 부득이하게 다음과 같이 중계용 웹 서버를 하나 더 두고 내부 웹 서버와의 통신을 허용하게 만들었습니다.

windows_port_forward_2.png

그런데, 중계용 웹 서버가 하는 일이 ... 실은 다음과 같이 구현된 웹 사이트였습니다.

1. 외부 사용자는 http://164.124.50.5/test.aspx로 서비스 요청

2. 중계 웹 서버의 test.aspx 코드는 다음과 같이 작성

   public void Page_Load(object sender, EventArgs e)
   {
       WebClient wc = new WebClient();
       string txt = wc.DownloadString("http://192.168.0.5/orgtest.aspx");
       Response.Write(txt);
   }




사실, 이런 경우 조건에 따라서 중계용 웹 서버의 역할을 조정하는 것이 가능합니다. 즉, 일부러 test.aspx와 같은 페이지를 만들어서 매핑시키는 것 보다는 중계용 웹 서버에 들어오는 80 포트의 요청 자체를 내부 서버로 포워딩 시키는 것입니다.

마침, 윈도우 제품에는 이런 포트 포워딩 기능이 내장되어 있는데요. 이에 대해서는 아래의 글에서 잘 설명해 주고 있습니다.

Port Forwarding / Port Mapping on Windows Server 2008 R2
; http://www.rickwargo.com/2011/01/08/port-forwarding-port-mapping-on-windows-server-2008-r2/

하지만, 아쉽게도 아직 문제가 끝난 것이 아닙니다.

특별히 80 포트는 이미 IIS에 의해 선점되어 있기 때문에 포트포워딩이 제대로 안됩니다. 실제로 다음과 같이 명령을 실행해 보면, 대개의 경우 PID == 4라고 나옵니다. (PID == 4는 일반적으로 System 프로세스)

C:\Windows\system32>netstat -ano | findstr 80
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4

따라서, IIS 관리자에서 80 포트를 선점하고 있는 웹 사이트를 중지시키고 나서 다음의 명령어를 실행시켜야만 정상적으로 "포트 포워딩"을 해주는 서비스가 80 포트를 열어서 처리를 시작하게 됩니다.

netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.0.5

그 다음에 다시 netstat로 확인해 보면 PID가 다른 번호로 교체된 것을 볼 수 있습니다.

C:\Windows\system32>netstat -ano | findstr 80
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       844

C:\Windows\system32>netsh interface portproxy show all

Listen on ipv4:             Connect to ipv4:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
0.0.0.0         80          192.168.0.5    80

부가적으로, "Windows Firewall"이 활성화 상태에 있다면 80 포트를 명시적으로 열어주어야 합니다. "World Wide Web Services (HTTP Traffic-In)"으로 80 포트를 통해 웹 서비스를 했다고는 하지만 그것은 IIS에 특화되어 적용되기 때문에 별도로 80 포트를 열어주는 설정을 하지 않으면 방화벽에 의해 차단됩니다.

windows_port_forward_3.png




참고로, 포트 포워딩 설정을 삭제하고 싶다면 다음의 명령으로 한 번에 모두 지울 수 있습니다.

netsh interface portproxy reset

그리고, 위에서 netstat 명령어로 알아봤을 때 80 포트를 열고 있는 프로세스의 ID가 844였는데요. 이를 추적해 보면 몇 개의 윈도우 NT 서비스가 공유하는 svchost.exe 프로세스임을 알 수 있습니다. 그 중에서도 포트 포워딩을 담당하는 서비스는 "IP Helper (iphlpsvc)"이고, 실제로 서비스 관리자에서 해당 서비스만 중지시켰을 경우 더 이상 포트 포워딩이 안되는 것을 볼 수 있습니다.




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 3/9/2021]

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

비밀번호

댓글 작성자
 




... 76  [77]  78  79  80  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
12044정성태10/27/201917687오류 유형: 575. mstest.exe - System.Resources.MissingSatelliteAssemblyException: The satellite assembly named "Microsoft.VisualStudio.ProductKeyDialog.resources.dll, ..."
12043정성태10/27/201919708오류 유형: 574. Windows 10 설치 시 오류 - 0xC1900101 - 0x4001E
12042정성태10/26/201918701오류 유형: 573. OneDrive 하위에 위치한 Documents, Desktop 폴더에 대한 권한 변경 시 "Unable to display current owner"
12041정성태10/23/201920253오류 유형: 572. mstest.exe - The load test results database could not be opened.
12040정성태10/23/201920853오류 유형: 571. Unhandled Exception: System.Net.Mail.SmtpException: Transaction failed. The server response was: 5.2.0 STOREDRV.Submission.Exception:SendAsDeniedException.MapiExceptionSendAsDenied
12039정성태10/22/201917740스크립트: 16. cmd.exe의 for 문에서는 ERRORLEVEL이 설정되지 않는 문제
12038정성태10/17/201918325오류 유형: 570. SQL Server 2019 RC1 - SQL Client Connectivity SDK 설치 오류
12037정성태10/15/201925920.NET Framework: 867. C# - Encoding.Default 값을 바꿀 수 있을까요?파일 다운로드1
12036정성태10/14/201927263.NET Framework: 866. C# - 고성능이 필요한 환경에서 GC가 발생하지 않는 네이티브 힙 사용파일 다운로드1
12035정성태10/13/201920580개발 환경 구성: 461. C# 8.0의 #nulable 관련 특성을 .NET Framework 프로젝트에서 사용하는 방법 [2]파일 다운로드1
12034정성태10/12/201920127개발 환경 구성: 460. .NET Core 환경에서 (프로젝트가 아닌) C# 코드 파일을 입력으로 컴파일하는 방법 [1]
12033정성태10/11/201924558개발 환경 구성: 459. .NET Framework 프로젝트에서 C# 8.0/9.0 컴파일러를 사용하는 방법
12032정성태10/8/201920159.NET Framework: 865. .NET Core 2.2/3.0 웹 프로젝트를 IIS에서 호스팅(Inproc, out-of-proc)하는 방법 - AspNetCoreModuleV2 소개
12031정성태10/7/201918097오류 유형: 569. Azure Site Extension 업그레이드 시 "System.IO.IOException: There is not enough space on the disk" 예외 발생
12030정성태10/5/201925181.NET Framework: 864. .NET Conf 2019 Korea - "닷넷 17년의 변화 정리 및 닷넷 코어 3.0" 발표 자료 [1]파일 다운로드1
12029정성태9/27/201925382제니퍼 .NET: 29. Jennifersoft provides a trial promotion on its APM solution such as JENNIFER, PHP, and .NET in 2019 and shares the examples of their application.
12028정성태9/26/201921014.NET Framework: 863. C# - Thread.Suspend 호출 시 응용 프로그램 hang 현상을 해결하기 위한 시도파일 다운로드1
12027정성태9/26/201915640오류 유형: 568. Consider app.config remapping of assembly "..." from Version "..." [...] to Version "..." [...] to solve conflict and get rid of warning.
12026정성태9/26/201921965.NET Framework: 862. C# - Active Directory의 LDAP 경로 및 정보 조회
12025정성태9/25/201920277제니퍼 .NET: 28. APM 솔루션 제니퍼, PHP, .NET 무료 사용 프로모션 2019 및 적용 사례 (8) [1]
12024정성태9/20/201922217.NET Framework: 861. HttpClient와 HttpClientHandler의 관계 [2]
12023정성태9/18/201922644.NET Framework: 860. ServicePointManager.DefaultConnectionLimit와 HttpClient의 관계파일 다운로드1
12022정성태9/12/201926190개발 환경 구성: 458. C# 8.0 (Preview) 신규 문법을 위한 개발 환경 구성 [3]
12021정성태9/12/201942273도서: 시작하세요! C# 8.0 프로그래밍 [4]
12020정성태9/11/201925236VC++: 134. SYSTEMTIME 값 기준으로 특정 시간이 지났는지를 판단하는 함수
12019정성태9/11/201918953Linux: 23. .NET Core + 리눅스 환경에서 Environment.CurrentDirectory 접근 시 주의 사항
... 76  [77]  78  79  80  81  82  83  84  85  86  87  88  89  90  ...