群晖NAS再再折腾

问题

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

(直接访问方案网络结构图)
 
只须要对电信光猫(也是个路由器)和家用路由器进行端口映射的配置便可,而针对地址是“动态”的这个问题,只须要弄个动态域名解释便可。而如今变成这样:
(无公网地址的直接访问方案网络结构图)
 
电信光猫不具有真正的公网地址了。如何查看本身的光猫是否有公网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的人,我相信都能经过搜索来解决那些小问题,都能见招拆招。
 
我固然知道还有别的配置方法,我提供的方法仅仅是其中一种可行的,若是你们以为有什么更好的方法,能够在评论区留言。
相关文章
相关标签/搜索