성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>윈도우 서버의 80 포트에 대한 port forwarding 설정 방법</h1> <p> 어느 고객사의 상황이었습니다. ^^<br /> <br /> 원래는 다음과 같이 내부 사용자를 대상으로 서비스를 했다고 합니다.<br /> <br /> <img alt='windows_port_forward_1.png' src='/SysWebRes/bbs/windows_port_forward_1.png' /><br /> <br /> 그런데, 외부 사용자에게도 서비스를 오픈하게 되는 요구 사항이 나오면서 문제가 발생했습니다. 방화벽 외부에서는 "내부 웹 서버"를 곧바로 들어오지 못하도록 보안상 막혀 있기 때문이었습니다.<br /> <br /> 그래서, 부득이하게 다음과 같이 중계용 웹 서버를 하나 더 두고 내부 웹 서버와의 통신을 허용하게 만들었습니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='windows_port_forward_2.png' src='/SysWebRes/bbs/windows_port_forward_2.png' /><br /> <br /> 그런데, 중계용 웹 서버가 하는 일이 ... 실은 다음과 같이 구현된 웹 사이트였습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 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); } </pre> <br /> <hr style='width: 50%' /><br /> <br /> 사실, 이런 경우 조건에 따라서 중계용 웹 서버의 역할을 조정하는 것이 가능합니다. 즉, 일부러 test.aspx와 같은 페이지를 만들어서 매핑시키는 것 보다는 중계용 웹 서버에 들어오는 80 포트의 요청 자체를 내부 서버로 포워딩 시키는 것입니다.<br /> <br /> 마침, 윈도우 제품에는 이런 포트 포워딩 기능이 내장되어 있는데요. 이에 대해서는 아래의 글에서 잘 설명해 주고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Port Forwarding / Port Mapping on Windows Server 2008 R2 ; <a target='tab' href='http://www.rickwargo.com/2011/01/08/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/</a> </pre> <br /> 하지만, 아쉽게도 아직 문제가 끝난 것이 아닙니다.<br /> <br /> 특별히 80 포트는 이미 IIS에 의해 선점되어 있기 때문에 포트포워딩이 제대로 안됩니다. 실제로 다음과 같이 명령을 실행해 보면, 대개의 경우 PID == 4라고 나옵니다. (PID == 4는 일반적으로 System 프로세스)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32>netstat -ano | findstr 80 TCP 0.0.0.0:80 0.0.0.0:0 LISTENING <span style='color: blue; font-weight: bold'>4</span> </pre> <br /> 따라서, IIS 관리자에서 80 포트를 선점하고 있는 <a target='tab' href='http://www.sysnet.pe.kr/2/0/1468'>웹 사이트를 중지</a>시키고 나서 다음의 명령어를 실행시켜야만 정상적으로 "포트 포워딩"을 해주는 서비스가 80 포트를 열어서 처리를 시작하게 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.0.5 </pre> <br /> 그 다음에 다시 netstat로 확인해 보면 PID가 다른 번호로 교체된 것을 볼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32>netstat -ano | findstr 80 TCP 0.0.0.0:80 0.0.0.0:0 LISTENING <span style='color: blue; font-weight: bold'>844</span> 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 </pre> <br /> 부가적으로, "Windows Firewall"이 활성화 상태에 있다면 80 포트를 명시적으로 열어주어야 합니다. "World Wide Web Services (HTTP Traffic-In)"으로 80 포트를 통해 웹 서비스를 했다고는 하지만 그것은 IIS에 특화되어 적용되기 때문에 별도로 80 포트를 열어주는 설정을 하지 않으면 방화벽에 의해 차단됩니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='windows_port_forward_3.png' src='/SysWebRes/bbs/windows_port_forward_3.png' /><br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 포트 포워딩 설정을 삭제하고 싶다면 다음의 명령으로 한 번에 모두 지울 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > netsh interface portproxy reset </pre> <br /> 그리고, 위에서 netstat 명령어로 알아봤을 때 80 포트를 열고 있는 프로세스의 ID가 844였는데요. 이를 추적해 보면 몇 개의 윈도우 NT 서비스가 공유하는 svchost.exe 프로세스임을 알 수 있습니다. 그 중에서도 포트 포워딩을 담당하는 서비스는 "IP Helper (iphlpsvc)"이고, 실제로 서비스 관리자에서 해당 서비스만 중지시켰을 경우 더 이상 포트 포워딩이 안되는 것을 볼 수 있습니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1755
(왼쪽의 숫자를 입력해야 합니다.)