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

비밀번호

댓글 작성자
 




... 121  122  123  124  [125]  126  127  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10797정성태5/23/201521501VC++: 91. 자식 스레드에 자동 상속되는 TEB의 SubProcessTag 필드파일 다운로드1
10796정성태5/23/201532342오류 유형: 293. SQL Server Management Studio 실행 시 "Cannot find one or more components" 오류
10795정성태5/23/201530433오류 유형: 292. InstallUtil로 .NET 서비스 등록 시 오류 - Operation is not supported. (Exception from HRESULT: 0x80131515). [3]
10794정성태5/22/201525388개발 환경 구성: 267. (무료) 마이크로소프트 온라인 강좌 소개 - 네트워킹 기초 [1]
2925정성태5/14/201525000디버깅 기술: 73. PDB 기호 파일의 경로 구성 방식파일 다운로드1
2924정성태5/14/201528313VS.NET IDE: 100. 비주얼 스튜디오 원격 디버깅 시 'Unknown function' 콜스택이 나온다면?
2923정성태5/12/201587728기타: 52. 도서: 시작하세요! C# 6.0 프로그래밍: 기본 문법부터 실전 예제까지 [17]
2922정성태5/12/201524582오류 유형: 291. ssindex.cmd 실행 시 '...[tfs_collection_url]...' not found in srcsrv.ini 오류 발생
2921정성태5/9/201530933개발 환경 구성: 266. 인텔에서 구현한 최대 절전 모드 기능 - Intel® Rapid Start Technology
2920정성태5/9/201521989오류 유형: 290. 디스크 관리자의 파티션 축소 시, There is not enough space available on the disk(s) to complete this operation.
2919정성태5/9/201521885오류 유형: 289. Error: this template attempted to load component assembly 'NuGet.VisualStudio.Interop, ...'
2918정성태5/9/201540418Windows: 111. 복구(Recovery) 파티션 삭제하는 방법 [3]
2917정성태5/9/201530827오류 유형: 288. .NET Framework 4.6이 설치된 경우 "Intel® Rapid Storage Technology (Intel® RST) RAID Driver"가 설치 안 되는 문제 [5]
2916정성태5/9/201531920오류 유형: 287. 레지스트리 권한 오류 - Cannot edit [Registry key name]: Error writing the value's new contents.
2915정성태5/9/201531060개발 환경 구성: 265. TrustedInstaller 권한으로 프로그램 실행시키는 방법 [11]
2914정성태5/9/201528395DDK: 7. 정식 인증서가 있는 경우 Device Driver 서명하는 방법 [2]
2913정성태4/30/201526120.NET Framework: 511. Build 2015 행사에서 소개된 (맥/리눅스/윈도우 용 무료) Visual Studio Code 개발 도구 [8]
2912정성태4/29/201521883오류 유형: 286. VirtualBox에 Windows 8/2012 설치 시 "Error Code: 0x000000C4" 오류 발생
2911정성태4/29/201520478오류 유형: 285. Visual Studio 2015를 제거한 경우 Microsoft.VisualStudio.Web.PageInspector.Loader 어셈블리를 못 찾는 문제 [2]
2910정성태4/29/201524419오류 유형: 284. System.TypeLoadException: Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly [1]
2909정성태4/29/201520559오류 유형: 283. WCF 연결 오류 - Expected record type 'PreambleAck'
2908정성태4/29/201528878오류 유형: 282. 원격에서 SQL 서버는 연결되지만, SQL Express는 연결되지 않는 경우
2907정성태4/29/201518868.NET Framework: 510. 제네릭(Generic) 인자에 대한 메타데이터 등록 확인
2906정성태4/28/201521466오류 유형: 281. DebugView로 인한 System.Diagnostics.Trace.WriteLine 멈춤(Hang) 현상
2905정성태4/27/201521886오류 유형: 280. HttpResponse.Headers.Add에서 "System.PlatformNotSupportedException: This operation requires IIS integrated pipeline mode." 예외 발생
2904정성태4/27/201527061DDK: 6. ZwTerminateProcess로 프로세스를 종료하는 Device Driver 프로그램 [2]파일 다운로드1
... 121  122  123  124  [125]  126  127  128  129  130  131  132  133  134  135  ...