서버/리눅스 서버

frp(s/c) HTTP/HTTPS/TCP/UDP 터널링 설치하기

ㅋㅋ잠자 2021. 4. 26. 21:03
반응형

안녕하세요. 도정진입니다.

 

최근에 글 본 중에 LTE 라우터에서 외부망 연결하는 방법이나 이런 부분에서 유용할 것 같습니다.

 

1. 구조 설명

git 주소는 하기와 같습니다.

github.com/fatedier/frp

 

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

 

Releases · fatedier/frp

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

github.com

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 서버로 액세스 하는 것처럼 만드실 수 있습니다.

 

감사합니다.

반응형