创作立场声明:不知道这种偏技术向的文章发在smzdm是否合适?文中我已经省去了非常多的技术细节,只讲方案思路。如果确实想了解更详细的技术配置,可以在评论中说一下,后面再发一篇文章讲讲中间技术细节。
背景
起因与成果
最近找运营商整了个公网 IP,于是乎,能玩的东西就变多了这里就介绍如何安全的远程访问路由器,包括:
访问路由器管理页面
访问 aria2 远程下载(主要是普通 HTTP(s) 下载、BT 下载)
访问 transmission 远程下载(主要是挂 PT 下载)
实现远程访问,我们能做到非常多之前无法做到的,比如:
逛街吃东西,朋友分享个电影,远程下载,回家就能看
出门在外,家里人反馈 WIFI 问题,远程打开路由管理页面排查定位问题
上班时忘记拷贝文件,访问家里的网路共享盘,远程同步
……
虽然很多时候远程访问并不是强需求,但有需求的时候,你就知道有多好用了
那么,先晒一下成果(以下都是在手机 4G 环境模拟远程访问的情况,截图右上角 4G )。
安全起见,文中所有涉及我自己的域名、端口的信息都打码了。
首先是远程访问路由管理页面:
然后是远程访问 aria2 下载管理
最后是 Transmission 管理
听说浪客剑心漫改电影准备出终章了,赶紧把前三部翻出来看看,
也就是上图中活跃列表的第二个,RUNOUNI KENSHIN TRILOGY(浪客剑心三部曲)
我们的目标
首先,安全是最重要的!!!直接暴露公网,最大的一个问题就是安全问题,
如果访问控制没有做好、存在弱密码情况,就可能被扫描爆破,然后”家访”
,比如:
破坏你的路由环境,比如恢复下出厂设置、修改管理密码、修改 WIFI 密码等
把你辛辛苦苦下载的高清资源删掉,让你一夜回到解放前
暴露你的一些隐私信息
开个后门以后不定期”家访”,等等
安全无小事,这个可不比说 windows 系统果奔,不装杀毒软件。
一定要重视重视再重视!
我们的计划
整一套规划其实还是比较繁琐的,大概思路如下:联系运营商分配公网 IP
配置动态域名解析(运营商分配的 IP 不是固定的)
申请免费 HTTPS 证书
替换路由器默认 Web Server 为 Nginx
配置 HTTP2.0 代理作为统一外部入口
配置端口映射将非标准 HTTPS 端口暴露到公网
因为篇幅原因,前面几步本文不准备展开讲(1-3 步)
如果有需要的话,后续再另外开一篇文章来分享,这里直接从替换 Nginx 开始
修改路由Web服务器
在修改使用 Nginx 之前,我进行了以下规划:内网入口部分——保持原样
原来是怎么用的,现在就是怎么用的
内网较为安全,单纯的密码认证即可,不需要启动 HTTPS 增加路由器消耗
外网入口部分——安全的前提下开放特定服务远程访问
启用 HTTPS 防止被抓包泄密
使用非标准服务端口减低提高扫描爆破的门槛
使用非语义明确的访问路径降低被社工的风险
为什么是Nginx?
OpenWRT 默认使用的是 uhttpd 作为 Web Server。uhttpd 是一个非常精简的 Web Server,满足嵌入式设备的轻量任务需求。
但是此次需要进行反向代理来暴露内部服务,Nginx 是更适合的:
在反向代理方面,Nginx 更加成熟
在性能方面,Nginx 也是更强大的
其他功能实现上,Nginx 更加完善,并且最重要的,我更加熟悉
同时,在使用 Nginx 之后,一些特性也可以直接用上了,
比如非常适配路由器 WEB 服务的 HTTP/2.0 (可以参考这篇文章:HTTP2.0优势详解)
安装与配置
较新版本的 OpenWRT 软件仓库中已经有支持 luci 的 nginx 模块了,直接安装即可。关于替代 uhttpd 来提供路由管理系统的 WEB 服务,实际上是由 nginx + uwsgi 实现的
软件包软件包内容uwsgi-cgiuwsgi 的本体服务以及主配置文件uwsgi-cgi-luci-support支持 luci 的 uwsgi 子配置文件nginx-mod-luci转发 luci 请求给 uwsgi 的 nginx 子配置文件至于 nginx 软件包,我选择的是 nginx-all-module 这个版本,
相当于是把所有可能用到的 nginx 模块都打包进入,比普通的 nginx 软件大约多了 600 KB,
大小可以接受的,毕竟后续有需要什么常规模块就不需要重装,加上对应配置就可以运行了。
安装完毕后,先把原来原来的 uhttp 停掉,并启用 nginx
/etc/init.d/uhttpdstop
/etc/init.d/uhttpddisable
/etc/init.d/nginxenable
/etc/init.d/nginxstart实际上,我安装完 nginx ,uhttpd 已经自动退出了,所以第一步命令可以不需要执行
然后就就可以直接打开路由器管理后台地址来体验 Nginx 的带来的服务了
我的网关修改为 10.0.0.1 跟普通的 192.168.*.* 不太一样
对应的,可以直接到路由器上查看生成的 nginx luci 访问配置
HTTP/2.0 配置
目前安装的 Nginx 版本非常新,并且因为是 all-module 版本,已经包含了想要的模块:http_v2_module:HTTP/2.0 支持
http_ssl_module:HTTP SSL 支持
如上面所说,不影响到现有内网访问方式,因此我们新建一个配置文件:
/etc/nginx/conf.d/k3-https.conf证书使用的是 Let’s encrypt 的免费证书,使用 ACME 申请/自动续签。
最下面的 Luci 配置截图不全,不过其实就是照搬原来安装 nginx-mod-luci 生成的配置。
配置外网映射
主路由不是我能控制哈哈,用的还是一个非常渣渣的腾达路由器幸好,还能支持端口映射:
通过端口映射将 K3 路由器对应的 HTTPs 端口暴露到公网即可
如果 OpenWRT 开启了防火墙,记得开放一下该端口的外网访问,否则会被拒绝无法访问:
然后就可以通过之前配置好的 ddns 域名进行访问(在 4G 环境下访问)
可以看到图中下方地址栏部分的小锁头,就是走 https 协议,手机跟路由器之前的数据传输是加密的。
SSL跑分测试
现在各种东西都能跑分测试,SSL 也来一个吧顺便跑一下 ssl 测试:
https://www.immuniweb.com/ssl/
https://www.ssllabs.com/ssltest/
之前用的比较多的是 ssllabs 提供的测试,不过这个站点不支持非标准端口的测试,
因此只能选择 immuniweb 的测试了,结果如下:
其中有两个 NIST issue,分别是:
SERVER DOES NOT SUPPORT OCSP STAPLING
证书吊销验证相关的配置,暂不考虑
SERVER DOES NOT SUPPORT EXTENDED MASTER SECRET
因为配置了不支持 TLS v1.2 以下版本,不兼容老的客户端,然而我又不准备给你们用
代理
aria2 配置
aria2 访问是分成两部分的:Web-UI 部分
也就是 web 前端,通过 rpc 与 aria2 服务端通信,来实现对 aria2 的管理,
比如添加下载任务,查看下载进度,查看实时上传及下载速度等等
这部分可以简单理解为一个网页版的客户端。
RPC 部分,
这部分才是真正的 aria2 服务,只有在 web-ui 上配置好 aria2 的 rpc 访问,
才能正常连接上 aria2 服务端,并实现远程访问,进行相关下载操作
rpc 就是我们需要通过代理来暴露服务到公网,对应 Nginx 配置如下:
我比较喜欢的 Web-UI 是 AriaNG,最终效果如下(在 4G 环境下访问):
这样不论在什么地方,只需要有网络访问,都可以给家里的 aria2 添加新的下载任务
transmission 配置
transmission 与上面的 aria2 大同小异,对应的 Nginx 代理配置如下:增加多一个配置是用来做自动跳转,这样就不需要输入那么长的访问地址了:
通过 WEB 访问 trss 时候,直接跳转到 transmission 的 Web 管理系统
通过 Nginx 代理把 Web 管理系统请求转发给 transmission
如果要求不高的话,可以直接用 transmission 自带的 Web-UI 管理,
我比较喜欢用这个软件:TransmissionRemote,具体效果如下:
安全性
通过上面的介绍,总体的安全性配置有:配置非标准端口,提高被发现的门槛(遇到全端口扫描就没办法)
配置非语义明确的访问入口(遇到遍历扫描就没办法)
开启软件本身的密码或者 token 认证,并且尽量使用强密码(提高被密码爆破的门槛)
利用 nginx https 加密远程访问的数据(访问过程中避免被抓包)
没有百分百安全的方法,能做的其实就是尽可能提高被爆破的门槛!
网友评论