问题

最近电信把我的公网地址收回去了,之前做好的网络端口映射失效了,在公司已经不能愉快地访问家里的网络。原先网络结构示意图如下:

(直接访问方案网络结构图)
 
只需要对电信光猫(也是个路由器)和家用路由器进行端口映射的配置即可,而针对地址是“动态”的这个问题,只需要弄个动态域名解释即可。而现在变成这样:
(无公网地址的直接访问方案网络结构图)
 
电信光猫不具备真正的公网地址了。如何查看自己的光猫是否有公网IP地址?不难,登录到光猫去,看网络状态,会看到它的IP地址:
 
 
(电信光猫上的地址查询)
 
然后上www.ip138.com,就能看到自己现在暴露在公网上的IP地址:
 
 
看看光猫上的地址和这里显示的地址是否相同,如果相同,那光猫就有公网地址,否则就没有。
 
回到问题中来,现在电信的路由器不可能给我做端口映射的,那咋弄?
 
这就是所谓的“内网穿透”技术了。
 
群晖的方案
 
就是quickconnect.to了,原理就是NAS主动连接群晖的服务器,而quickconnect.to也是指向群晖的服务器的,群晖再将请求转到NAS去,同事负责将从NAS回复的结果转回给用户。说白了,这个具有公网地址的群晖就起到了一个中介的作用。
 
(群晖方案网络结构图)
 
群晖的方案自然是非常简易的,用户甚至都不用了解怎么连接这些细节,只需要注册好账号密码,傻瓜式地打开quickconnect.to即可。
 
但弊端也很明显,最大的弊端当然是太慢,其次是不灵活,比如我架设了一个第三方的服务,就没法利用quickconnect.to访问。
 
frp方案简介
 
frp是国人开发的一套内网穿透工具,免费开源,使用GO语言写的,其github地址是:https://github.com/fatedier/frp/
 
它有一个服务器端frps,一个客户端frpc,其原理如下图所示:
 
(frp方案网络结构图)
 
frpc连接至frps,建立起一条数据通道(图中蓝色的虚线),根据配置,任何对公网服务器的某个端口的访问都经由这条通道告知frpc,再由frpc转为对局域网内某台主机(NAS)的访问,最后将访问结果原路返回给用户,原理和quickconnect.to是相似的。
 
必要的准备
 
要达成这个方案,就需要一台有公网IP地址的主机,通常是云主机。个人要搞一台有不错带宽的云主机,价格还是挺高的,可以考虑几个人拼一台主机,这样成本就下来了,带宽也能得到比较充分的利用,或者本来就有自己的公网主机的话那就更好了。
 
除了公网主机之外,图中我画的frpc是放在电脑主机或者路由器上,这是啥意思呢?
 
frpc是客户端,要想随时能够访问自己的NAS,客户端和服务器端这条数据通道是不能断的,要一直运行着,如果NAS支持安装frpc,我想应该没问题,直接把frpc放在NAS上,但实际上我没在群晖的套件中心里找到frpc,所以只好部署在NAS之外的设备上,另外:我不太确定用docker是否可行,谁如果用docker部署了frpc在NAS上的话可以在下面留言说明。
 
根据前面说的,如果frpc部署在电脑里,电脑要一直开着机,这个开销挺大的,所以最好的做法,就是把frpc部署在路由器里。并不是所有的路由器都支持安装应用。我家使用的路由器是ASUS的RT-AC86U,自己刷一个“梅林固件”,就可以在上面安装应用了,其中就有frpc,这个过程并不难,网上找一下即可,支持梅林固件的路由器还是挺多的。
 
(梅林固件的“软件中心”管理界面)
 
但配置阶段我建议还是用电脑,因为你肯定会遇到一些问题,你需要不断查看日志和调整,等你调试好了,再把配置贴到路由器里即可。
 
额外的,还需要一个域名,最好有,一来美观好记,二来可以启用https,三来可以用不同域名来区分不同的访问。域名可以到阿里云上注册一个,比如叫 jiangguogang.club,这种域名还是很便宜的,头一年特价,甚至只需要一元钱,体验比DDNS那些二级域名好很多。
 
OK,总结回来,必要的准备就是:
  • 一台有公网IP地址的主机,简称公网主机,假设主机IP地址为123.123.123.123
  • 支持梅林固件的路由器(能够安装frpc)
  • 一个域名,以jiangguogang.club为例
规划
 
确定自己需要哪些服务之后,做一下规划,最直接有效的方法就是画一张规划图,以我为例,我将自己的需求先列一下:
  • 对https://jiangguogang.club的访问会返回一个“Welcome”的信息
  • 对https://jiangguogang.club/photo的访问会转至NAS的相册,局域网的地址是http://192.168.1.200/photo
  • 对https://dms.jiangguogang.club的访问会转至NAS的管理界面,局域网地址是http://192.168.1.200:5000
  • 对https://webdav.jiangguogang.club的访问会转至NAS的WebDAV服务,局域网地址是http://192.168.1.200:5005
  • 对https://router.jiangguogang.club的访问会转至我的ASUS路由器,局域网地址是http://192.168.1.1
  • 所有使用http的访问都会被重定向至https
需求明确。由于本人对NGINX反向代理比较熟悉,所以公网主机统一用NGINX对外提供服务,这样配置https也比较方便,用户的请求到达主机之后,是由NGINX转到frps,再经过数据通道,抵达frpc,由frpc执行本地的请求。
 
(应用程序关系图)
 
为了更清晰,弄一张表格出来:
用户 NGINX frps frpc
https://jiangguogang.club   直接返回"Welcome"   - -
https://jiangguogang.club/photo   转127.0.0.1:5002 TCP通道转frpc   转192.168.1.200:80  
https://dms.jiangguogang.club 转127.0.0.1:5000 TCP通道转frpc 转192.168.1.200:5000  
https://webdav.jiangguogang.club   转127.0.0.1:5005 TCP通道转frpc 转192.168.1.200:5005
https://router.jiangguogang.club 转127.0.0.1:5003 TCP通道转frpc 转192.168.1.1:80
部署及配置NGINX
 
部署nginx的步骤略。
 
记得防火墙打开80和443端口。
 
/etc/nginx/conf.d/jiangguogang.conf
server {
server_name jiangguogang.club;
location / {
add_header Content-Type text/plain;
return 200 'Welcome! I am Jiang Guogang.'; #直接返回字符串
}
location /photo/ {
proxy_pass http://127.0.0.1:5002; #转至本地的5002端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
#启用https,证书来自于Let's encrypt. 建议使用Certbot,具体参考Let's encrypt的官网
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/jiangguogang.club/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/jiangguogang.club/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
} server {
server_name dsm.jiangguogang.club;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/dsm.jiangguogang.club/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dsm.jiangguogang.club/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
} server {
server_name webdav.jiangguogang.club;
location / {
proxy_pass http://127.0.0.1:5005;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/webdav.jiangguogang.club/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/webdav.jiangguogang.club/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
} server {
server_name router.jiangguogang.club;
location / {
proxy_pass http://127.0.0.1:5003;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/router.jiangguogang.club/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/router.jiangguogang.club/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
} #下面的配置的意思是:对http的访问将会重定向至https
server {
if ($host = photo.jiangguogang.club) {
return 301 https://$host$request_uri;
}
listen 80;
server_name photo.jiangguogang.club;
return 404;
} server {
if ($host = webdav.jiangguogang.club) {
return 301 https://$host$request_uri;
}
listen 80;
server_name webdav.jiangguogang.club;
return 404;
} server {
if ($host = dsm.jiangguogang.club) {
return 301 https://$host$request_uri;
}
listen 80;
server_name dsm.jiangguogang.club;
return 404;
} server {
if ($host = jiangguogang.club) {
return 301 https://$host$request_uri;
}
listen 80;
server_name jiangguogang.club;
return 404;
} server {
if ($host = router.jiangguogang.club) {
return 301 https://$host$request_uri;
}
listen 80;
server_name router.jiangguogang.club;
return 404;
}
nginx的配置应该还是很直截了当的,需要说明的我也用注释在上面说明了。
 
最好设置为开机自动启动。
 
frps部署及配置
 
由于我们的frpc是直接通过路由器的“软件中心”安装的,版本是确定的,服务器的版本要和此版本一致,不能直接下载最新版,这个一定要注意。
 
下载地址当然是github:https://github.com/fatedier/frp/releases
 
这个服务器端非常的小巧精悍,除了一个配置文件之外,就只有一个可执行文件了,将其放在服务器的某个目录下,如:/usr/local/frps/
 
其配置文件去除了各种注释之后,内容也不多,/usr/local/frps/frps.ini
[common]
#服务器监听端口7000
bind_port = 7000
#服务器web管理界面的访问端口
dashboard_port = 7001
#服务器web管理界面用户名
dashboard_user = admin
#服务器web管理界面密码(记得改成你的)
dashboard_pwd = 123456
#日志文件
log_file = ./frps.log
#日志等级
log_level = info
#日志保留天数
log_max_days = 3
#客户端访问token(记得改成你的)
token = 654321
#服务器端允许客户端请求的端口范围是5000到5009
allow_ports = 5000-5009
max_pool_count = 5
max_ports_per_client = 0
authentication_timeout = 900
#使用多路复用
tcp_mux = true
注意:
1,让防火墙允许7000和7001端口,5000-5009不必打开,因为这都是本地直接使用的端口
2,让frps自动启动(推荐通过systemd来实现)
3,启动参数:/usr/local/frps/frps -c /usr/local/frps/frps.ini,表示使用frps.ini这个配置文件
4,注意查看日志文件,日志文件就在/usr/local/frps目录下,注意确保目录有写入权限
 
frpc配置
 
frpc是位于路由器上的应用。其实路由器本身也是台Linux主机,你可以打开路由器的ssh上去看看,但我还是建议在配置的frpc的时候,先用你自己的电脑尝试,这样更方便一些。什么?你没有Linux?有虚拟机吗?没有?WSL了解一下。
 
我最后的配置文件是这样的:
[common]
#服务器的地址(公网)
server_addr = 123.123.123.123
#服务器的监听端口
server_port = 7000
#服务器的token(改成你的)
token = 654321
#日志文件配置,调试的时候就靠这个了
log_file = /var/log/frpc.log
log_level = info
log_max_days = 3
#启用多路复用
tcp_mux = true
#协议,除了TCP之外还有一个经过改进的协议,但我这边使用时候遇到了点问题,还是用TCP吧
protocol = tcp
#不要登录失败就退出
login_fail_exit = false #应用名称
[dsm]
#http是基于TCP协议的,我统一都当成TCP来处理好了
type = tcp
#本地IP地址
local_ip = 192.168.1.200
#本地端口
local_port = 5000
#服务器上要打开的端口
remote_port = 5000
#使用加密
use_encryption = true
#使用压缩
use_compression = true [photo]
type = tcp
local_ip = 192.168.1.200
local_port = 80
remote_port = 5002
use_encryption = true
use_compression = true [webdav]
type = tcp
local_ip = 192.168.1.200
local_port = 5005
remote_port = 5005
use_encryption = true
use_compression = true [router]
type = tcp
local_ip = 192.168.1.1
local_port = 80
remote_port = 5003
use_encryption = true
use_compression = true
注意:
1,注意查看日志调试,你不可能一点问题都没遇到的,见招拆招吧
2,你要实现确定LAN里的各个Web服务本地可用,如果出现问题,要懂得顺藤摸瓜,定位问题所在
3,调试好了之后,把配置放到路由器的frpc里,路由器虽然提供了图形界面,但我觉得不好用,不如直接弄配置文件
 
最后
 
本文似乎省略了不少内容,是的,比如nginx具体如何安装?防火墙具体如何设置?certbot具体怎么用?如何刷梅林固件?我不打算都写上,否则本文就可能膨胀为“如何使用Linux”了。凡是有能力折腾frp的人,我相信都能通过搜索来解决那些小问题,都能见招拆招。
 
我当然知道还有别的配置方法,我提供的方法仅仅是其中一种可行的,如果大家觉得有什么更好的方法,可以在评论区留言。
 

群晖NAS再再折腾的更多相关文章

  1. 群晖NAS再折腾

    端口转发 两年前我买了一台双盘位的群晖NAS,配置两个4T的硬盘,这玩意儿一度改变了我使用电脑的模式,真是爽爆了!最最主要的功能就是我能用它规整我所有的资料,并且不管何时何地,只要有网就能访问.为了能 ...

  2. 在群晖NAS上运行URLOS之后竟然能安装Discuz! Q!!

    如果我们手头上有1台群晖NAS时,有没有考虑过把群晖NAS当成服务器来使用,这样会不会很有意思呢? 现在,我们终于可以尝试一番了,把群晖NAS变成一台实实在在的服务器,在上面跑各种运行环境!其实很简单 ...

  3. 电脑桌面与群晖NAS双向实时同步-20210105

      电脑桌面与群晖NAS双向实时同步 2021年1月15日星期五   一.购买群晖DS920+网络存储服务器.NEC超轻笔记本电脑(重量小于800克).小米10至尊版安卓智能手机和intel i9 1 ...

  4. 异地远程访问群晖NAS中的文件

    异地远程访问群晖NAS中的文件   我以群晖DS720+网络存储服务器为例,介绍我是如何异地远程访问群晖NAS中的文件的.   此文章只介绍部署操作的大概步骤,具体的操作方法和技巧可以在西瓜视频.抖音 ...

  5. 黑群晖NAS安装方法(收集)/物理机/VMware虚拟机/KVM虚拟机(转)

    群晖NAS系统的特点: 1.正版的群晖分为两部分,启动引导和系统文件,其中启动引导是一个闪盘,镶嵌在群晖的主板上,而系统文件是现成下载然后倒入的pat文件. 2.黑群晖破解的主要是启动引导,其实能兼容 ...

  6. VMware 15.5虚拟机安装群晖NAS

     一.群晖nas简介 NAS(Network Attached Storage:网络附属存储),按字面意思理解其实就是网络存储器,可以理解为存储资料的网盘,云盘.NAS本身支持多种协议(如NFS.CI ...

  7. 群晖NAS网络存储服务器防盗防小偷

    群晖NAS网络存储服务器防盗防小偷 根据群晖NAS的实际测量外形尺寸到淘宝网邮购金属  配电箱(弱电箱). 把配电箱(弱电箱)用粗螺丝固定到机柜或墙壁上. 把群晖NAS用密码纯铜挂锁锁在配电箱(弱电箱 ...

  8. 群晖NAS简介(转)

    Synology 群晖科技(Synology )创立于 2000 年,自始便专注于打造高效能.可靠.功能丰富且绿色环保的 NAS 服务器,是全球少数几家以单纯的提供网络存储解决方案获得世界认同的华人企 ...

  9. 使用群晖NAS:配置Git server

    1.首先在群晖的DSM的控制面板中创建一个用户例如是Git_test(我给了管理员权限) 2.在套件中心安装 Git server 3.打开Git server 勾选用户 Git_test 4.在控制 ...

随机推荐

  1. yum更换国内源、yum下载rpm包、源码包安装 使用介绍

    第5周第4次课(4月19日) 课程内容: 7.6 yum更换国内源7.7 yum下载rpm包7.8/7.9 源码包安装 7.6 yum更换国内源 当yum仓库的软件不好用时,例如很多yum源都是国外的 ...

  2. matlab 降维工具 转载【https://blog.csdn.net/tarim/article/details/51253536】

    降维工具箱drtool   这个工具箱的主页如下,现在的最新版本是2013.3.21更新,版本v0.8.1b http://homepage.tudelft.nl/19j49/Matlab_Toolb ...

  3. Mac配置Gradle环境

    下载Gradle 下载地址:https://gradle.org/install 下载最新版本:gradle-3.3 (当前最新版2017年2月8日) 配置Gradle环境 我的本机Gradle存放路 ...

  4. Docker 构建私有仓库

    Docker Hub 目前Docker官方维护了一个公共仓库Docker Hub,其中已经包含了数量超过15000的镜像.大部分需求都可以通过在Docker Hub中直接下载镜像来实现. 可以在htt ...

  5. 优雅解决 SpringBoot 工程中多环境下 application.properties 的维护问题

    微信号:geekoftaste, 期待与大家一起探讨! 背景 我们知道 SpringBoot 有一个全局的配置文件 application.properties, 可以把工程里用到的占位符,第三方库的 ...

  6. su和sudo的区别与使用【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  7. 基于webpack实现多html页面开发框架六 提取公共代码

    一.解决什么问题 1.如果a.js和b.js都引用了common.js,那在打包的时候common.js会被重复打入到a.js和b.js,造成重复打包 2.单独打包common.js对性能有帮助,浏览 ...

  8. hdu1710 Binary Tree Traversals

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 题意:给前序.中序求后序,多组 前序:根左右 中序:左右根 分析:因为前序(根左右)最先出现的总 ...

  9. HDU2255 奔小康赚小钱钱(二分图-最大带权匹配)

    传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子 ...

  10. CodeForces-999A-Mishka and Contest

    Mishka started participating in a programming contest. There are nn problems in the contest. Mishka' ...