[CSBroker] Window에서 서버 운영하기 - Window Port Forwarding

민재원·2022년 11월 12일
1

csbroker

목록 보기
1/1
post-thumbnail

목차
1. 외부에서 윈도우 데스크탑에 띄어진 localhost:3000에 접근하려면 어떤 과정을 거쳐야 할까요?
2. ngrok을 사용한 통신 방법
3. ngrok을 포기하기로 한 이유
4. 그럼 ngrok의 URL을 subdomain에 연결하면?
5. Window Port Forwarding ⭐️( 윈도우 포트포워딩은 여기입니다 )


들어가기 전에

저는 CS Broker의 AI 서비스를 데스크탑에서 운영중입니다.
데스크탑에서 운영을 하는 이유는 차후에 시간이 된다면 따로 포스팅 하겠습니다 😊


외부에서 윈도우 데스크탑에 띄어진 localhost:3000에 접근하려면 어떤 과정을 거쳐야 할까요?

저희의 목표는 외부에서 윈도우 로컬호스트 환경인 저 화면에 도달하는게 목표입니다.

방법은 아주 많겠지만 가장 유명한 방법은 다음 두 가지입니다.

  1. ngrok 터널링 서비스 이용
  2. port forwarding

결과를 먼저 말씀드리면 1번으로 운영을 하다가 2번으로 변경하였습니다.
오늘은 변경 한 이유와 window port forwarding 으로 통신하는 방법을 포스팅 하겠습니다.
(Private IP, Public IP, Port의 개념들은 안다는 가정하에 포스팅을 진행하겠습니다.)

ngrok을 사용한 통신 방법

이번 포스트의 주제는 ngrok이 아니기 때문에 가볍게 사용법과 특징만 소개하겠습니다.

  1. ngrok 사이트에서 회원가입을 합니다.
  2. ngrok download에 가서 ngrok을 설치합니다. (설치 방법은 운영체제별 상이)
  3. cli에 실행 명령어 입력 ngrok http 3000

놀랍게도 끝입니다..!! 정말 간단하게 외부에서 로컬호스트의 포트와 연결을 시켜줄 수 있습니다.

ngrok을 한 달정도 사용해보았는데 체감한 장단점은 다음과 같습니다.

장점

  • 터널링을 통해 내부의 아이피정보를 완벽하게 숨길 수 있어 보안이 좋다.
  • ngrok이 복잡한 포워딩과 터널링을 구현해두었기 때문에 사용하기 정말 편하다.
  • 기본 TLS 인증서를 발급해주기 때문에 편하다.

단점

  • ngrok을 재실행 시킬때마다 url이 바뀐다. (내가 ngrok을 포기한 이유)
    • subdomain을 연결할 수 있지만 달에 25$는 부담스러움
  • ngrok을 실행시키면 japan의 호스트를 연결해준다. 그 말은 즉슨 모든 요청이 일본을 거쳐서 와야하기 때문에 속도가 느리다.

위의 사진이 ngrok을 사용하지 않고 통신했을 때이고 아래의 사진이 ngrok을 사용했을 때입니다.
적게는 4배에서 많게는 6~7배까지 차이가 나는데 가장 주된 이유는 물리적으로 멀리 있기 때문일 것 입니다.

ngrok을 포기하기로 한 이유

사실 패킷 전달 속도는 ms 단위이기 때문에 크게 체감되지 않았습니다.
하지만 ngrok을 실수로 종료하거나 가끔 데스크탑이 재부팅되어 ngrok을 재실행을 해야하면 url이 바뀌게 됩니다.

url이 바뀌면 backend에서 설정한 client가 바라보는 host url이 바뀌기 때문에 재배포를 해야합니다.
backend는 현재 blue/green 무중단 배포를 설정해놓았기 때문에 새로 배포하는데 1시간정도가 걸리게 됩니다.
그 말은 만약 ngrok이 재실행되게 된다면 최소 1시간은 장애시간으로 갖는다는 것 입니다.

그래서 저는 url이 바뀌었을때 백엔드를 고치는게 아닌 url을 가리키는 dns를 바꾸는 방법을 찾아야 했습니다.

그럼 ngrok의 URL을 subdomain에 연결하면?

첫 번째 시도는 route 53에 subdomain으로 추가해서
ai.csbroker.io -> ngrok-host-domain.com -> localhost 과정으로 통신하는 방법이였습니다.
만약 이게 성공한다면 만약 url이 바뀌었을 때 route 53에서 ai.csbroker.io의 cname만 바꿔주면 됩니다.
하지만 이는 TLS 인증서때문에 실패하였습니다.
ngrok은 기본적으로 https만을 지원하고 그 TLS 인증서는 ngrok에서 만들었습니다.
하지만 csbroker의 도메인에는 저희가 만든 TLS 인증서가 따로 존재하였고 ngrok의 입장에선 host가 ngrok이 아닌 csbroker로써 요청이 오니까 이는 제 3자가 보낸거라고 생각하여 거절하게 됩니다.

route53을 통한 시도는 그렇게 실패하였고 결국 마지막 수단으로 간직하던 포트 포워딩을 통해 Direct로 통신하기로 하였습니다.

Window Port Forwarding

방법을 간단하게 요약하면 로컬에 DHCP 설정을 통해 ip를 고정시키고 공유기의 port forwarding을 통해 내부 IP를 가리키고 ddns를 설정하면 컴퓨터가 다시 접속하여도 ip는 고정되고 만약 ip가 변하더라도 ddns를 통해 백엔드의 url 의존성은 느슨해지게 됩니다. (전혀 간단하지 않음)

검색창에 port forwarding을 치면 바로 공유기의 port forwarding 방법이 나오게 됩니다. 하지만 그 방법 하나로 통신이 가능한게 아니고 몇 가지의 과정이 더 필요한데 처음부터 끝까지 설명을 해주는 글이 존재하지 않아서 따로 포스팅을 올리게 되었습니다.

사실 이 과정은 TCP/IP 4계층을 잘 이해하고 계신다면 더 수월하게 작업이 가능합니다.
network의 통신과정을 제대로 이해하지 않으면 내가 지금 안되는 부분이 무엇때문이지 알기가 힘들기 때문입니다. (살짝 뜨끔합니다.. 🤫)

한 번에 모든 과정을 하기보단 순차적으로 개방, 테스팅 하며 접근하시는걸 추천드리고 확인하는 순서는 다음과 같습니다.

  1. ping을 통해 IP 확인 (TCP/IP Internet Layer)
  2. tcping을 통해 Port 연결 확인 (TCP/IP Transport Layer )
  3. http request를 통해 Application Layer와 연결 확인 (TCP/IP Application Layer)

NAT(공유기) Port Forwarding

우리가 하고 싶은건 Ping이 데스크탑을 거쳤다가 돌아가는 것 입니다. (명확하게는 tcping 요청입니다)
먼저 데스크탑에 ping이 도착하기 위해서는 NAT를 통해 public ip를 private ip로 변경해주어야 겠죠?
이해를 쉽게 하기 위해 각 단계별 포트를 다르게 구성하였고 실제로는 포트번호를 헷갈리지 않도록 같은 포트로 관리하기도 합니다.

클라이언트의 입장에서는 private ip를 알지 못하고 2000이라는 포트 목적지를 달아서 전송하면 NAT는 2000번에 맞는 private ip로 변경해서 전달하게 됩니다.

저는 U+ 공유기를 사용하고 있으며 각 통신사별 관리자 모드는 다양하게 구성되어 있습니다.

공유기에 2000번 포트로 요청이 오면 192.168.123.123:2500 으로 NAT를 진행한다는 설정입니다. (설정 적용하기를 잊는 분이 가끔 있는데 꼭 눌러서 공유기가 reload 되어야 적용이 된 것 입니다.)

그럼 이제 tcping [public_id] [port_number]를 terminal에 요청해보세요!!
당연하게도 응답이 오질 않죠 아직 갈 길이 멀었습니다.

로컬 방화벽 포트 개방



방화벽 -> 고급 설정 -> 인바운드 규칙 -> 새 규칙 -> tcp 2500번 포트로 들어오는 요청 허용

참고로 이 인바운드 규칙은 Stateful 하기 때문에 들어올 때 허용이 된 요청은 outbound 검사를 하지 않아도 됩니다. 이는 AWS의 Security Group과 같다고 볼 수 있습니다.

자 그럼 이제 tcping [public_id] [port_number]를 terminal에 요청해보세요!!

당연히 안돌아오죠 아직 한 단계가 남았습니다.

Port listening

보통 윈도우에서 서버운영 하시려는 분들이 위의 과정까지는 잘 진행하시지만 port listening을 잊어버리시는 분들이 많습니다. (왜 눈물이 나는건지..😭)


현재 우리는 저 빨간 부분까지 도달하였습니다.
즉 요청이 방화벽까지 넘어왔지만 데스크탑은 요청이 와도 자신의 것이 아니라 생각하고 대꾸도 하지 않는 상황인 것 입니다. "이 요청이 나의 것 이다" 라는걸 설정해줘야 합니다.
powershell을 관리자 모드로 들어가고 다음 명령어를 통해 port listening 합니다.

 netsh interface portproxy add v4tov4 listenport=2500 listenaddress=192.168.219.100 connectport=3000 connectaddress=localhost

자 해석을 한 번 해볼까요 -> 192.168.219.100:2500로 들어온 요청을 localhost의 3000번 포트로 연결해라
위 명령어를 자신의 private ip와 port를 적절하게 맞춰서 실행하면 정말 끝입니다.

추가적으로 netsh의 명령어를 소개드리자면

# 현재 portproxy 전부 출력
netsh interface portproxy show all

# portproxy 삭제
netsh interface portproxy delete v4tov4 listenport={port_number} listenaddress={listen_address}

자 그럼 이제 진짜 tcping [public_id] [port_number]를 terminal에 요청해보세요!!

TCP 연결이 저희 데스크탑에 도착하였고 이제 저 포트를 통해 통신이 가능해진 것 입니다.
이제 TCP/IP Transport 계층까지 설정이 끝났고 Application을 3000번 포트로 실행시키면 Application Layer까지 연결이 완료가 됩니다.

자!! 이제 저희는 외부에서 공유기의 public ip + port forwarding 을 통해 서버를 운영할 수 있습니다.

마치며

추가적으로 DHCP IP 고정 할당과 DDNS 설정을 통해 컴퓨터 혹은 공유기가 reload 되더라도 고정하여 운영할 수 있습니다.
위의 두 가지는 정말 간단하기 때문에 검색을 통해 해결하시는걸 추천드립니다 😊

앞으로 운영 환경에서 적용해야할게 많이 남아있습니다.

  • Sentry + Slack 연동으로 에러 모니터링
  • AWS CloudWatch + lambda 를 통해 health check
  • AI Server 모니터링

요즘 AWS의 온디맨드 환경이 얼마나 편한지 몸으로 체감을 하고 있습니다. 제가 온프레미스 환경으로 서비스를 운영하는건 오로지 비용떄문이며 만약 저처럼 특별한 이유가 있는게 아니라면 꼭 클라우드 서비스를 활용하시길 권장드립니다 🙇🏻

profile
코딩하는 너구리

0개의 댓글