我们公司内网已经不在使用ngrok而换成frp了,综合使用了nginx、IIS、Apache、ntbind、gogs等综合应用搭建了内部的业务系统,在经过半年多使用后感觉挺稳定和方便。因此写下这个笔记记录相关的技术要点给小伙伴们和自己以后配置参考。

环境和需求

  1. 公网服务器(至少要有公网IP最好是linux,我们用的阿里云)
  2. 内网服务器或电脑(得益于frp是go语言写的跨平台,可以是windows、linux、树莓派等几乎任何可联网设备。我用的windows)
  3. 内网路由器控制权(需要搭建内网开发测试环境需要,不需要协作的可以直接在自己电脑里改host文件解析实现)

设计思路

数据流程是这样的:

域名a.com解析到公网IP(12.12.12.12为示例IP),公网搭建nginx添加a.com反向代理到公网服务器的8080端口,用户访问a.com到达公网的nginx,nginx转发请求到8080端口,frp服务端配置http监听端口为8080,内网的frp客户端负责转发内网服务器的80端口到frp服务器的8080端口同时制定只监听a.com这个域名。至此内网web已经能完全转发到外网了。如果需要内网开发调试环境同时不要求公司每个人都改host文件绑定a.com可以在内网服务器上使用ntbind搭建dns服务器,把内网服务器IP地址设置到路由器的dhcp部分的dns服务器那里,这样公司用户访问a.com是直接走了内网,从外网访问a.com是走了frp穿透。

第一步:公网搭建配置nginx

nginx的安装应该不用赘述了,网上有lnpm一键包、wdcp一键包等,主要写写我的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 80;
server_name a.com;
location / {
proxy_pass http://127.0.0.1:8080;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

这里就指明访问a.com的时候nginx直接代理到本服务器的8080端口。

第二步:在公网服务器安装配置frps服务端

在公网服务器上安装frp可以直接通过github下载安装配置,但是这里推荐使用[一键包](【填坑完毕】内网穿透利器Frp一键安装脚本及设置教程 - 插件 - KoolShare - 源于玩家 服务玩家 “一键包”)安装,注意一键包只适用于debian、ubuntu、CentOS,测试过的系统如下:

CentOS 6 32/64bit
CentOS 7 32/64bit
Debian 6 32/64bit
Debian 7 32/64bit
Debian 8 32/64bit
Ubuntu 14 32/64bit

安装命令:

1
2
3
wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh
chmod 700 ./install-frps.sh
./install-frps.sh install

流程:
需要注意Please input frps vhost_http_port这里为了不和公网的nginx冲突我使用了8080端口,还有ssl端口默认是443我使用了4433,这样公网服务器可以继续作为web服务器正常使用。

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
Loading network version for frps, please wait...
frps Latest release file frp_0.8.1_linux_amd64.tar.gz #此步骤会自动获取frp最新版本,自动操作,无需理会
Loading You Server IP, please wait...
You Server IP:12.12.12.12 #自动获取你服务器的IP地址
Please input your server setting:

Please input frps bind_port [1-65535](Default Server Port: 5443): #输入frp提供服务的端口,用于服务器端和客户端通信
Please input frps dashboard_port [1-65535](Default dashboard_port: 6443): #输入frp的控制台服务端口,用于查看frp工作状态
Please input frps vhost_http_port [1-65535](Default vhost_http_port: 80): #输入frp进行http穿透的http服务端口 这里我使用了8080
Please input frps vhost_https_port [1-65535](Default vhost_https_port: 443): #输入frp进行https穿透的https服务端口 这里为使用了4433
Please input privilege_token (Default: WEWLRgwRjIJVPx2kuqzkGnvuftPLQniq): #输入frp服务器和客户端通信的密码,默认是随机生成的
Please input frps max_pool_count [1-200](Default max_pool_count: 50): #设置每个代理可以创建的连接池上限,默认50

##### Please select log_level #####
1: info
2: warn
3: error
4: debug
#####################################################
Enter your choice (1, 2, 3, 4 or exit. default [1]): #设置日志等级,4个选项,默认是info


Please input frps log_max_days [1-30]
(Default log_max_days: 3 day): #设置日志保留天数,范围是1到30天,默认保留3天。

##### Please select log_file #####
1: enable
2: disable
#####################################################
Enter your choice (1, 2 or exit. default [1]): #设置是否开启日志记录,默认开启,开启后日志等级及保留天数生效,否则等级和保留天数无效

确定无误后回车会自动安装,稍等片刻安装结束会显示如下的配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Congratulations, frps install completed!
==============================================
You Server IP : 12.12.12.12
Bind port : 5443
Dashboard port : 6443
vhost http port : 8080
vhost https port: 4433
Privilege token : WEWLRgwRjIJVPx2kuqzkGnvuftPLQniq
Max Pool count : 50
Log level : info
Log max days : 3
Log file : enable # 将上面信息添加到你的路由器frp穿透插件中吧
==============================================
frps Dashboard: http://12.12.12.12:6443/ # 这个是frp控制台访问地址
==============================================

更新:安装时配置的Dashboard user和Dashboard pwd为打开http://12.12.12.12:6443/ 这个状态控制台的账号和密码
可以把以上信息保存下来备用。一键包可以直接安装frp为系统服务非常方便,默认安装的目录是:/usr/local/frps/后期需要更改配置的可以进入这个目录修改frps.ini文件。另附常用命令:

1
2
3
4
5
6
7
8
9
更新frps:./install-frps.sh update
卸载frps:./install-frps.sh uninstall
管理:
/etc/init.d/frps start
/etc/init.d/frps stop
/etc/init.d/frps restart
/etc/init.d/frps status
/etc/init.d/frps config
/etc/init.d/frps version

第三步:内网安装frpc客户端

这里我们已gogs为例,我在内网的windows服务器上安装了git服务器监听在3000端口,现在想通过访问a.com直接能访问到内网的git服务器。同时想把内网服务器的一个网盘的8049端口穿透出去。
这里请点击第二步里的frp的github发布页下载frp编译好的二进制包,这里我感觉内网服务器选择里 frp_0.14.0_windows_amd64.zip。下载后解压到D盘,配置目录下的frpc.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
[common]
server_addr = 12.12.12.12
server_port = 5443 #上一步的服务器Bind port

log_file = ./frpc.log #日志和日志等级
# debug, info, warn, error
log_level = debug
log_max_days = 3

privilege_token = WEWLRgwRjIJVPx2kuqzkGnvuftPLQniq #上一步的连接密码Privilege token

pool_count = 20 #连接数调优可以参考frp的中文文档 下同
tcp_mux = true
protocol = tcp

#git服务器配置
[git]
type = http #协议类型
local_ip = 127.0.0.1 #本地IP
local_port = 3000 #本地端口
use_gzip = false #是否gzip压缩输出
pool_count = 20 #连接数调优请参考frp文档
custom_domains = a.com #绑定的域名
#网盘8049端口
[panupload]
type = tcp #tcp类型
local_port = 8049 #本地端口
remote_port = 8059 #要穿透到服务器的端口,这里就可以通过12.12.12.12:8059或a.com:8059来访问内网的8049上的网盘了

配置完成后通过命令行进入D:\frp运行:D:\frp\frpc.exe -c D:\frp\frpc.ini(这里我把frp解压到了D盘,根据你自己的情况修改)。注意,frpc客户端运行成功后并没有任何反应,需要登录到上一步的控制台查看:http://12.12.12.12:6443/

结语

如上就已经搭建完成了,这样我们可以把内网的web和tcp端口或者udp端口穿透到外网了。包括很多小伙伴头疼的微信公众号开发的调试也可以挪到内网了。非常感谢frp和一键包的小伙伴。下一篇主要写ntbind、IIS、Apache怎么和frp配合。

参考资料

frp
[内网穿透利器Frp一键安装脚本及设置教程](【填坑完毕】内网穿透利器Frp一键安装脚本及设置教程 - 插件 - KoolShare - 源于玩家 服务玩家 “内网穿透利器Frp一键安装脚本及设置教程”)
frp中文文档
感谢以上作者和贡献者。