집에 있는 로컬 PC를 외부 인터넷 망에서 http 또는 https로 접속하는 방법은 공유기에 포트 포워딩을 설정하는 방법을 많이 사용했습니다. 공유기 포트 포워딩 설정보다 간단하게 외부 인터넷망에서 로컬 PC로 접속하는 방법을 제공하는 ngrok을 설명하도록 하겠습니다. 개발 목적으로 임시로 domain을 할당을 받거나, WebHook을 테스트할 때 유용합니다. 현재는 ngrok은 오픈 소스로 개발되는 툴이 아니고, 유료 서비스로 무료 서비스인 경우 일부 기능에 제한이 있습니다.
1. ngrok 이란
ngrok는 NAT 및 방화벽 뒤에 있는 로컬 서버를 보안 터널을 통해 공용 인터넷에 접속하는 방법을 제공합니다. snap의 ngrok 설치 페이지에서는 아래와 같이 설명되어 있습니다.
ngrok: Secure tunnels to local host
What can I do ngrok (출처: ngrok snap 설치 가이드, ngro.com)
• Expose any http service behind a NAT or firewall to the internet on a subdomain of ngrok.com.
• Expose any tcp service behind a NAT or firewall to the internet on a random port of ngrok.com.
• Inspect all http requests/responses that are transmitted over the tunnel.
• Replay any request that was transmitted over the tunnel.
what is ngrok useful for (출처: ngrok snap 설치 가이드, ngro.com)
• Temporarily sharing a website that is only running on your development machine.
• Demoing an app at a hackathon without deploying.
• Developing any services which consume webhooks (HTTP callbacks) by allowing you to replay those requests.
• Debugging and understanding any web service by inspecting the HTTP traffic.
• Running networked services on machines that are firewalled off from the Internet.
2. ngrok 설치
ngrok 설치는 dashboard.ngrok.com/get-started/setup 에서 OS에 맞는 zip 파일을 다운로드하고 압축을 풀면 됩니다. 실행파일 하나뿐이라 별도의 설치 과정이 없습니다. 공식적으로 윈도, 리눅스, MacOS를 지원합니다. 우분투에서 snap으로 설치 시 다운로드 사이트와 동일한 버전(v2.3.35)으로 설치됩니다.
・ 리눅스에서 snap으로 설치
$ sudo snap install ngrok
・윈도우 설치 링크: bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-windows-386.zip
・Mac 설치 링크: bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-darwin-386.zip
우분투에서 ngrok을 설치하고 실행하면 아래와 같이 ngrok 명령어 설명과 명령어 옵션이 나옵니다.
3. ngrok 실행
ngrok 은 터미널에서 $ ngrok http <로컬 포트>로 실행합니다. Domain name을 설정을 제외하고 무료 버전에서도 ① http 또는 https 외부 요청 사항을 로컬 호스트로 포워딩, ② 특정 서버로 포워딩, ③ 외부 tcp 트래픽을 22번 포트로 포워딩 기능은 정상적으로 동작합니다. 포트 번호는 사용자 지정이 가능합니다.
# 외부의 http 요청을 로컬 호스트의 80 포트로 전달
$ ngrok http 80
3.1. Authtoken 추가
우분투에서 snap으로 설치한 경우 ngrok.com 계정을 등록하지 않아도 사용 가능하지만 세션이 8시간만 유지됩니다. ngork.com의 계정을 등록하면 아래와 같이 authtoken을 발급해주며 터미널에서 $ ngrok authtoken <token id>로 설정 가능합니다.
# ~/.ngrok2/ngrok.yml 파일에 저장됨
$ ./ngrok authtoken 1lF2daWURub7wIVOqTidWjeqvMt_2rrzeR8Jf3SUskz8xV3TJ
4. 실행 결과
ngok을 실행하면 authtoken 유무에 따라서 유효 시간의 차이를 알 수 있습니다. 첫 번째는 authtoken 설정 없이 실행한 결과이고, 두 번째는 ngrok.com에서 받은 authtoken을 설정 후 실행한 결과로 유효 시간에 제한이 없습니다. 또한 무료 계정인 경우에는 ngrok을 실행할 때마다 domain 주소가 랜덤하게 변경됩니다.
ngrok에서 확인한 domain 주소인 http://e5a 6 ae5037 ee.ngrok.io으로 브라우저로 접속한 결과 Local host의 80 포트로 외부 트랙을 전달합니다.
5. Web Interface 사용
ngrok의 장점 중 하나는 web interface를 지원하는 것입니다. http://127.0.0.1:4040 으로 접속하면 ngrok에서 받은 http request에 대한 response 내용, 요약, Header, Raw, binary 데이터 확인이 가능합니다.
6. ngrok 유료 서비스 정리
ngrok 서비스 비용은 아래와 같습니다. 개인 테스트 목적으로 사용하기에는 문제는 없어 보이나, 상용으로는 1분당 120개 연결까지 지원한다고 합니다.
7. 요약정리
- 계정 가입을 하지 않은 경우 snap으로 설치 가능하고, 세션은 8시간 동안 유지 가능
- 계정 가입하는 경우 Auth Token을 발급되어 세션의 만료 기간은 제한 없음
- 외부에서 http와 https 접속하는 경우 Localhost의 80 포트로 포워딩 가능 (일부 API의 Web Hook은 https 접속을 요구 하기도 함)
- 무료 서비스는 sub domain name이 램덤하게 생성되며, ngrok 재 실행 시 변경된다. → Domain Name을 특정 서버에 등록하는 경우 (예를 들어, OAutho 2.0 redirect URL로 등록) 불편함
- Web interface는 http://127.0.0.1:4040으로 접속하면 request에 대한 요약을 확인할 수 있습니다.
관련 글
[개발환경/Tips] - Spotify 한국에서 사용하는 방법
[모바일 SW 개발/REST API] - 무료 REST API 테스트 프로그램: Postman (설치, 활용법)
[모바일 SW 개발/REST API] - 자주 사용하는 curl 명령어 옵션과 예제
[모바일 SW 개발/REST API] - 공공 데이터 Open API 사용법: 코로나 확진자 현황 API (sample code)
[개발환경/Web Server] - Website 전체 백업 방법: HTTrack (티스토리 백업에 활용)
[개발환경/우분투] - Docker 개념과 명령어 사용 방법 및 예제
[개발환경/Google Cloud Platform] - IP Address CIDR 표현법과 사용 예
[개발환경/Google Cloud Platform] - GCP에서 Squid를 이용한 Proxy 서버 설정 방법
[개발환경/Oracle Cloud] - Oracle Cloud SSH Key 여러 개 등록하기 (여러 PC에서 Cloud Access)
[개발환경/Oracle Cloud] - Oracle Cloud 방화벽 설정 (http/https 특정 포트 열기)
[개발환경/Oracle Cloud] - 오라클 클라우드 '평생' 무료 VM 만들기 (Google Cloud 무료 조건 비교)
[개발환경/Web Server] - 우분투 20.04에서 Flask를 서비스 등록: 부팅 시 자동 실행
[개발환경/Web Server] - 우분투 20.04에서 lighttpd의 fastcgi 개념 및 사용법
[개발환경/Web Server] - Python: Web Framework Flask 사용하기
[개발환경/Web Server] - Web 서버 GET/POST CGI 사용법 (QUERY_STRING / CONTENT_LENGTH)
[개발환경/Web Server] - 우분투 20.04에서 Web 서버 설치 방법 (apache2, tomcat9)
댓글