内网穿透 (2/4) - FRP代理
2019 11 12, Tue
以前我们很多人用ngrok,或者是ssh tunnel,但是ngrok搭建起来略麻烦,ssh tunnel断开以后没法自动重连。好在是有了一个go写的代理,叫FRP
逻辑
只是想要搭建服务的话可以不看。
FRP分两部分:FRPServer和FRPClient。
顾名思义。frps是放在服务器上的,用来接收用户请求并且把请求交给frpc的,frpc负责从frps拉取请求并且代理到内网服务上。
大概的过程就是这样
(搭建好frp以后)
- 用户访问公网服务(实际上访问到了frps)
- frps拿到请求以后产生goroutine,hold住请求,等待客户端
- frpc取回请求任务,产生一两个goroutine专门用来代理请求,也就是在内外网之间拷贝数据
(怎么会有这么适合这件事情的编程语言)
搭建frps
这部分都在服务器上。
frp的代码/二进制都在GitHub上可以直接获取到。
如果有golang的话,可以直接
go get -u -v github.com/fatedier/frp/cmd/frps
# or
go get -u -v github.com/fatedier/frp/cmd/frps@0.29.1
或者可以从 https://github.com/fatedier/frp/releases/latest 下载编译好了的二进制。放到你的PATH下面就好。
systemd
我们一般希望这类服务可以用系统管理,在略微新一些的Linux上都是systemd。 具体的文件不需要自己写,fatedier写好了: frps.service。
可能需要自己改一下frps的路径。
其他系统需要自己琢磨一下。
基本配置
frp配置使用ini格式。如果用上面的systemd文件的话,配置文件放在/etc/frp/frps.ini
最最最基本的就是
[common]
bind_port = <frps_port>
如果你不希望谁都可以把穿透挂在你的服务器上,应该再加一行
[common]
bind_port = <frps_port>
token = <token>
<frps_port>
& <token>
要换成自己生成的随机字符串哦。
Dashboard
一般来说我们还希望有个页面可以看到穿透的具体情况。
frps自带这个页面。
[common]
bind_port = <frps_port>
# set dashboard_addr and dashboard_port to view dashboard of frps
# dashboard_addr's default value is same with bind_addr
# dashboard is available only if dashboard_port is set
dashboard_addr = <bind_addr>
dashboard_port = <bind_port>
dashboard_user = <user>
dashboard_pwd = <password>
token = <token>
frpc
和frps类似,可以下编译好的二进制,也可以
go get -u -v github.com/fatedier/frp/cmd/frpc
# or
go get -u -v github.com/fatedier/frp/cmd/frpc@0.29.1
配置项
基本配置就是
[common]
server_addr = <server_addr>
server_port = <frps_port>
token = <token>
每一个服务,都要加一个ini的section,比如说我要代理自己的ssh端口到公网的6000端口,那么就是
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
具体的配置项请看fatedier的readme
如果不通怎么办。。。
- 在dashboard上检查对应的服务有没有注册上
- 检查frps有没有起来
- 检查frps端口有没有被防火墙拦住(比如说如果是云主机的话,还可能有安全策略和路由)
- 检查frpc有没有起来