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 端口的多路复用,通过同一个端口访问不同的内网服务。 |