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

비밀번호

댓글 작성자
 




[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
14006정성태8/23/2025168Linux: 121. Linux - snap 패키지 관리자로 설치한 소프트웨어의 디렉터리 접근 제한
14005정성태8/21/2025470오류 유형: 982. sudo: unable to load /usr/libexec/sudo/sudoers.so: libssl.so.3: cannot open shared object file: No such file or directory
14004정성태8/21/2025529오류 유형: 981. dotnet 실행 시 No usable version of the libssl was found
14003정성태8/21/2025613닷넷: 2357. C# 14 - (9) 새로운 지시자 추가 (Ignored directives)
14002정성태8/20/20251141오류 유형: 980. C# - appsettings.json 파일의 설정값이 적용 안 된다면?
14001정성태8/19/20251353닷넷: 2356. .NET SDK 10 - 단일 소스 코드 파일을 빌드/실행하는 기능을 "dotnet" 명령어에 추가
14000정성태8/18/20251152오류 유형: 979. ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory
13999정성태8/15/20251441닷넷: 2355. C# 14 - (8) null 조건부 연산자 개선 - 대입문에도 사용 가능파일 다운로드1
13998정성태8/14/20251316닷넷: 2354. C# 14 - (7) 확장 메서드에 정적 메서드와 속성 지원을 위한 전용 구문 추가파일 다운로드1
13997정성태8/14/20251421Linux: 120. docker 컨테이너로 매핑된 볼륨에 컨테이너 측의 사용자 ID를 유지하면서 복사하는 방법
13996정성태8/13/2025973오류 유형: 978. Unable to find the requested .Net Framework Data Provider.
13995정성태8/13/2025973개발 환경 구성: 754. Visual C++ - 리눅스 빌드를 위한 Ubuntu 18 docker 컨테이너 설정
13994정성태8/12/2025938오류 유형: 977. SQL Server - User, group, or role '...' already exists in the current database. (Microsoft SQL Server, Error: 15023)
13993정성태8/11/20251484오류 유형: 976. Microsoft.ML.OnnxRuntimeGenAI 패키지 사용 시 "cublasLt64_12.dll" which is missing. (Error 126: "The specified module could not be found.") 오류
13992정성태8/11/20251622닷넷: 2353. C# - Foundry Local을 이용한 gpt-oss-20b 모델 사용파일 다운로드1
13991정성태8/9/20251448오류 유형: 975. winget - Foundry Local 패키지 업데이트가 안 되는 문제
13990정성태8/8/20251101Windows: 283. Time zone 설정이 없는 Windows Server 2025
13989정성태8/8/20251595닷넷: 2352. C# - Windows S-mode 환경인지 체크하는 방법파일 다운로드1
13988정성태8/8/20251713오류 유형: 974. 비주얼 스튜디오 업데이트 시 잠김 파일 경고 - Visual Studio Standard Collector Service 150 (VSStandardCollectorService150)
13987정성태8/7/20251366닷넷: 2351. C# 14 - (6) event와 생성자에도 partial 메서드 적용파일 다운로드1
13986정성태8/6/20251394닷넷: 2350. C# 14 - (5) 람다 매개 변수에 접근자가 있는 경우에도 타입 생략 가능파일 다운로드1
13985정성태8/6/20251930오류 유형: 973. "wsl --install" 명령어 수행 시 "The server name or address could not be resolved"
13984정성태8/6/20251635Windows: 282. 윈도우 운영체제에 추가된 ssh 서버(Win32-OpenSSH)
13983정성태8/4/20251884오류 유형: 972. Microsoft.Data.SqlClient 6.1.0 버전부터 .NET 8 이상만 지원
13982정성태8/2/20252053개발 환경 구성: 753. CentOS 7 컨테이너 내에서 openssh 서버 호스팅
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...