目录

frp简单实现内网穿透

什么是frp

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp , udp 协议,为 httphttps 应用协议提供了额外的能力,且尝试性支持了点对点穿透。

frp 源码:https://github.com/fatedier/frp

同类型还有 ngrok 可供选择,这里不讲:

ngrok 官网:https://ngrok.com/

ngrok 源码:https://github.com/inconshreveable/ngrok

为什么使用?

平时使用内网穿透比较多的场景就是用于开发和演示,之前用过NATAPP,魔法隧道,但是都不太稳定,这不,正要用,又出问题了,索性自己搞一个。然后看了 ngrokfrp ,感觉都差不多,因为急用,就算选择了傻瓜一点的 frp

准备工作

一台公网能访问的服务器,这里以 CentOS 7 举例。

服务端配置

frp 需要服务端和客户端的配置,首先来看看服务端配置。

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

不知道下载哪个?

SSH 连接到 VPS 之后运行如下命令查看处理器架构,根据架构下载不同版本的 frp

输入:arch 命令查看结果,如果是 X86_64 即可选择 amd64,运行如下命令,根据架构不同,选择相应版本并进行下载,比如我的centos服务器是 X86_64 那就应该下载 linux_amd64.tar.gz 版本。

进入某个文件夹,输入下载命令

wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz

然后解压

tar -zxvf frp_0.27.0_linux_amd64.tar.gz

文件夹改个名,方便使用

cp -r frp_0.27.0_linux_amd64 frp

把解压出来的文件夹复制到你想要的目录下,为了方便我直接放在用户目录下了,进入该目录

cd frp

查看一下文件

ls -a

我们只需要关注如下几个文件

  • frps
  • frps.ini
  • frpc
  • frpc.ini

前两个文件( s结尾代表server )分别是服务端程序和服务端配置文件,后两个文件( c结尾代表client )分别是客户端程序和客户端配置文件。

因为我们正在配置服务端,所以用不到客户端的两个文件,直接修改frps.ini文件

vim frps.ini

这个文件应有如下格式:

[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443

可能你打开只有一个 bind_port 项,这只是最简化的一个配置,其它功能就需要单独配置,这里我就先加上几个。端口,tokenuserpwd 项请自行设置。

  • bind_port:表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
  • dashboard_port:表示服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。
  • token:表示用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。
  • dashboard_userdashboard_pwd:表示打开仪表板页面登录的用户名和密码,自行设置即可。
  • vhost_http_portvhost_https_port:用于反向代理HTTP主机时的端口,这就是我主要想干的。

编辑完成后保存,之后我们就可以运行frps的服务端了

./frps -c frps.ini

如果看到屏幕输出这样一段内容,即表示运行正常,如果出现错误提示,请检查上面的步骤。

2019/06/26 15:40:00 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000
2019/06/26 15:40:00 [I] [service.go:172] http service listen on 0.0.0.0:10080
2019/06/26 15:40:00 [I] [service.go:193] https service listen on 0.0.0.0:10443
2019/06/26 15:40:00 [I] [service.go:216] Dashboard listen on 0.0.0.0:7500
2019/06/26 15:40:00 [I] [root.go:210] Start frps success

此时访问 x.x.x.x:7500 并使用自己设置的用户名密码登录,即可看到仪表板界面

frp简单实现内网穿透

服务端后台运行

至此,我们的服务端仅运行在前台,如果Ctrl+C停止或者关闭SSH窗口后,frps均会停止运行,因而我们使用 nohup命令将其运行在后台。

nohup ./frps -c frps.ini &

输出如下内容即表示正常运行

nohup: ignoring input and appending output to 'nohup.out'

此时可先使用 Ctrl+C 关闭 nohupfrps 依然会在后台运行,使用 jobs 命令查看后台运行的程序

jobs

在结果中我们可以看到 frps 正在后台正常运行

[1]+  Running                 nohup ./frps -c frps.ini &

此时访问 x.x.x.x:7500 依然可以打开仪表板界面,至此,服务端即设置完成,你可以关闭 SSH 窗口了。

后台的应用想要关闭有三种方法:

1.直接 kill 掉任务号

kill %1

2.找到 pidkill

$ jobs -l
[1]+ 11076 Running nohup java -jar adapter-minisite.jar /tomcat-1 /tomcat-2 > logs.txt 2>&1 &
$ kill 11076

3.置为前端运行再关掉

fg %n # 置为前端运行

Ctrl + c # 退出

客户端配置

frp 的客户端就是我们想要真正进行访问的那台设备,一般也就是本机,同样地,根据客户端设备的情况选择相应的frp程序进行下载,我的是 mac os x,那就应该下载 darwin_amd64.tar.gz,下载解压后打开 frpc.ini 进行修改:

[common]
server_addr = xxx.xxx.xx.xxx
server_port = 7000
token = 12345678

[web]
type = http
local_port = 80
custom_domains = google.com

[web] 即为配置 “自定义域名访问部署于内网的 web 服务”。

[xxx] 表示一个规则名称,自己定义,便于查询即可。

  • server_addr:为服务端IP地址,填入即可。

  • server_port:为服务器端口,填入你设置的端口号即可,如果未改变就是7000

  • token:表示你在服务端设置的连接口令,原样填入即可。

  • local_port:表示访问到本地后映射的端口,如你想通过域名访问到本地的8080端口,就要改成8080

  • type:表示转发的协议类型

  • custom_domains:自定义域名,需要将域名解析到服务端IP,也就是上面的 server_addr

如我有一个域名为:google.com,想通过它访问到本地8080端口的服务,这里就需要配置成

local_port = 8080
custom_domains = google.com

配置修改好后即可运行

./frpc -c ./frpc.ini

运行成功

2019/06/26 15:50:01 [I] [service.go:221] login to server success, get run id [440965e4e], server udp port [0]
2019/06/26 15:50:01 [I] [proxy_manager.go:137] [440965e4e] proxy added: [web]
2019/06/26 15:50:02 [I] [control.go:144] [web] start proxy success

在HTTP中就能看到我们配置的

frp简单实现内网穿透

打开 http://xxx:10080 即可访问到本机80端口资源,10080端口就是服务端设置的vhost_http_port

后记

其实还有很多配置,TCP,UDP,STCP,可以看看 README,写得比较详细了:https://github.com/fatedier/frp