frp(s/c) HTTP/HTTPS/TCP/UDP 터널링 설치하기
안녕하세요. 도정진입니다.
최근에 글 본 중에 LTE 라우터에서 외부망 연결하는 방법이나 이런 부분에서 유용할 것 같습니다.
1. 구조 설명
git 주소는 하기와 같습니다.
NAT 환경인 서버에서 외부에서 해당 서비스로 접근하지 못할 경우, 다른 PUBLIC 서버에서 해당 NAT 서버에 있는 서비스를 중계한다고 보시면 됩니다.
이는 SSH 의 R 컨넥션 기능과 거의 동일하다고 보시면 되는데요. 생각보다 이렇게 사용하는게 간단하게 느껴져 간단 테스트를 해보았습니다.
frps 는 서버이며 클라이언트를 받아들일 포트를 하나 설정합니다.
예를 들어 49999 포트를 설정했다고 하고
frpc 는 클라이언트 입니다. frps 서버에 49999포트를 통해 접속합니다.
frpc 에서 릴레이할 HTTP / HTTPS / TCP / UDP 등을 설정하면 frps 가 설치된 서버의 아이피 및 포트로 연결하면 frpc 가 구동중인 서비스로 릴레이가 되는 것입니다.
예로써 하기 그림과 같습니다.
상기와 같은 구조를 가지고 있다고 할때
192.168.0.20:3389 를 외부에서 연결하고 싶다고 하면 일반적인 방법으로는 작동하지 않습니다.
frps / frpc 를 사용하면
frps 를 위한 49999포트를 PUBLIC 서버에서 오픈하고 그리고 frpc 에서 포워딩된 포트 33880 을 오픈합니다.
이때, frpc 는 49999포트로 frps 에 연결하게 되고 frps 는 frpc의 3389포트를 33880포트로 터널링하게 됩니다.
즉, 오른쪽 네트워크의 PC에서는 192.168.0.10:33880 으로 RDP 접근이 가능하고
외부망 test.com (123.123.123.123) 으로는 test.com:33880으로 RDP 접근이 가능합니다.
2. 설치하기
일단은 설치해봐야겠습니다.
소스를 컴파일 할 수 있겠지만, 귀찬아서 release 에 있는 prebuilt를 받습니다.
github.com/fatedier/frp/releases
linux_amd64를 받으시면 됩니다.
서버와 클라이언트 각각 하기와 같이 파일을 배치합니다.
1) 서버
root@debian:~# wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
root@debian:~# tar xf frp_0.36.2_linux_amd64.tar.gz
root@debian:~# cd frp_0.36.2_linux_amd64/
root@debian:~/frp_0.36.2_linux_amd64# cd systemd/
root@debian:~/frp_0.36.2_linux_amd64/systemd# cp frps.service /lib/systemd/system/
root@debian:~/frp_0.36.2_linux_amd64/systemd# cd ..
root@debian:~/frp_0.36.2_linux_amd64# cp frps /usr/bin/
root@debian:~/frp_0.36.2_linux_amd64# mkdir -p /etc/frp
root@debian:~/frp_0.36.2_linux_amd64# cp frps.ini /etc/frp/
root@debian:~/frp_0.36.2_linux_amd64# systemctl daemon-reload
sroot@debian:~/frp_0.36.2_linux_amd64# systemctl start frps
root@debian:~/frp_0.36.2_linux_amd64# systemctl status frps
● frps.service - Frp Server Service
Loaded: loaded (/lib/systemd/system/frps.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2021-04-28 23:42:37 KST; 2s ago
Main PID: 18943 (frps)
Tasks: 7 (limit: 4915)
Memory: 8.1M
CGroup: /system.slice/frps.service
└─18943 /usr/bin/frps -c /etc/frp/frps.ini
Apr 28 23:42:37 debian systemd[1]: Started Frp Server Service.
Apr 28 23:42:37 debian frps[18943]: 2021/04/28 23:42:37 [I] [root.go:200] frps uses config file: /etc/frp/frps.ini
Apr 28 23:42:37 debian frps[18943]: 2021/04/28 23:42:37 [I] [service.go:192] frps tcp listen on 0.0.0.0:7000
Apr 28 23:42:37 debian frps[18943]: 2021/04/28 23:42:37 [I] [root.go:209] frps started successfully
2) 클라이언트
root@debian:/home/djjproject# wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
root@debian:/home/djjproject/frp_0.36.2_linux_amd64# mkdir -p /etc/frp
root@debian:/home/djjproject/frp_0.36.2_linux_amd64# cp frpc.ini /etc/frp/
root@debian:/home/djjproject/frp_0.36.2_linux_amd64# cd systemd/
root@debian:/home/djjproject/frp_0.36.2_linux_amd64/systemd# cp frpc.service /lib/systemd/system/
root@debian:/home/djjproject/frp_0.36.2_linux_amd64/systemd# systemctl daemon-reload
root@debian:/home/djjproject/frp_0.36.2_linux_amd64/systemd# systemctl start frpc
frpc.service frpc@.service
root@debian:/home/djjproject/frp_0.36.2_linux_amd64/systemd# systemctl start frpc.service
root@debian:/home/djjproject/frp_0.36.2_linux_amd64/systemd# systemctl status frpc
● frpc.service - Frp Client Service
Loaded: loaded (/lib/systemd/system/frpc.service; disabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Wed 2021-04-28 23:41:35 KST; 3s ago
Process: 31242 ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini (code=exited, status=1/FAILURE)
Main PID: 31242 (code=exited, status=1/FAILURE)
자 이렇게 일단 설치를 완료 하였습니다.
3. 설정
일단 서버측 설정부터 하기와 같이 설정합니다.
[common]
# 포트와 바인드 아이피 설정
bind_port = 49999
bind_udp_port = 49999
bind_addr = 0.0.0.0
# 로그 파일 위치 지정
log_file = /var/log/frps.log
# 토큰으로 클라이언트와 인증
authentication_method = token
token = 12345678
# 33890 및 6000 포트로만 터널링 할 수 있게 설정 (not mandatory)
allow_ports = 33880,6000
다음으로 클라이언트 설정입니다.
[common]
# 연결할 서버와 포트를 적습니다.
server_addr = test.com
server_port = 49999
# 인증방식을 토큰으로 하며 서버 설정과 같아야합니다.
authentication_method = token
token = 12345678
[ssh]
# SSH 설정
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 리모트에서 사용할 포트
remote_port = 6000
[rdp]
# rdp 설정
type = tcp
local_ip = 192.168.0.20
local_port = 3389
remote_port = 33880
이렇게 설정하고 서비스를 양쪽에서 재시작 합니다.
systemd 서비스로 에러가 나면 재시작하게 되어 있어서 순차적으로 하실 필요는 없습니다.
root@debian:/home/djjproject/frp_0.36.2_linux_amd64# systemctl restart frpc
root@debian:~/frp_0.36.2_linux_amd64# systemctl restart frps
4. 사용방법
그럼 서버측에서 ssh 연결 해보겠습니다.
root@debian:~/frp_0.36.2_linux_amd64# ssh djjproject@localhost -p 6000
Linux debian 5.4.65-1-pve #1 SMP PVE 5.4.65-1 (Mon, 21 Sep 2020 15:40:22 +0200) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Apr 28 23:58:20 2021 from 127.0.0.1
djjproject@debian:~$
리모트 서버에 잘 연결됩니다.
동일 서브넷에서는 192.168.0.10:6000 / 외부망 연결시 6000번을 포트포워딩 해주면 됩니다.
다음으로 서버측아이피:33890 으로 RDP 연결해보겠습니다.
잘 연결됩니다.
33890을 제 도메인으로 65534로 포트포워딩 하고 하기와 같이 연결도 가능합니다.
5. 결론
기숙사나 외부 포트포워딩이 안되는 환경에서 역 터널링을 해야할 경우,
외부에 public 서버가 있으면 이렇게 쉽게 public 서버로 액세스 하는 것처럼 만드실 수 있습니다.
감사합니다.