frp的使用和配置

frp的使用和配置

[TOC]

一、介绍

本质的原理一句话,注意看箭头的方向:

内网服务 <- 内网frpc -> 主动连接外网服务器的frps <- 外部系统调用frps的暴露服务和端口。

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

frp 主要由 客户端(frpc)服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。

内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。

用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

二、安装

github的下载地址: https://github.com/fatedier/frp/releases

相关的中文说明文档: https://gofrp.org/docs/examples/

安装完了,本地目录如下:

/Users/suitm/sdk/frp/frp_0.34.3_darwin_amd64>ls -ltr
total 49112
-rwxr-xr-x@ 1 suitm  staff  10697880 11 20 17:15 frpc
-rwxr-xr-x@ 1 suitm  staff  14404296 11 20 17:15 frps
drwxr-xr-x@ 6 suitm  staff       192 11 20 17:19 systemd
-rw-r--r--@ 1 suitm  staff      4928 11 20 17:19 frps_full.ini
-rw-r--r--@ 1 suitm  staff        26 11 20 17:19 frps.ini
-rw-r--r--@ 1 suitm  staff      8328 11 20 17:19 frpc_full.ini
-rw-r--r--@ 1 suitm  staff       126 11 20 17:19 frpc.ini
-rw-r--r--@ 1 suitm  staff     11358 11 20 17:19 LICENSE

三、使用

1. 资源

  • 1台云服务器,有外网IP,用于运行frps
  • 本机或者内网服务器,无外网IP,但是可以连接云服务器, 用于运行frpc

2. 启动本地服务

随意写了一个socket的recv程序,就是接收消息,然后返回固定的应答。

/Users/suitm/tmp>./icesky_rcv 8000

--->服务启动成功开始监听!

--->开始等待接收请求

3. 配置和启动frps服务

修改云服务器上的配置文件,7000是frp的内部服务端口

[root@VM_0_10_centos frp_0.34.3_linux_386]# cat frps.ini
[common]
bind_port = 7000

在云服务器上,启动frps服务./frps -c ./frps.ini

[root@VM_0_10_centos frp_0.34.3_linux_386]# ./frps -c ./frps.ini
2020/12/09 18:08:30 [I] [service.go:190] frps tcp listen on 0.0.0.0:7000
2020/12/09 18:08:30 [I] [root.go:215] start frps success

4. 配置和启动frpc服务

修改frpc配置文件,server地址配置云服务器地址,port配置云上的bind_port,local_port是实际的服务端口,remote_port是外网要暴露的端口

[common]
server_addr = 49.233.140.2
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 8000
remote_port = 6000

4. 启动frpc服务

./frpc ./frpc.ini

服务端无法连接:

/Users/suitm/sdk/frp/frp_0.34.3_darwin_amd64>./frpc -c ./frpc.ini
2020/12/09 18:02:51 [W] [service.go:102] login to server failed: dial tcp 49.233.140.2:7000: connect: connection refused
dial tcp 49.233.140.2:7000: connect: connection refused

服务端连接成功:

[root@VM_0_10_centos frp_0.34.3_linux_386]# ./frps -c ./frps.ini
2020/12/09 18:04:30 [I] [service.go:190] frps tcp listen on 0.0.0.0:7000
2020/12/09 18:04:30 [I] [root.go:215] start frps success

5. frps的连接日志

frpc连接成功后, frps会刷新数据,可以看到具体的端口使用:

2020/12/09 18:11:40 [I] [service.go:444] [49f600066d396a92] client login info: ip [111.205.93.29:56969] version [0.34.3] hostname [] os [darwin] arch [amd64]
2020/12/09 18:11:40 [I] [tcp.go:63] [49f600066d396a92] [ssh] tcp proxy listen port [6000]
2020/12/09 18:11:40 [I] [control.go:446] [49f600066d396a92] new proxy [ssh] success

6. 连接测试

使用telnet进行测试,telnet 49.233.140.2 6000, 1234是我输入的,sucessend是默认服务返回的。

M.16/root>telnet 49.233.140.2 6000
Trying 49.233.140.2...
Connected to 49.233.140.2.
Escape character is '^]'.
1234
sucesssend 
Connection closed by foreign host.
M.16/root>

看一下云上frps的日志:

2020/12/09 18:14:12 [I] [proxy.go:103] [49f600066d396a92] [ssh] get a new work connection: [111.205.93.29:56969]

看一下本机的frpc的日志:

未刷新

看一下本机的实际的执行日志:

子进程--->接收到IP=127.0.0.1的请求!
收到报文内容为:【1234
】

四、优化

1. 静默启动

  • 客户端frpc
/Users/suitm/sdk/frp>cat start.frpc.sh
cd ./frp_0.34.3_darwin_amd64
./frpc -c ./frpc.ini &
cd -

/Users/suitm/sdk/frp>cat stop.frpc.sh
kill -9 `ps -aef | grep frpc  | awk '{if($8!~/grep/) print $2}'`
  • 服务端frps
    
    [root@VM_0_10_centos frp]# cat start.frps.sh
    cd ./frp_0.34.3_linux_386
    ./frps -c ./frps.ini &
    cd -

[root@VM_0_10_centos frp]# cat stop.frps.sh kill -9 ps -aef | grep frps | awk '{if($8!~/grep/) print $2}'


### 2. 常用配置

- 客户端配置

```ini
/Users/suitm/sdk/frp/frp_0.34.3_darwin_amd64>cat frpc.ini
[common]
server_addr = 49.233.140.2
server_port = 7000

#日志
log_file = ./frpc.log
log_level = info
log_max_days = 3

#连接密码
authentication_method = token
token = 123456

#管理端
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 8000
remote_port = 6000
  • 服务端配置
[root@VM_0_10_centos frp_0.34.3_linux_386]# cat frps.ini
[common]
bind_port = 7000

# 管理端
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin

# 日志
log_file = ./frps.log
log_level = info
log_max_days = 3

# 密码
authentication_method = token
token = 123456

3. web页面(如非必要不要开启)

frps服务端:

dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin,如果不需要,需要主动设置为空
dashboard_user = admin
dashboard_pwd = admin

frpc客户端:

admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

4. 其他功能按需选择

  • 可以按范围映射端口
  • 可以做负载均衡和健康检查
  • 可以做传输加密
  • 可以用插件,支持http转https,socks5之类的
  • 客户端可以热加载配置
  • 可以限流
  • 可以限制绑定端口等
  • 支持vhost_port,可以复用端口,按协议进行跳转。

支持的类型如下:

类型 描述
tcp 单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
udp 单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
http 针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header,增加鉴权。
https 针对 HTTPS 应用定制了一些额外的功能。
stcp 安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
sudp 安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
xtcp 点对点内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转。
tcpmux 支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务。