本文我们要讲解Frp在OpenWrt系统中的应用。如果你的路由器挂在一个没有公网地址的家庭局域网内,或者是挂在公司受限的局域网内,但你又想通过远程来操控这个路由器或者访问路由器上的一些服务,这时内网穿透应用就派上了用场。目前的内网穿透应用中有两个比较常用,一个是Frp,另一个是Ngrok,OpenWrt系统对这两个应用的支持都还可以,这次我们只讲解Frp,关于Ngrok大家可以去慢慢摸索。
Frp在本文中所涉及的内容,其工作原理可以简单的理解为:让内网路由器与拥有公网地址的服务器通过某个端口建立联系,然后你只要远程访问服务器,它就会自动去访问内网路由器中指定的服务,从外部看来就好像将内网穿透了一样。首先你需要有一个拥有公网地址的服务器端,你可以选择国内的阿里云、腾讯云等或国外的服务器空间提供商购买服务器空间(含公网地址),然后安装上相应的系统,如Windows、Linux等,再将Frps即Frp的服务端安装在这个服务器上,将Frp客户端Frpc安装在路由器上,最后设置好相应的配置文件即可。
上面说到要购买服务器空间,有人可能就想打退堂鼓了,其实如果你有一个安装了OpenWrt的路由器是挂在有公网地址网络上的话(注:电信、移动等宽带通过拨号方式就可以获得不固定的公网地址),可以通过DDNS应用固定域名(后面章节我们会讲到),再将Frps安装在OpenWrt系统上,就可以免去购买服务器空间的费用了。
Frp是一个在GitHub上维护的项目,项目网址为:https://github.com/fatedier/frp,源码及工作原理都介绍得非常详细,初次接触该应用的可以先去好好看一看。目前最新的发布版是v0.34.2,下载网址为:https://github.com/fatedier/frp/releases,你需要在什么平台安装你就下载相应平台的软件。
一、安装服务器端程序
以64位的Ubuntu20.04系统下安装Frps为例,我们要用到 frp_0.34.2_linux_amd64.tar.gz 这个文件,可以采用wget或curl命令直接下载,再解压文件。
cd /usr wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz tar -xzvf frp_0.34.3_linux_amd64.tar.gz
解压后我们发现目录里既有服务器端程序,也有客户端程序,并且分别带配置程序及配置程序的所有参数说明;另外还有一个systemd子目录,里面的内容主要是帮助大家建立程序开机自启动的(注:经测试在CentOS7系统中可直接使用)。
服务器端安装,我们要用到frps及frps.ini文件,将其拷贝到指定目录:
cd frp_0.34.3_linux_amd64/ cp frps frps.ini /usr/bin/
接下来再设置Frps开机时自动启动:
》添加或修改 rc-local.service
vim /lib/systemd/system/rc-local.service
确认内容如下:
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
》在rc.local配置中新建或添加Frps运行命令
vim /etc/rc.local
确认里面包含如下命令:
#!/bin/bash
/usr/bin/frps -c /usr/bin/frps.ini
》设置程序运行并开机自启动
chmod +x /etc/rc.local ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/ systemctl start rc-local.service systemctl enable rc-local.service
》重启后测试
reboot ps aux #看frps是否开机自动运行
如果看到Frps已经在后台运行,服务器端的缺省安装就算成功了。当然如果后续客户端配置有一些特殊要求,那么服务器端的frps.ini的内容也要配合做些改变才行,在配置部分我们会讲到。
二、安装客户端程序
Frp的官方项目中未提供OpenWrt系统下的对应程序,但是因为它提供了程序源码,所以原则上我们可以自编译生成在任何平台下的Frp程序。利用OpenWrt提供的自编译工具包,生成与我们所使用的路由器相匹配的应用程序是完全可能的,但因为此过程相对比较复杂(注:大家以后可参见”OpenWrt – 自编译 – 应用程序自编译“部分的内容),所以这次我们准备使用第三方(Kuoruan)已经编译好的程序。另外可喜的是,为了方便大家在客户端的设置工作,Kuoruan也开发并编译了Frpc的Luci界面:luci-app-frpc,具体大家可以参考以下网址:
》Kuoruan的OpenWrt-Frp项目
源码:https://github.com/kuoruan/openwrt-frp
发布版:https://github.com/kuoruan/openwrt-frp/releases
》Kuoruan的luci-app-frpc项目
源码:https://github.com/kuoruan/luci-app-frpc
发布版:https://github.com/kuoruan/luci-app-frpc/releases
下载时请选择与自己的路由器相匹配的程序,以我的WR720N为例,因为刷的是WR710N的固件,所以先在OpenWrt官网找到WR710N的平台信息,Package architecture是mips_24kc:
然后到Kuoruan的GitHub项目下载相对应的Frpc及luci-app-frpc:
将下载的两文件通过WinSCP拷贝到 /tmp 目录下,然后进行后续安装;
或者全部采用以下命令行方式进行下载、拷贝及安装:
opkg update && opkg install wget cd /tmp wget https://github.com/kuoruan/openwrt-frp/releases/download/v0.33.0-1/frpc_0.33.0-1_mips_24kc.ipk wget https://github.com/kuoruan/luci-app-frpc/releases/download/v1.2.1-1/luci-app-frpc_1.2.1-1_all.ipk opkg install frpc_0.33.0-1_mips_24kc.ipk luci-app-frpc_1.2.1-1_all.ipk reboot
路由器重启后进入Luci界面,点“Services – Frpc”就进入Frpc的Luci设置界面了:
三、配置
Frp的配置过程主要是在客户端进行的,服务器端配置很多是为了配合客户端的特殊配置要求而变化的。专业人员可以直接通过修改 /etc/config/frpc 文件来完成Frpc的配置过程,但对于初学者来说,建议还是采用Frpc的Luci设置界面最简单,也一目了然。
1、在Frpc的Luci界面先设置服务器
点”Servers“按钮,进入服务器设置界面:
如上图所示,在Alias框给服务器起个名,输入服务器的公网IP地址或域名到Server addr框,点”Save & Apply“就可以了。如果你为了数据传输的安全性,增加在Token栏输入Token码,那么在服务器端必须对frps.ini文件进行修改,增加以下语句:
token = ************** #将Frpc的Servers处设置的token码在这里再输一遍
然后重启frps服务:
systemctl restart rc-local.service
2、设置允许远程访问的服务
点”Rules“按钮,就进入了允许远程访问服务的设置界面了:
点”Add“可以添加服务,点”Edit“可以对服务设置进行修改,设置完成后点”Save & Apply“。
3、让Frpc运行起来
点”Setting“,进入”General Options”设置界面:
勾选“Enabled”,再点”Save & Apply“,你就会发现Frpc运行起来,显示”Running“就表明设置OK了。
四、测试
上面的”Rules“设置中我们开放了80端口的web服务,对应的远程端口号是7080,那我们只要在任一联网的电脑浏览器地址栏输入:服务器IP或域名:7080,你就能进入内网路由器的Luci设置界面了,对路由器进行远程的操控了,跟你在内网里直接访问是一样的。
同理,你也可以在Frpc中设置SSH、FTP等其它服务,然后通过远程访问它,达到内网穿透的效果。
本文对设置部分只采用了最简方式,实际上Frp的设置非常复杂。希望大家先掌握了简单的,以后就可以举一反三,试试其它复杂的设置,相信大家最后一定会大有收获的!
Ps:对于其它共享一个Frps服务器端的情况,可以参考一个Frps带多个Frpc一文。