之前写过ipv6+ddns访问nas服务的文章,这种方法有许多不足
一是必须在支持ipv6的环境下访问,许多公共场所的wifi一般就不支持ipv6,无法访问网站,像腾讯轻量云服务器也不支持访问纯ipv6服务,好像要云服务器才支持。这样轻量云上搭建的alist就无法访问nas中的nextcloud服务。
二是家庭宽带都封禁了80 443等端口,虽然使用域名加ddns可以正常访问,但无法省略掉端口,这样看起来网站就不是特别正式。接下来介绍一种方法,可以实现无端口访问nas中的服务,在ipv4环境下也可以访问nas。通过云服务器实现流量中转,使用nginx进行反向代理,实现无端口访问内网服务,而且还可以申请SSL证书,支持https。
FRP安装
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
frp 主要由 客户端(frpc) 和 服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上,内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。
服务端
下载
在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。其中的 frpc 拷贝到内网服务所在的机器上,将 frps 拷贝到具有公网 IP 的机器上,放置在任意目录。
部署
将运行文件拷贝到云服务中,编写配置文件frps.ini
[common]
#frp 监听端口,与客户端绑定端口
bind_port= 4000
kcp_bind_port = 4000
#dashboard用户名
dashboard_user= user
#dashboard密码
dashboard_pwd= passwd
#dashboard端口,启动成功后可通过浏览器访问如http://ip:1234
dashboard_port= 1234
#设置客户端token,对应客户端有页需要配置一定要记住,如果客户端不填写你连不上服务端
token = 123456789
先通过 ./frps -c ./frps.ini
启动服务端,如果需要在后台长期运行,建议结合其他工具使用,例如 systemd 和 supervisor
。
宝塔面板商店中可以安装进程守护管理器,如果将运行文件frps
放在/opt/frp
文件夹中,则启动命令改写为/opt/frp/frps -c /opt/frp/frps.ini
,进程目录为/opt/frp
。
完成设置后,进程会自动启动在后台运行,每次服务器重启都会自动运行,这样就完成了服务端的设置。
客户端
群晖安装
群晖下安装FRP比较简单,可以使用矿神源,第三方套件安装。
1.打开群辉套件中心
2.在设置中新增套件来源
3.添加矿神群晖SPK套件源输入如图链接
在套件中心的社群套件中搜索frpc,点击安装即可一键安装。打开frpc,在窗口中可对frpc.ini配置文件进行设置。设置的ip地址和端口要与frps配置设文件中一致。
在具体的内网穿透服务配置中,local_ip为要暴露到外网的本地服务部署的IP地址,local_port为本地服务监听的端口,remote_port为暴露到云服务器的端口。
点击保存,即完成了frpc的部署。
frp除了用直接二进制文件进行部署,还可以采用docker的方式来安装frp的服务端和客户端,用@snowdreamtech 的docker镜像,这样后台运行,重启和配置会稍微简单一些。docker-compose.yml文件如下,将frpc.ini
配置文件映射到了本地的/opt/frp/docker/frpc.ini
文件。
version: '3'
services:
frpc:
image: snowdreamtech/frpc
network_mode: host
volumes:
- /opt/frp/docker/frpc.ini:/etc/frp/frpc.ini
container_name: frpc
restart: always
还是和往常一样,使用docker-compose进行部署。
docker-compose up -d
如果需要增加穿透服务,对frpc.ini
配置文件进行修改,然后重启容器即可。
通过查看容器日志,可以了解穿透是否成功。
如frpc.ini配置文件所示,本地端口的5000服务被暴露到了云服务公网IP的5000端口,通过云服务器ip地址+5000端口,即可实现对本地服务的访问,但是这样通过ip地址加端口的访问让人感觉不是特别正式,可以进一步通过反向代理,消除掉端口。
反向代理
接下来进行反向代理,将指定的域名反代到内网服务暴露到公网的端口,这样就可以实现域名直接访问内网服务。
在进行反向代理前,要保证域名指向了部署frps的主机。首先需要申请一个域名,并将子域名指定到frps部署的云服务器ip地址。
反向代理有几种方法,一种是使用宝塔安装好的nginx环境进行反代。另一种是通过docker安装的nginxproxymanager进行反代。两者的操作都非常简单,而且都可以申请ssl证书。
在之前介绍了利用NPM进行反代,这里就介绍使用宝塔面板进行反向代理。
完成网站创建后,点击网站即可对站点信息进行配置,在左边菜单中选择反向代理,点击添加反向代理,在界面中,目标URL填写代理到的地址,在本文中,则为将本地服务暴露到制定公网端口地址,即在http://127.0.0.1 + fprc中设置的remote_port,点击提交即完成了域名反代到本地服务的设置。
SSL证书申请
上一次介绍了如何使用NPM进行证书申请,宝塔面板也可以进行证书申请。
反向代理的域名只支持使用DNS验证进行SSL证书申请,我的域名在腾讯云上进行解析,选择DnsPod设置,在弹窗中填入腾讯云DnsPod的ID以及Token,选择需要申请证书的域名,点击申请即可。
完成设置后,申请的证书会自动进行部署,推荐打开强制HTTPS,这样更安全可靠。
小结
具体的原理就是,假设本地服务部署在4025
端口,通过FRP将本地内网指定端口4025
的服务暴露到云服务的指定端口5025
上,通过云服务ip地址+端口5025
即可实现对本地部署在4025服务的访问。
进一步,在云服务中通过反向代理,将域名sample.leiting2020.top
反代到云服务的指定端口,将域名的流量都转发的云服务的端口5025,而本地端口4025的服务又通过FRP暴露在云服务器的端口5025上,这样通过域名就可以实现对本地4025端口服务的访问。
通过上述方法,就可以在无ipv6环境下,实现无端口访问nas的服务。但这种方法也收到云服务器性能的影响,比如服务器的带宽,流量总数,我的云服务器带宽8M,实在是小水管,卡起来真烦人。一个月1200g,做网站还够用,如果做下载的中转,可能流量就不够用了。
如果说上传一些文件到nas中,或者做下载服务,最好还是使用ipv6+ddns,网速不会受到服务器带宽的影响。
参考
群晖矿神源:https://spk7.imnks.com/
FRP的docker镜像:https://hub.docker.com/r/snowdreamtech/frpc