0%

frp - 新一代高性能内网穿透工具

介绍

frp是fast reverse proxy的缩写,其可用于反向代理和内网穿透,支持tcp, udp, http, https 协议,这比ngrok还多了个udp。并且发布以来广受欢迎,积累了不少用户,作者也是很勤快,一直在修复bug和更新新特性。

frp项目主页

https://github.com/fatedier/frp
并且,作者是个中国人,所以在GitHub上还有中文文档
https://github.com/fatedier/frp/blob/master/README_zh.md
在你决定用frp之前,先仔细认真的把文档看一遍,虽然很多人都不喜欢看大篇幅的文档,但是这很有必要,有时候你遇到问题久久不能解决的时候,答案恰好文档里有

frp 的作用

1、利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
2、对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
3、利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

安装配置

将 frps 及 frps.ini 放到具有公网 IP 的机器上。
将 frpc 及 frpc.ini 放到处于内网环境的机器上。

外网主机

1
2
3
4
5
#示例版本为0.16(更新于2018.1.30),可前往项目主页releases页面下载最新版本
wget https://github.com/fatedier/frp/releases/download/v0.16.0/frp_0.16.0_linux_amd64.tar.gz
tar -zxvf frp_0.16.0_linux_amd64.tar.gz
cd frp_0.16.0_linux_amd64
vim myfrps.ini

服务端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[common]
#frp服务器监听地址,如果是IPV6地址必须用中括号包围
bind_addr = 0.0.0.0
#frp服务器监听端口
bind_port = 7000

#kcp的udp监听端口,如果不设那就不启用
#kcp_bind_port = 7000
#指定使用的协议,默认tcp,可选kcp
#protocol = kcp

#如果要使用vitual host,就必须设置
#vhost_http_port = 80
#vhost_https_port = 443

#Web后台监听端口
dashboard_port = 7500

#Web后台的用户名和密码
dashboard_user = admin
dashboard_pwd = admin

#Web后台的静态资源目录,调试用的,一般不设
#assets_dir = ./static

#日志输出,可以设置为具体的日志文件或者console
log_file = /var/log/frps.log

#日志记录等级,有trace, debug, info, warn, error
log_level = info
#日志保留时间
log_max_days = 3

#启用特权模式,从v0.10.0版本开始默认启用特权模式,且目前只能使用特权模式
#privilege_mode = true

#特权模式Token,请尽量长点且复杂
privilege_token = 12345678

#特权模式允许分配的端口范围
privilege_allow_ports = 2000-3000,3001,3003,4000-50000

#心跳超时,不用改
#heartbeat_timeout = 90

#每个代理可以设置的连接池上限
#max_pool_count = 5

#认证超时时间,一般不用改
#authentication_timeout = 900

#如果配置了这个,当你的模式为http或https时,就能设置子域名subdomain
#subdomain_host = frps.com

#是否启用tcp多路复用,默认就是true,不用管
#tcp_mux = true
</pre>
保存上面的配置后,使用以下指令启动frp服务端
<pre class="prettyprint linenums" >
nohup ./frps -c ./myfrps.ini &

客户端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[common]
#frp服务器地址
server_addr = 1.2.3.4
#frp服务器端口
server_port = 7000
#特权模式Token
privilege_token = 12345678
#转发SSH
[ssh]
type = tcp
#可以指定为其它IP,默认是本地
#local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
#启用加密
use_encryption = true
#启用压缩
use_compression = true

#转发Web
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
#修改header中的host
#host_header_rewrite = dev.yourdomain.com
#启用简单HTTP认证
#http_user = abc
#http_pwd = abc
#在服务端配置了subdomain_host的情况下用于自定义二级域名
#subdomain = test
#在存在多个相同域名的情况下通过请求的URL路由到不同的配置
#locations = /news,/about
# 加密 , 避免流量被识别
use_encryption = true
# 压缩 , 节省带宽 . 会占用服务器和客户端一点点的CPU
use_gzip = true

#转发DNS请求
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000

#转发Unix域套接字(这儿是Docker)
[unix_domain_socket]
type = tcp
remote_port = 6000
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock

#HTTP代理
[http_proxy]
type = tcp
remote_port = 6000
plugin = http_proxy
#配置http代理的简单认证
#plugin_http_user = abc
#plugin_http_passwd = abc

保存以上配置,启动方式同服务端