frp简单实现内网穿透
什么是frp
frp
是一个可用于内网穿透的高性能的反向代理应用,支持 tcp
, udp
协议,为 http
和 https
应用协议提供了额外的能力,且尝试性支持了点对点穿透。
frp 源码:https://github.com/fatedier/frp
同类型还有 ngrok
可供选择,这里不讲:
ngrok 官网:https://ngrok.com/
ngrok 源码:https://github.com/inconshreveable/ngrok
为什么使用?
平时使用内网穿透比较多的场景就是用于开发和演示,之前用过NATAPP,魔法隧道,但是都不太稳定,这不,正要用,又出问题了,索性自己搞一个。然后看了 ngrok
和 frp
,感觉都差不多,因为急用,就算选择了傻瓜一点的 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
项,这只是最简化的一个配置,其它功能就需要单独配置,这里我就先加上几个。端口,token
、user
和 pwd
项请自行设置。
bind_port
:表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。dashboard_port
:表示服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。token
:表示用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。dashboard_user
和dashboard_pwd
:表示打开仪表板页面登录的用户名和密码,自行设置即可。vhost_http_port
和vhost_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 并使用自己设置的用户名密码登录,即可看到仪表板界面
服务端后台运行
至此,我们的服务端仅运行在前台,如果Ctrl+C停止或者关闭SSH窗口后,frps均会停止运行,因而我们使用 nohup命令将其运行在后台。
nohup ./frps -c frps.ini &
输出如下内容即表示正常运行
nohup: ignoring input and appending output to 'nohup.out'
此时可先使用 Ctrl+C
关闭 nohup
,frps
依然会在后台运行,使用 jobs
命令查看后台运行的程序
jobs
在结果中我们可以看到 frps
正在后台正常运行
[1]+ Running nohup ./frps -c frps.ini &
此时访问 x.x.x.x:7500
依然可以打开仪表板界面,至此,服务端即设置完成,你可以关闭 SSH
窗口了。
后台的应用想要关闭有三种方法:
1.直接 kill
掉任务号
kill %1
2.找到 pid
,kill
掉
$ 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
:为服务器端口,填入你设置的端口号即可,如果未改变就是7000token
:表示你在服务端设置的连接口令,原样填入即可。local_port
:表示访问到本地后映射的端口,如你想通过域名访问到本地的8080端口,就要改成8080type
:表示转发的协议类型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中就能看到我们配置的
打开 http://xxx:10080
即可访问到本机80端口资源,10080端口就是服务端设置的vhost_http_port
。
后记
其实还有很多配置,TCP,UDP,STCP,可以看看 README
,写得比较详细了:https://github.com/fatedier/frp