내부가 싫어 외부로 나갈래! (FRP)

나는 요즘 회사에서 카카오톡 챗봇을 이용해서 서비스를 개발하고 있는데, 이 챗봇이 내가 만든 API와 잘 상호작용이 되는지 확인하기 위해 API와 챗봇을 연결해야 하는데, API를 외부로 공개해야 하는 문제점이 발생했다! 그래서 나는 우리 회사에서 쓰는 Vercel을 이용해서 Dev브런치에서도 호스트가 되게 설정을 했고 테스트 삼아 한번 들어가봤는데.

아았!

이렇게 Dev브런치 같은 경우 Vercel 계정이 있어야 접속을 할 수 있는 걸 보고, 내가 직접 로컬에서 HTTP를 열어서 해볼까 라는 생각을 했지만, 서버를 열었다 닫았다 해야되는 귀찮니즘이 있었고

내가 외부에서 작업을 하는 경우 직접 서버를 못 연다는 문제점이 있어서 로컬에서 외부로 공개가 가능한 ngrok을 써서 외부 통신을 해볼까라는 생각을 했다. 하지만 한편으로는 "ngrok 같은 오픈 소스를 찾아서 내 서버에 구축해 놓으면 무한정으로 쓸 수 있잖아!"라는 생각이 들어서 오픈 소스를 찾아보니깐 좋은 프로그램이 있어서 소개를 해 보려고 한다!

What is frp?

frp는 fast reverse proxy 의 약자로 frp는 NAT 또는 방화벽 뒤에 있는 로컬 서버를 인터넷에 노출할 수 있는 고속 역방향 프록이다. 그래서 Ngrok처럼 지금 내로컬 컴이 3000으로 열려 있고 내가 이 컴의 IP를 보여주기 싫어! 할경우 frp를 이용해서 로컬과 서버가 연결이 되어서 서버에서 대신 외부로 통신을 할수 있다! (그리고 다른포트로 포트포 해서도 열수 있다!)

GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.
A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. - fatedier/frp

How to use frp?

frp 쓰는 버전은 간단하다. 내가 만약에 외부에 서버나 VM이 있는경우 그곳을 서버(Server)로 지정한 다음에 Client 프로그램으로 쓰면 된다!

Server에는 아래와 같은 설정으로 간단하게 서버를 설정 할수 있다.

bindAddr = "0.0.0.0" //공인IP
bindPort = 1000 //제어포트

auth.method = "token" //인증방식
auth.token = "Tokenhere"

위처럼 간단하게 서버를 설정하고 리눅스 같은경우 ./frps -c frps.toml 으로 커맨트를 치고 실행 하면 간단하게 실행 할수있다! 그리고 로컬에서는 Frp gui(https://github.com/koho/frpmgr)나 원작자가 만든 frpc 라는 클라이언트 프로그램을 이용하면 서버하고 연결이 되어서 그 서버 주소로 외부로 노출이 가능하다.

[common]
server_addr = {서버IP}
server_port = {제어포트}
token = {서버에서 설정한 토큰}

[[proxies]]
name = "nextjs-web"
type = "tcp"
localIP = "127.0.0.1" {클라이언트 IP}
localPort = 3000     # 로컬에서 서버에 연결을 원하는 포트
remotePort = 7001    # 서버에 노출될 포트

위에껀 예시로 이렇게 해놓으면 로컬에서 127.0.0.1:3000 <-> {서버주소}:7001 과 연결 되서 로컬IP가 공개되지 않고 안전하게 이용이 가능하다!

이렇게 서버에서 간단하게 구축을 해놓으면 내가 다른 포트도 서버를 통해서 공개를 하는경우 간단하게 작동을 할수가 있고 여기에 리버스 프록시 까지 결합을 하면 내가 원하는 도메인으로 로컬에서 외부로 노출이 가능하다!