frp使用小结

因为学校禁外网ip接入,校园网形成了一个大的局域网。连接只能由校内终端发起,校外终端无法主动连接到校内终端,这使得校内终端变成了我们常说的内网机器。我在校内有NAS服务器,希望可以从校外访问。同时,实验室年会的演示也需要从外网连通校内服务器。于是我搜索了常用的内网穿透方法,最终选择了frp来实现内网穿透。frp 是一个可用于内网穿透的高性能的反向代理应用。这里的反向代理指我们因为无法直接访问内网机,所以需要通过代理访问内网机,而正向代理往往是因为我们无法直接访问internet,所以需要通过代理访问internet。反向代理对应的内网机数量少,而正向代理对应的internet服务器数量更多。这里我对如何使用frp进行小结。

首先,使用frp需要满足以下几点要求:

  1. 一台具有公网ip的服务器(为了能有一个稳定的接入点)
  2. 一到多台不具有公网ip的内网服务器(等待连接的接入点)
  3. 最好有一个域名(比如xx.cn)
    这些我都有,公网ip服务器正在跑nginx+django;内网服务器是路由下的NAS;域名在dnspod上做域名解析。为了以后能更方便使用frp,我把frp client装在路由上而不是NAS上。基本的安装参考文末frp项目主页的使用示例

我的需求有以下几点:

  1. 接通路由和NAS的ssh
  2. 接通路由和NAS的web管理页面,以及NAS的transmission管理页面
  3. 接通NAS的webdev
    实现起来都非常简单,完全按照frp项目主页的使用示例就可以实现。需求1即使用示例的“通过ssh访问公司内网机器”,需求2和需求3即“通过自定议域名访问部署于内网的web服务”。

需要注意3点:

  1. “通过自定议域名访问部署于内网的web服务”需要填写custom_domains,需要去自己的域名解析商那里添加一条A记录,因为我有多个web服务,所以我的A记录的主机记录填写的是“”,记录值是公网服务器ip。这时每一个访问域名.xx.cn的请求都会提交给你的公网服务器ip,如果访问的是你在client的frpc.ini中填写的域名,frps就会将请求转给client.相当于是frp server根据域名在路由请求。相当于端口转发(port forward)中根据端口来路由请求。
  2. 因为公网服务器上运行了我自己的web服务,占用了80端口,所以frp无法使用80端口,按使用示例中使用8080端口是可行的。但是我不想加端口,这就需要nginx将对应域名的流量转给frp server。这里我参考了“nginx-和-frp共用80端口”。首先,添加一条*.frp的A记录指向公网服务器;然后,把文章中“配置 nginx”那一段粘贴到sites-avaliable最后;接下来,后在frps.ini中加入subdomain_host和vhost_http_port;最后把frpc.ini中的custom_domains改成不带域名的即可。这里相当于用一个单词来路由请求。这样做可以把所有因为80端口被占用而不得不加上端口号的网站,可以删除端口号访问,即xx.frp.xx.cn
  3. 如果你要转发文件共享服务,是会消耗公网服务器的流量,请谨慎使用。
  4. 为了安全,请在frps.ini和frpc.ini中都添加auth_token

[1] frp项目主页: https://github.com/fatedier/frp/blob/master/README_zh.md
[2] nginx-和-frp共用80端口: https://www.centos.bz/2018/06/nginx-和-frp共用80端口