本文我想和大家聊聊 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分为服务端和客户端,服务器端名为frps,客户端名为frpc,安装时务必注意区分。同时Frp支持windows和linux的服务器系统,我们首先将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
打开配置文件
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
【说明】
注意不要使用像 10080、10443 这种高位端口,容易出现被浏览器屏蔽的情况。
更多配置参数:服务端frps.ini各配置参数详解
登录OpenWrt管理后台,由于客户端存在多种不同的版本,这里只简单介绍常见的安装方式。
某些固件内已经编译好了frpc和frps,我们直接启用服务并进行配置就可以了。
流程同安装frp服务端,只是把frps换成frpc。
进入系统-软件包-查找可用软件包。点击 Update lists 更新软件列表后,搜索 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客户端是否在运行状态。
端口绑定默认7000,直接使用就可以了,我们这里主要是使用http服务,所以填写服务端对应的http绑定端口就可以了,允许和服务端设置成相同的端口。
密码保护:使用http basic认证为服务添加一层安全保障。
通过域名+端口的形式访问frp服务端面板。
通过域名+端口的形式访问内网服务。这里我通过 openwrt.frp.404.cafe 域名在公司成功访问了只能在家庭内网访问的openwrt管理面板。
至此,我们已经成功达到了内网穿透的效果。同理,你也可以在Frpc中设置SSH、FTP等其它服务,然后通过远程访问它们。
本文对Frp的设置部分只采用了最低可用的方式,实际上Frp的配置项非常复杂,甚至可以一个Frps带多个Fprc,大家有兴趣可以自行研究。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。