有许多小伙伴可能有这样的经历,就是在调试微信公众号的时候苦于没有一个外网地址供微信回调使用,不急,这里我就介绍一款非常流行的内网穿透工具,他的大名就是frp,是完全开源免费的,大家可以放心使用,接下来我将介绍这款软件如何使用以及部署,当然,如果你想使用它的话,前提需要你有一台有公网IP的服务器,那么问题来了,我如果有一台有公网IP的服务器,那我还穿透个毛啊,对!!!这样想也不错,但是就像我上面说的,你要调试本地项目啊,你不可能改一行代码就部署一下吧,那样效率太低了,除非你自己的开发设备本身就有公网IP,那你可以不看了,哈哈
当然啦对于没有公网服务器的小伙伴也别急,我有,并且可以免费给大家使用,还有子域名赠送!!!服务地址https://www.zjz-service.cn/frp
软件下载地址:https://github.com/fatedier/frp/releases
下载的文件中包含服务端程序frps和客户端程序frpc,不同的端部署在不同的终端即可
服务端部署:
核心文件是frps这是程序文件,frps.toml这是配置文件,我们先看一下服务端的配置文件都有什么参数内容
bindPort = 7000
这是一个最重要的参数,也就是frp服务端监听的端口号,对应客户端serverPort参数,正常情况下,只要这一个参数就可以启动服务了,但是我们不可能将服务直接就这样发布出去,太不安全了,于是我们要做保密措施
auth.method = "token"
auth.token = "你自己随便设置一个字符串,复杂一点不好被猜到的"
增加上述这两个参数,你的frp服务端就会要求客户端提供这个token了,这样就起到了一定的保护作用,但token的方式仅适合个人使用,但我们往往会想到要给不同的人去用,难道所有人都拿同一个token来搞吗,这显然是不合理的,别担心,frp还有另一种鉴权方式就是oidc方式
auth.method="oidc"
auth.oidc.issuer="https://example-oidc-issuer.com/"
auth.oidc.audience="https://oidc-audience.com/.default"
这种方式就比较困难一点了,需要您自行提供一个oidc服务端,但是好处就是他可以支持使用不同的账号
除了上述两种方式,其实还有一种方式鉴权的,也是我自己在用的,那就是自行开发一个Server Plugins,当然了这个需要您有一定的开发能力,需要为frp提供可请求的http接口,您可以在接口中定义鉴权规则,灵活性很高,具体如何弄,请看https://github.com/fatedier/frp/blob/dev/doc/server_plugin.md
以上的配置仅能让您使用TCP和UDP代理,但是您的项目往往是http(s)的居多,那该怎么办呢,那就继续看
vhostHTTPPort = 80
vhostHTTPSPort = 443
这两个参数,一个开放http对外端口,另一个开发https对外端口,这里可能跟您常用的ngnix可能冲突,您也可以按照自己的需求稍作修改,或者由nginx再做一层代理,转发给frp也是可以的
配置完以上参数,你的服务端就基本完工了,很简单吧
那么我们运行他
./frps -c ./frps.toml
当然,您也可以将frps做成一个服务使用systemctl管理,这样更稳定
客户端配置
客户端就是要下载到您的内网机器上,也就是本地了,frpc文件是程序文件,frpc.toml是配置文件,我们先看一下最核心的配置参数
serverAddr = "服务器的公网IP"
serverPort = 7000
这两个参数就是我们服务端部署的服务器IP地址和端口号,如果您用的是token方式鉴权,那么需要下列配置
auth.method = "token"
auth.token = "这在服务端设置的字符串"
如果您自己实现了oidc服务端,那么您需要如下的配置
auth.method = "oidc"
auth.oidc.clientID = "98692467-37de-409a-9fac-bb2585826f18" #替换成OIDC服务的ClientID
auth.oidc.clientSecret = "oidc_secret"
auth.oidc.audience = "https://oidc-audience.com/.default"
auth.oidc.tokenEndpointURL = "https://example-oidc-endpoint.com/oauth2/v2.0/token"
那么我们如何将本地的服务通过frp发布到公网呢,重点来了
[[proxies]]
name="ssh" #代理名称,自己可以随便起
type="tcp" #类型,表示这条代理的服务类型,可以为udp
localIP="127.0.0.1" #您要代理的地址,127.0.0.1表示代理本机上的服务,当然也可以是局域网内其他机器的ip,例如192.168.1.128,默认本机的话也可以不要这个配置
localPort=22 #你要代理的服务端口号
remotePort=6000 #这个参数表示要在服务端启用哪个公网端口来代理,很好理解,比如我代理ssh,本来本地是端口22,那么我通过frp代理后就需要使用6000这个端口来访问 ssh服务了
这样一个代理就配置完成了,示例中代理的是本地的ssh,那么我们在公网上可以这样请求ssh服务
ssh -i 6000 root@服务端IP
下面我们来看一下web项目如何配置代理
[[proxies]]
name="web"
type="http" # 这里要设置成http,当然也可以是https,但是https需要配置证书
localPort=80
customDomains= ["www.example.com"] # 这个是您的web服务域名,注意这个域名要解析到服务端IP上
customDomains是支持配置多个的,如果您没有域名,那您就只能使用tcp类型的代理了,因为http本身也是tcp协议,这样要开启一个remotePort端口号
[[proxies]]是可以配置多个的,向这样
[[proxies]]
name = "mysql"
...
[[proxies]]
name = "ssh"
...
到这里,客户端基本配置完毕,那么就启动他吧
./frpc -c ./frpc.toml
frp的性能是很不错的,如果服务端在国内,代理出去的网页,请求速度几乎没什么延迟,非常高效