百度百科是这么表述的:
内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。
简单的表述就是:
让外网能够访问本地的服务。
通俗的例子是这样的:
假设你本机电脑搭建了一个博客网站,想让深圳的朋友看一眼效果,那么通过这个内网穿透技术,就可以给远在深圳的同学直接电脑/手机访问网站。
结构图
这里说明一下:
•User:互联网外的主机
•frps:frp的服务端,它是一台拥有公网IP的服务器地址。
•frpc: frp的客户端,它会跟frp服务端进行沟通。
•tcp or http service:提供tcp或者http的服务,比如你电脑启动了一个网页服务器。
根据上面的图,讲解下大致的流程:
1.frps所在的服务器(比如开放了公网端口7000),对外提供这个服务。
2.frpc配置frps的信息,连接到frps,建立一条通道。
3.frpc配置好本地的端口(比如5432端口)和对应公网端口(80端口)之间的关系。
4.当User用户访问frps所在的服务器开放的端口(如公网80端口),frps接收到连接请求之后马上把这连接请求通过先前建立好的隧道转发到frpc内网主机。
5.内网主机收到隧道发来的数据,进行内网服务【tcp or http service】的数据请求,直到【tcp or http service】服务返回了响应数据。
6.内网主机再将数据返回给frps服务端。
7.frps服务器的服务(80端口)返回给User用户相应的资源。
终于到正题了,不容易。
去官网下载(https://github.com/fatedier/frp/releases)相应平台的压缩包,这里我是64位linux系统。
$ wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
$ tar zxf frp_0.33.0_linux_amd64.tar.gz
$ cd frp_0.33.0_linux_amd64
$ rm frpc*
$ cat frps.ini
[common]
bind_port = 17000
这里说明下参数,bind_port 是监听的端口,后面frpc配置服务端端口需要配置此端口。
$ ./frps -c frps.ini
如果要后台运行,通过nohup方式进行后台启动。
$ nohup ./frps -c frps.ini &
$ tar zxf frp_0.33.0_linux_amd64.tar.gz
$ cd frp_0.33.0_linux_amd64
$ rm frps*
cat frpc.ini
[common]
server_addr = 公网IP地址
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
这里说明下参数:
•server_addr: 填写frps服务端的公网IP
•server_port: 填写frps服务端的端口
•[xxx] : 这个是服务名,可以任意修改,本例命名为ssh,注意多个规则不能重复名字。
•type: 连接类型,比如http、tcp。ssh方式连接就用tcp。
•local_ip: 填写本地服务的IP
•local_port: 填写本地服务的端口
•remote_port: frps服务端公网的开放端口,这里需要注意不是frps服务的端口。
$ ./frpc -c frpc.ini
如果要后台运行,通过nohup方式进行后台启动。
$ nohup ./frpc -c frpc.ini &
$ cat frps.ini
[common]
bind_port = 17000
token = myfrptest
dashboard_port = 7500
# dashboard's username and password are both optional,if not set, default is admin.
dashboard_user = admin
dashboard_pwd = admin
详细参数说明:
•token:服务器上设置的连接口令
•dashboard_port:服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为公网服务器的IP)查看frp服务运行信息。
•dashboard_user:打开仪表板页面登录的用户名
•dashboard_pwd:打开仪表板页面登录的密码
$ cat frpc.ini
[common]
server_addr = 填写公网IP
server_port = 17000
token = myfrptest
admin_addr = 本机的IP
admin_port = 7400
admin_user = admin2
admin_pwd = admin2
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 8081
remote_port = 17001
详细参数说明:
•token:要连接frps服务的连接口令
•admin_addr:客户端管理界面的IP
•admin_port:客户端管理界面的端口
•admin_user:打开客户端管理界面登录的用户名
•admin_pwd:打开客户端管理界面登录的密码
我们在客户端的配置时候需要填写公网IP,或者开放的端口,我们可以用环境变量来生效。
$ cat frpc.ini
[common]
server_addr = {{ .Envs.FRP_SERVER_ADDR }}
server_port = 17000
token = myfrptest
我们配置了环境变量{{ .Envs.FRP_SERVER_ADDR }},那么在启动服务之前,我们需要做一个环境变量export操作。
$ export FRP_SERVER_ADDR="120.xxx.xx.xx"
$ ./frpc -c frpc.ini
这样就可以正常启动,不需要在配置文件显示具体公网IP。
•公网IP开放了17001的端口
•frps服务端仪表板
首页
TCP页面
•frpc客户端管理界面
客户端配置文件修改界面
1.确保防火墙放行相关的端口。
2.如果你是在阿里云或者腾讯云等云平台上,注意在安全组上放行相关的端口。
更多安全的配置,可以去GitHub研究实践。
欢迎关注我的公众号testerzhang,原创技术文章第一时间推送。