内网穿透 (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有没有起来