티스토리 뷰

ngrok을 설명하기 전에 이것이 필요한 상황에 대해서 이야기를 간단하게 하는게 이해에 도움이 될 듯 하다. 우리가 웹이나 API를 개발할 때 당장 public 망에서 테스트를 해야 하는 경우를 생각해보자. 예를들어 slack bot을 개발한다고 생각해보면 아래 슬랙 API 화면에 보이는것처럼 public IP를 갖고 있는 서버가 있어야 정상적인 테스트가 가능하다. ( Request URL에 들어가는 주소는 슬랙 API를 처리할 개인 서버쯤으로 생각하면 된다. )

하지만 개발단계에서 우리는 아직 서버가 없을수도 있고 퍼블릭 IP를 할당받지 못했을 수도 있다. 기타 다른 여러가지 이유로 localhost로 테스트를 해야 하는 경우가 있는데 대부분의 웹 개발는 개발환경이나 프러덕트 환경에 deploy 하기 전에 localhost:8080 등으로 테스트를 진행하게 된다. 그렇다면 위 슬랙과 같은 경우에는 어떻게 안될까? slack은 퍼블릭한 환경에 존재하고 있는데 Request URL에 내 로컬 PC로 접속하도록 유도할 수는 없을까?

이런질문에서 시작해보면 ngrok와 같은 앱이 그 해답을 제시한다. NAT와 Proxy기반으로 동작해서 localhost에서 어딘지 알 수 없는 서버(이하 A)에 그 정보를 전송하고, 퍼블릭 환경에서 로컬호스트로 접근하기 위해서는 A서버에 request를 보내면 그것을 내 localhost로 proxy(중계)해준다고 생각하면 된다.

ngrok 심플 도식화

자, 그럼 바로 사용하기 위해서 아래 공식 홈페이지에 접속하도록 하자.

https://ngrok.com

페이지에 접속해서 보면 아래와 같이 기능을 소개하는 도큐먼트가 보이고 여러가지 내용들이 보이는데 다른것은 볼필요 없이 일단 LOGIN을 하도록 한다. 일반적인 웹페이지(혹은 API) 테스트는 LOGIN이 필요 없지만 SSH 와 같은 시크릿한 환경이 필요한 경우에는 로그인을 필요로 한다. SSH 를 테스트 하는게 아니라면 로그인은 건너뛰어도 좋다. 

로그인을 하면 다음과 같은 화면을 볼 수 있는데 내 PC의 환경에 맞는 ngrok을 다운로드 받도록 하자.

그리고 필요하다면 위 그림에서 3번과정에 있는 스크립트를 복사해서 터미널에서 실행시키도록 한다. 로컬PC를 인증하기 위한 절차라고 이해하면 되는데 실행시 계정의 home 디렉터리 밑에 .ngrok2/ngrok.yml 에 정보가 저장된다. 이후부터는 ngrok 바이너리내에서 해당 파일을 참고하게 된다.

$ ./ngrok authtoken 4e8mZDfUAuiDgLwN6RWXt_6wquZmAeqL
Authtoken saved to configuration file: /home/guest/.ngrok2/ngrok.yml

SSH 포트를 여는건 아래와 같은 명령어로 가능하다. 

./ngrok tcp 22

명령이 실행되면 아래와 같은 화면이 출력되는데 연결하기 위한 퍼블릭 도메인과 현재 연결되어 있는 세션 개수 등 여러가지 정보가 출력된다.

중간쯤에 Forwarding에 보이는 정보가 중요한데 퍼블릭한 도메인을 localhost:22로 포워딩 시켜준다는 의미이므로 이제 외부네트워크에서 해당 도메인으로 SSH 연결을 시도하면 우리 로컬 서버로 연결 될 것이다. SSH 연결은 터미널에서 아래와 같이 진행하면 되겠다.

ssh guest@0.tcp.ngrok.io -p 16017

SSH 연결이 아닌 웹 연결같은 경우에도 아래와 같이 간단하게 가능하다.

./ngrok http 80

API 혹은 웹페이지를 확인해볼 때 유용하겠다. 

여기까지가 ngrok에 대한 짧은 리뷰였는데 보안이 중요시되는 로컬 환경에서의 사용은 자제하는 것이 좋을 것 같다. 이유는 ngrok 바이너리는 컴파일된 상태라서 실제 내부동작이 어떻게 되는지 알 수 없을뿐더러 그것은 곧 보안에 문제가 있을 수 있다는 것을 의미한다. 예를들면 중계서버로 로컬호스트의 접속정보가 제공되기 때문에 그 서버를 관리하는 누군가에게 내 서버의 문을 열어주고 있는 것과 같을 수 있기 때문이다. 사실 소스코드 내부를 보지 못해서 속단하기는 힘들지만 조심해서 나쁠건 없으니까. 판단은 여러분이 하시면 되겠다.

 

 

댓글
  • 프로필사진 boolsee localhost 에 설치한 agent 와 외부 ngrok 서버간 VPN Tunnel 만들어 주고, 외부 서버에서 port mapping 해서 traffic forward 해 주는 개념으로 보이네요. 본문에서 언급하신 대로 보안이 엄격한 상황에서는 조심해야 하겠지만 평범한 깡통 서버 같은 곳에 개발 모듈 시험 할 때 활용 가능할 것 갈습니다. 좋은 정보네요. 고맙습니다. 2019.05.29 08:19
  • 프로필사진 BlogIcon fistful 정현석입니다. 자매품 serveo.net 도 한번 챙겨보세요. 간편합니다. :-) 2019.07.12 13:18 신고
  • 프로필사진 BlogIcon Jaeyeon Baek 오 전에 글 써주신거보고 잠깐 살펴본것같아요. 근데 나중에 알게된거지만 ngrok이 slack 공식 도큐먼트에도 안내가 되어있더라구요. ㅋㅋㅋ 2019.07.12 20:46 신고
댓글쓰기 폼