我们公司内网已经不在使用ngrok而换成frp了,综合使用了nginx、IIS、Apache、ntbind、gogs等综合应用搭建了内部的业务系统,在经过半年多使用后感觉挺稳定和方便。因此写下这个笔记记录相关的技术要点给小伙伴们和自己以后配置参考。
环境和需求
公网服务器(至少要有公网IP最好是linux,我们用的阿里云)
内网服务器或电脑(得益于frp是go语言写的跨平台,可以是windows、linux、树莓派等几乎任何可联网设备。我用的windows)
内网路由器控制权(需要搭建内网开发测试环境需要,不需要协作的可以直接在自己电脑里改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 Loading You Server IP, please wait ... You Server IP:12.12.12.12 Please input your server setting: Please input frps bind_port [1-65535](Default Server Port: 5443): Please input frps dashboard_port [1-65535](Default dashboard_port: 6443): Please input frps vhost_http_port [1-65535](Default vhost_http_port: 80): Please input frps vhost_https_port [1-65535](Default vhost_https_port: 443): Please input privilege_token (Default: WEWLRgwRjIJVPx2kuqzkGnvuftPLQniq): Please input frps max_pool_count [1-200](Default max_pool_count: 50): 1: info 2: warn 3: error 4: debug Enter your choice (1, 2, 3, 4 or exit . default [1]): Please input frps log_max_days [1-30] (Default log_max_days: 3 day): 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 ============================================== frps Dashboard: http://12.12.12.12:6443/ ==============================================
更新:安装时配置的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中文文档 感谢以上作者和贡献者。