前言
玩NAS的朋友应该有比较多只是在家庭局域网使用,比如日常看看电影、备份手机照片什么的,这属于家庭局域网的使用场景。
当然了,如果你经常出差,或者过年回家不想把NAS也背回去,或者是想上班摸鱼,或者是NAS搭建游戏服务器之类的能公网访问就很有必要了。
公网访问我自己也折腾过很久,俗话说的好上帝给你关上了一扇窗也会顺便把门给带上,我目前的情况是:申请公网IP——没门;使用IPv6——运营商不支持;向日葵——太贵;免费FRP——不稳定。
最近(2024年底)终于刷到一个便宜可靠的方案passnat,最低套餐只要6元每月50G流量,部署起来也比较简单,飞牛官网和passnat的官网(passnat.com)都有教程,B站也有不少视频教程,照着做就行。
我自己也试了一下,只花了不到2小时就弄好了,用起来也非常流畅,但是有个很严肃的问题那就是安全与隐私!而且安全与隐私问题也是所有教程中都没有提到的问题(也不知道这些做教程的人是怎么想的,不懂HTTPS的重要性?没有安全意识?还是压根不在乎安全?),今天这篇文章就进行重点讨论基于FRP的内网穿透的安全设置,并以passnat为例给出解决方案,本文不适用于已有公网ip及域名的使用情形。
安全隐患
首先第一个问题,几乎所有的教程在设置时都选的是TCP或HTTP,我几乎没看到选择HTTPS的,这就是摆明了让个人数据在网络上裸奔呀!!!
第二点,当你注册passnat以后就会看到用户协议(https://www.passnat.com/illegal/
),我估计大多数人都没看吧?直接点击了下一步是不是?我们重点来看这几处
假设,我在NAS中保存了和老婆“亲热”的照片,后来我出差,想老婆了,公网访问NAS看了这些照片,如果没有加密,这些照片就有可能被监管系统扫描到,而且很有可能会被识别为H内容。也就是说,你可能只是在公网看了一眼老婆的照片,然后突然就被封了号,甚至可能会以传播XX内容被带走,真的是人在家中坐祸从天上来。
你肯定会在passnat官网上看到类似这样的通知,你也不想让自己的账号出现在这里吧?
另外一种场景,相信也是大家几乎都会遇到的场景,玩NAS的谁没有个千八百部的影音资源呢?敢问在座的各位,有多少人能保证自己的电影是买来的正版资源?假设我在公网访问这些电影,然后没有加密,然后又被监管系统扫描到,然后被识别为盗版侵权,然后又是人在家中坐祸从天上来。
所以说,无论是为了防止被监管系统扫描个人隐私,还是被不法分子恶意抓包,或者说是其他情形,加密都是非常重要的一件事情!
BTW:为什么我总是在说“监管系统”?可能你有过体会,或者从网上看过一些新闻,比如微信群聊封号,比如反诈APP,总之你明白我的意思吧。而且别忘了注册passnat是实名认证的。
准备工作
查阅passnat官网文档可知,源站如果支持https只要简单配置一下就行。
https://doc.passnat.com/docs/app/https?current=https
对于我们而言,这里的源站指的就是飞牛OS,正好飞牛OS原生支持http和https,假如说飞牛OS原生只支持http,配置起来会略微麻烦一点,不过网上有大量文章,这里不再赘述。
我为了安全,在飞牛OS开启强制https,当然我建议大家也都开启。
点击【系统设置】->【安全性】->【端口设置】->【高级设置】->勾选【强制HTTPS连接】,这里也建议勾选【重定向80与443端口】,这样做的好处是域名访问不用填端口号,更方便使用。
生成证书证书
方法一:使用飞牛OS的证书(推荐)
安装飞牛OS时系统会自动生成一个证书,这个证书每个人都是不一样的,可以放心使用。
【系统设置】->【安全性】->【证书】->【fnOS】->【下载】
注意:这里下载的证书包含证书本身以及证书密钥,后续我们要用到证书,不会用到密钥,但密钥文件一定要妥善保存,一旦泄露就等于你把家里大门的钥匙给了别人,建议用完就删,装了360的话就右键选择文件粉碎。
我们要做的就是下载这个证书然后添加到你的电脑上,具体方法请直接阅读【添加根证书】章节。
方法二:自签名证书(适合喜欢折腾的人)
首先是准备工作,安装openssl。linux系统一般自带,没有就去安装,具体怎么装自己想(你都用linux了还不懂怎么安装吗?)
windows系统如果你装过git,或一些安全软件,那么大概率这些软件的安装目录下就有个openssl可以直接用。没有的去官网下载并安装(https://slproweb.com/products/Win32OpenSSL.html),一般人选择Win64 OpenSSL Light这种就好了,exe或msi都无所谓,反正都能用,Light的这是轻量版,足够我们生成一个自签名证书了。
知道如何安装并设置环境变量的话,自己去设置,这样用起来会比较方便,不懂什么是环境变量就按我说的做。
找到openssl.exe所在的目录,例如我的是C:\Program Files\OpenSSL-Win64\bin
,在空白处按住shift点击右键,选择【在此处打开powershell窗口】
或者按win+r
,输入powershell
,命令行中输入cd openssl的安装目录
,带空格的目录记得加引号,例如cd "C:\Program Files\OpenSSL-Win64\bin"
以下内容中的所有命令都以linux系统为例,windows请自行将命令中的openssl
替换为openssl.exe
。
命令只讲关键参数,其他参数请搜索或询问AI。
生成自签名根证书
生成跟证书密钥
这个文件一定要妥善保存,一旦泄露就等于你把家里大门的钥匙给了别人
openssl genrsa -out myca.key 2048
genrsa: 生成RSA密钥对的子命令
-out selfca.key: 指定输出的私钥文件名为selfca.key
2048: 指定RSA密钥长度为2048位,这是目前推荐的安全密钥长度
生成根证书
openssl req -new -x509 -nodes -key myca.key -sha256 -days 730 -out myca.crt -subj "/C=CN/CN=My Root CA/O=MyRootCA"
req: 表示生成证书请求或证书
-new: 生成新的证书请求
-x509: 生成自签名证书而不是证书请求
-nodes: 不加密私钥(no DES)
-key selfca.key: 指定使用的私钥文件,也就是上一步生成的文件
-sha256: 使用SHA256算法签名
-days 365: 证书有效期为365天,建议久一点,否则过期了就要重新签发证书
-out ca.crt: 输出证书文件名为ca.crt
证书主体信息(-subj参数):
/C=CN: 国家代码为中国
/CN=My Root CA: 通用名称为"My Root CA",这里随便改,起个你的名字
/O=MyRootCA: 组织名称为"MyRootCA",这里随便改,起个你的名字
生成服务器根证书
生成服务器密钥
openssl genrsa -out server.key 2048
参数同上,但请注意这是服务器密钥,不要和前一个搞混了
这个文件也要妥善保存,一旦泄露就等于你把家里某个房间的钥匙给了别人
生成签署请求文件
openssl req -new -sha256 -key server.key -subj "/C=CN/O=MyRootServer/OU=MyServer/CN=改成你的passnat域名" -out server.csr
req: 处理证书签名请求
-new: 生成新的证书签名请求
-sha256: 使用SHA-256算法进行签名
-key server.key: 指定私钥文件,即上一步生成的文件
-subj: 设置证书主题信息,包含以下字段:
/C=CN: 国家代码(Country)为中国
/O=MyRootServer: 组织名称(Organization),这里随便改,起个你的名字
/OU=MyServer: 组织单位(Organization Unit),这里随便改,起个你的名字
/CN=XXXX: 通用名称(Common Name),通常是域名,这里改成你的passnat域名,例如myfnos.passnat.cc
-out selfserver.csr: 输出的CSR文件名
设置证书扩展信息
在当前目录随便新建个文件,比如123.txt
填写以下内容
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.example.com
DNS.2 = example.com
DNS.3 = *.example.com
IP.1 = 192.168.xxx.xxx
这个文件的配置内容有很多,这里只列举最重要的几个内容,更多内容请搜索:如何生成带有SAN(subjectAltName)的证书
DNS.1, DNS.2, …: 指定域名,替换成你的passnat域名,例如myfnos.passnat.cc
,如果有多个域名或者泛域名,序号累加接着往后填,对我们而言填1个就够了
IP.1, IP.2, …: 指定IP地址,一般是为了局域网内使用,需要的话也可以加,记得路由器里面给你的nas设置固定ip
使用根证书签署服务器证书
openssl x509 -req -in selfserver.csr -CA myca.crt -CAkey myca.key -CAcreateserial -out server.crt -days 365 -extfile ./123.txt
x509: 表示使用X.509证书标准
-req: 表示处理证书签名请求(CSR)
-in selfserver.csr: 输入文件是名为selfserver.csr的证书签名请求文件,也就是上一步生成的文件
-CA selfca.crt: 指定用于签名的CA证书,即【生成根证书】步骤中生成的文件
-CAkey selfca.key: 指定CA的私钥文件,即【生成跟证书密钥】步骤中生成的文件
-CAcreateserial: 创建CA证书的序列号文件(如果不存在)
-out selfserver.crt: 输出生成的服务器证书到selfserver.crt文件
-days 365: 设置证书的有效期为365天,需要小于等于根证书的有效期
-extfile 123.txt: 指定证书的扩展信息,即上一步的文件
至此所有需要的文件生成完毕,你需要保留的文件有
myca.key, myca.crt, server.key, server.crt
,其余的都可以删除了,再次强调,两个key文件需要妥善保存,这相当于你家大门的钥匙。
飞牛OS添加根证书
【系统设置】->【安全性】->【证书】->【新增证书】
描述随便填,比如我的证书;证书选择server.crt
,私钥选择server.key
,确认保存。
点击【服务配置】->【远程访问备用】选择刚刚上传的证书,其余的证书你如果用的话可以改。
至此飞牛OS的所有设置全部完成。
添加根证书
无论你使用的是飞牛OS的证书还是自签名证书,方法都是一样的
客户端添加证书
windows设备添加自签名根证书
最简单的方法:双击打开myca.crt
(如果是从飞牛OS导出的证书,请选择对应的crt文件),点击【安装证书】,下一步选择【当前用户】,下一步选择【将所有证书都放入下列存储】,选择【受信任的根证书颁发机构】,下一步,完成
虽然说这个证书是我们自己签发的,似乎应该选择【个人】,但是不要选!选【个人】的话这个证书依然不会被浏览器信任,还是会有警告。
手机、平板等添加自签名根证书
不同手机可能不一样,一般是【系统设置】,【安全】,【加密与凭据】,【安装证书】
另外手机上好像只能把证书添加到用户证书里面,不能添加到受信任的根证书里面,所以打开浏览器时还是会有证书相关的警告。
大概查了一下说是安卓7.0及以上版本,用户安装的证书不会被系统当做可信证书,需要用ROOT权限安装才行。
所以手机上的证书问题目前无解。
passnat设置
主要设置如图
更多细节以及飞牛OS相关配置请参考其他教程,本文不再赘述
公网访问
完成以上设置,并且在飞牛OS中部署好frpc客户端以后你就可以进行公网访问了,域名就是passnat给你的那个域名,如果一切顺利的话你的浏览器不会弹出任何警告,点击证书也可以看到这就是我们签发的证书。
如果你直接在地址栏输入域名出现以下情形
这是因为浏览器默认用http访问,解决方法很简单,就是指定使用https协议,在域名前加上https://
,这样浏览器就会用https访问了。
遇到的问题
openssl下载速度慢
别问,懂的都懂,你要学会【上网】
windows下提示 Can’t open xxx, Permission denied
以管理员身份运行powershell
执行命令提示 Can’t load XXX/.rnd into RNG
Can't load /home/user/.rnd into RNG
random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/home/user/.rnd
在那个目录(比如我这里就需要在/home/user/
)中生成一个.rnd
随机文件即可
cd /home/user/
openssl rand -writerand .rnd
其实脸滚键盘随便输入一大堆乱起八糟的东西然后重命名成.rnd
也行,这里只是需要一个随机的东西做种子确保安全性,这里需要“一大堆”乱七八糟的东西,至少要1KB以上吧
已添加证书,但是chrome打开仍然提示
此服务器无法证实它就是 XXXX - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接
其实就是本文的“设置证书扩展信息”章节
请参考https://www.cnblogs.com/bxmm/p/18583262
公网使用域名访问没问题了,但是局域网使用ip访问会提示不安全
网肯定会提示,因为我们的证书是针对域名签发的,而不是ip地址签发的。
解决方法很简单:1.签证书时把局域网ip也加进去;2.忽略(家庭局域网嘛,自己家里的路由器能有什么问题呢?)