本文我想和大家聊聊 Frp 在 OpenWrt 系统中的应用。我在家里的open wrt上部署了很多服务和脚本,但是由于ipv4地址资源紧张,家庭宽带获取ipv4公网地址难度大、代价高,我的家宽也没有公网ip,只能在家庭局域网中访问这些服务,这里我们就需要使用内网穿透工具让这些服务在外网也可以访问到,目前的内网穿透应用中有两个比较常用,一个是Frp,另一个是Ngrok,OpenWrt系统对这两个应用的支持都不错,这次我们选择使用Frp搭建。
准备
关于Frp,其工作原理我们可以简单的理解为:让内网路由器与拥有公网地址的服务器通过某个端口建立联系,然后你只要远程访问服务器,它就会自动去访问内网路由器中指定的服务,从外部看来就好像将内网穿透了一样。
云服务器
首先你需要有一个拥有公网ip地址的服务端,我手里正好有两台空闲的腾讯云轻量应用服务器,轻量云服务器的特性相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖基础云资源并提供高带宽流量包,对于frp这种不需要长时间高负载和大量流量的应用再合适不过,不是云服务器用不起,而是轻量更有性价比。我选择使用国内广州的这台服务器,这样能保证Frp服务的运行和网络更加稳定。
没有云服务器的朋友也可以看看腾讯云:https://curl.qcloud.com/AaSzuNFu
域名
如果你想通过域名访问frp面板和内网的服务,那么你需要注册一个域名,并且将它们解析到你服务器的公网ip,一个域名对应一个服务。如果你想通过80/443端口进行访问,那么你还需要将域名进行备案。
- frp.404.cafe:用做主域名,访问frp服务端面板。
- openwrt.frp.404.cafe:用于访问openwrt管理面板。
- alist.frp.404.cafe:用于访问部署在内网的alist管理面板。
- gitlab.frp.404.cafe:用于在外网环境下访问内网代码仓库。
- jenkins.frp.404.cafe:用于在外网环境下访问内网jenkins。
安装
Frp分为服务端和客户端,服务器端名为frps,客户端名为frpc,安装时务必注意区分。同时Frp支持windows和linux的服务器系统,我们首先将Frp服务端安装在云服务器上,并且将Frp客户端安装在路由器上,最后设置好相应的配置文件即可。
安装Frp服务端
前往frp项目中的发行安装包地址,寻找适合自己的安装包。如x86平台64位的linux机器,应该使用名为 frp_x.xx.x_linux_amd64.tar.gz 的安装包(x.xx.x为版本号)。选中安装包名称,右键复制链接地址,我是arm64v8的平台,所以选择frp_0.52.3_darwin_arm64.tar.gz
登陆服务器执行下列命令,执行下列命令,为Frp程序新建一个目录并且进入到该目录。
mkdir /etc/frps
cd /etc/frps
将安装包下载到服务器中。
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_darwin_arm64.tar.gz
执行下列命令,解压安装包。
tar -zxvf frp_0.52.3_darwin_arm64.tar.gz
重命名文件夹。
mv frp_0.52.3_darwin_arm64/* /etc/frps/
注册系统服务
新建Frps服务文件。
vim /usr/lib/systemd/system/frps.service
按键盘 i 键,进入编辑状态,粘贴如下代码,然后按 ESC 按键,输入:wq 回车后保存并退出。
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=simple
ExecStart=/etc/frps/frps -c /etc/frps/frps.ini
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
StandardOutput=syslog
StandardError=inherit
[Install]
WantedBy=multi-user.target
重载配置文件
systemctl daemon-reload
常用命令
// 启动服务
systemctl start frps
// 停止服务
systemctl stop frps
// 重启服务
systemctl restart frps
// 查看服务状态
systemctl status frps
// 添加开机自启
systemctl enable frps
// 取消开机自启
systemctl disable frps
配置Frps
打开配置文件
vim /etc/frps/frps.ini
[common]
bind_port = 7000
dashboard_port = 7500
token = your_token
dashboard_user = your_username
dashboard_pwd = your_password
vhost_http_port = 8000
vhost_https_port = 8001
subdomain_host = frp.404.cafe
【说明】
- bind_port:提供服务的端口。后续Frpc客户端将绑定服务器的该端口,完成与服务器的通信。
- vhost_http_port:HTTP端口,可通过客户端绑定的域名(域名需解析至服务器的IP),加上此端口来访问对应的内网HTTP服务。
- vhost_https_port:HTTPS端口,可通过客户端绑定的域名,加上此端口来访问对应的内网HTTPS服务。
- token:默认使用Token认证口令,客户端需使用该口令才能与服务器建立通信。
- dashboard_port:监控Web面板端口。
- dashboard_user:监控Web面板用户名。
- dashboard_pwd:监控Web面板密码。
- subdomain_host:绑定访问frp服务的域名,之后在 frpc 的 http、https 类型的代理中可以不配置 custom_domains,而是配置一个 subdomain 参数。只需要将 *.{subdomain_host} 解析到 frps 所在服务器。之后用户可以通过 subdomain 自行指定自己的 web 服务所需要使用的二级域名,通过 {subdomain}.{subdomain_host} 来访问自己的 web 服务。
注意不要使用像 10080、10443 这种高位端口,容易出现被浏览器屏蔽的情况。
更多配置参数:服务端frps.ini各配置参数详解
安装Frp客户端
登录OpenWrt管理后台,由于客户端存在多种不同的版本,这里只简单介绍常见的安装方式。
开箱即用
某些固件内已经编译好了frpc和frps,我们直接启用服务并进行配置就可以了。
手动安装
流程同安装frp服务端,只是把frps换成frpc。
自动安装
进入系统-软件包-查找可用软件包。点击 Update lists 更新软件列表后,搜索 frpc,点击安装按钮,将自动安装该软件和依赖。
配置Frpc
基本设置
安装完毕后刷新浏览器,进入:服务-frp内网穿透。在 “基本设置” 选项卡中,设置服务器地址、端口、令牌及其他可选项。
服务器:填写安装有Frps的服务器ip地址或者域名。
端口:填写Frps配置文件 bind_port 选项设置的端口,本文的示例配置文件对应的此处为7000。
令牌:填写Frps配置文件 token 选项设置的令牌。
运行用户:填写Frps配置文件 token 选项设置的 dashboard_user。
HTTP 穿透服务端口:填写Frps配置文件 token 选项设置的 vhost_http_port。
HTTPS 穿透服务端口:填写Frps配置文件 token 选项设置的 vhost_https_port。
高级设置
也可在服务器的高级设置里配置监控面板,查看是否有客户端建立了连接。
http/https的80/443端口是支持复用的,一个域名可以分别配置http和https两条穿透记录,此后无法复用。如果各用户都穿透了内网的网站到这台服务器的80/443端口,当服务器收到80/443端口的网站访问请求时,frp服务器端会根据访问的域名来识别具体访问哪位用户的内网网站,所以配置http/https的穿透时,域名是不可复用的。
配置完毕后,点击页面右下角的【保存并应用】按钮。并前往【系统-启动项】中重启frpc服务。至此,Frp服务器和客户端搭建完毕,可在OpenWrt内的Frp客户端页面,查看frp客户端是否在运行状态。
添加服务
OpenWrt
端口绑定默认7000,直接使用就可以了,我们这里主要是使用http服务,所以填写服务端对应的http绑定端口就可以了,允许和服务端设置成相同的端口。
基本设置
- Frp类型:由于openwrt是通过web端进行管理,所以选择http。
- 域名类型:根据自己情况选择,可以设置成ip或者域名,如果选择自定义域名则不能是属于主域名(subdomain_host) 的子域名或者泛域名,如果选择子域名必须是服务端主域名下的子域名,这里只需要填写前缀就可以了,比如我用二级域名 frp.404.cafe 作为主域名,我想通过三级域名 alist.frp.404.cafe 来访问内网alist服务,那我只需要填写【alist】就可以了,这里alist.frp.相对frp.就是第二级域名。
- 内网主机地址:内网服务的ip地址。
- 内网主机端口:内网服务的端口号。
- 服务备注名:唯一服务名。
高级设置
密码保护:使用http basic认证为服务添加一层安全保障。
访问
服务端面板
通过域名+端口的形式访问frp服务端面板。
内网服务
通过域名+端口的形式访问内网服务。这里我通过 openwrt.frp.404.cafe 域名在公司成功访问了只能在家庭内网访问的openwrt管理面板。
至此,我们已经成功达到了内网穿透的效果。同理,你也可以在Frpc中设置SSH、FTP等其它服务,然后通过远程访问它们。
最后
本文对Frp的设置部分只采用了最低可用的方式,实际上Frp的配置项非常复杂,甚至可以一个Frps带多个Fprc,大家有兴趣可以自行研究。