云服务器+FRP+Nginx,无需添加端口,直接使用域名访问家里的任何设备
本文最后更新于 204 天前,其中的信息可能已经有所发展或是发生改变。

之前写过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 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

architecture.png

服务端

下载

网址:GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.

在 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 启动服务端,如果需要在后台长期运行,建议结合其他工具使用,例如 systemdsupervisor

宝塔面板商店中可以安装进程守护管理器,如果将运行文件frps放在/opt/frp文件夹中,则启动命令改写为/opt/frp/frps -c /opt/frp/frps.ini,进程目录为/opt/frp

完成设置后,进程会自动启动在后台运行,每次服务器重启都会自动运行,这样就完成了服务端的设置。

image-20230806154055360

客户端

群晖安装

群晖下安装FRP比较简单,可以使用矿神源,第三方套件安装。

image-20230806170548201

1.打开群辉套件中心

2.在设置中新增套件来源

3.添加矿神群晖SPK套件源输入如图链接

image-20230806165826522

在套件中心的社群套件中搜索frpc,点击安装即可一键安装。打开frpc,在窗口中可对frpc.ini配置文件进行设置。设置的ip地址和端口要与frps配置设文件中一致。

在具体的内网穿透服务配置中,local_ip为要暴露到外网的本地服务部署的IP地址,local_port为本地服务监听的端口,remote_port为暴露到云服务器的端口。

image-20230806170843759

点击保存,即完成了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配置文件进行修改,然后重启容器即可。

通过查看容器日志,可以了解穿透是否成功。

image-20230806172501701

如frpc.ini配置文件所示,本地端口的5000服务被暴露到了云服务公网IP的5000端口,通过云服务器ip地址+5000端口,即可实现对本地服务的访问,但是这样通过ip地址加端口的访问让人感觉不是特别正式,可以进一步通过反向代理,消除掉端口。

反向代理

接下来进行反向代理,将指定的域名反代到内网服务暴露到公网的端口,这样就可以实现域名直接访问内网服务。

在进行反向代理前,要保证域名指向了部署frps的主机。首先需要申请一个域名,并将子域名指定到frps部署的云服务器ip地址。

image-20230806172907766

反向代理有几种方法,一种是使用宝塔安装好的nginx环境进行反代。另一种是通过docker安装的nginxproxymanager进行反代。两者的操作都非常简单,而且都可以申请ssl证书。

在之前介绍了利用NPM进行反代,这里就介绍使用宝塔面板进行反向代理。

image-20230806173147761

完成网站创建后,点击网站即可对站点信息进行配置,在左边菜单中选择反向代理,点击添加反向代理,在界面中,目标URL填写代理到的地址,在本文中,则为将本地服务暴露到制定公网端口地址,即在http://127.0.0.1 + fprc中设置的remote_port,点击提交即完成了域名反代到本地服务的设置。

image-20230806173412923

SSL证书申请

上一次介绍了如何使用NPM进行证书申请,宝塔面板也可以进行证书申请。

反向代理的域名只支持使用DNS验证进行SSL证书申请,我的域名在腾讯云上进行解析,选择DnsPod设置,在弹窗中填入腾讯云DnsPod的ID以及Token,选择需要申请证书的域名,点击申请即可。

image-20230806175009099

完成设置后,申请的证书会自动进行部署,推荐打开强制HTTPS,这样更安全可靠。

image-20230806175314670

小结

具体的原理就是,假设本地服务部署在4025端口,通过FRP将本地内网指定端口4025的服务暴露到云服务的指定端口5025上,通过云服务ip地址+端口5025即可实现对本地部署在4025服务的访问。

进一步,在云服务中通过反向代理,将域名sample.leiting2020.top反代到云服务的指定端口,将域名的流量都转发的云服务的端口5025,而本地端口4025的服务又通过FRP暴露在云服务器的端口5025上,这样通过域名就可以实现对本地4025端口服务的访问。

通过上述方法,就可以在无ipv6环境下,实现无端口访问nas的服务。但这种方法也收到云服务器性能的影响,比如服务器的带宽,流量总数,我的云服务器带宽8M,实在是小水管,卡起来真烦人。一个月1200g,做网站还够用,如果做下载的中转,可能流量就不够用了。

如果说上传一些文件到nas中,或者做下载服务,最好还是使用ipv6+ddns,网速不会受到服务器带宽的影响。

参考

FRP:GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.

群晖矿神源:https://spk7.imnks.com/

FRP的docker镜像:https://hub.docker.com/r/snowdreamtech/frpc

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇