윈도우 서버의 80 포트에 대한 port forwarding 설정 방법
어느 고객사의 상황이었습니다. ^^
원래는 다음과 같이 내부 사용자를 대상으로 서비스를 했다고 합니다.

그런데, 외부 사용자에게도 서비스를 오픈하게 되는 요구 사항이 나오면서 문제가 발생했습니다. 방화벽 외부에서는 "내부 웹 서버"를 곧바로 들어오지 못하도록 보안상 막혀 있기 때문이었습니다.
그래서, 부득이하게 다음과 같이 중계용 웹 서버를 하나 더 두고 내부 웹 서버와의 통신을 허용하게 만들었습니다.

그런데, 중계용 웹 서버가 하는 일이 ... 실은 다음과 같이 구현된 웹 사이트였습니다.
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 포트를 열어주는 설정을 하지 않으면 방화벽에 의해 차단됩니다.
참고로, 포트 포워딩 설정을 삭제하고 싶다면 다음의 명령으로 한 번에 모두 지울 수 있습니다.
netsh interface portproxy reset
그리고, 위에서 netstat 명령어로 알아봤을 때 80 포트를 열고 있는 프로세스의 ID가 844였는데요. 이를 추적해 보면 몇 개의 윈도우 NT 서비스가 공유하는 svchost.exe 프로세스임을 알 수 있습니다. 그 중에서도 포트 포워딩을 담당하는 서비스는 "IP Helper (iphlpsvc)"이고, 실제로 서비스 관리자에서 해당 서비스만 중지시켰을 경우 더 이상 포트 포워딩이 안되는 것을 볼 수 있습니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]