是的,人菜瘾还大的我,根据我自己的需求将r2s配置成了All in One服务器,不仅将r2s当成路由,还在上面跑了一些r2s本身不该承担的程序,既然斥巨资入手了这个小钢炮,就想好好利用起来。

TL;NR/太长不看

使用r2s,干了以下事情:

  • 友善官方openwrt固件节省固件折腾
  • 利用相关插件实现r2s本机及r2s的LAN口网络自由上网
  • AdGuardHome对内对外去广告
  • 利用公网IP,使用WireGuard对外安全暴露一个UDP端口进行从外返回内网
  • openwrt系统安装docker,利用docker安装vaultwarden等镜像
  • Nginx反向代理vaultwarden给内网及通过WireGuard从外访问
  • 给r2s加装USB无线网卡,使其成为一个功能完备的路由器

写在开始

这是水r2s相关的第三篇文章,前两篇传送门:

当初入手的时候我就考虑了,除了将其当成路由器使用外,还需要在上面跑一些需要跑在内网的服务,以及当做一台借助公网IP作为从外面连回内网的设备。

入手一个月了,各种方案都试了一遍,也算是成功实现了我想要的各项功能,而且到目前为止还算稳定,就想着把我的折腾经过以及折腾思路分享出来,希望能帮助到有类似需求的朋友,或者是抛砖引玉看是否有类似需求的大佬有更好的思路我能抄个作业。

我手上有多台闲置的x86主机,所以我对r2s并没有下载的需求,所以我并没有在r2s配置下载相关功能,也不需要在r2s上运行性能要求高的任务。

前情提要

先说说我的网络环境。

我目前大多时间需要联网的设备也就两个手机、一个智能音箱、一台NUC8i5BEH硬改了网卡及蓝牙的黑苹果系统主机,一台小体积安装了Proxmox VE系统当做服务器4代CPU的主机,以及刚入手的r2s了,且没有物理穿墙的需求,所以我并没有单独配置路由器,直接是用了运营商办宽带配置的光猫进行拨号以及当成无线路由器使用,且光猫有超管密码,能进行我想要的大多数设置。

在第一篇我之前说过,据我所知,r2s有三个官方对其有固件支持,分别是友善官方、openwrt官方以及armbian官方,在三个固件都体验了之后,我最终选择了友善官方固件,因为经过我的对比,友善官方虽然不是最精简的,但是相对别的两个固件,友善官方固件对r2s功能支持最为完备,比如说三个LED灯、Reset按钮等,且对USB网卡也有支持。

r2s安装AdGuardHome

AdGuardHome是一个可以运行在Windows、macOS、Linux及OpenWrt等系统的可自定规则的DNS服务器,其支持裸TCP/UDP、DOT、DOH等解析方式,除了直接从上游DNS服务器查询结果返回给客户端之外,还能根据规则对DNS结果进行不同的处理。

说人话就是,可以利用AdGuardHome在内网搭建一个去广告及可自定义解析结果的DNS服务器,配置好AdGuardHome之后,所有通过r2s的设备都可以在DNS层面上一定程度地去广告。

有很多种方式可以安装AdGuardHome,比如说Docker镜像、AdGuardHome官方一键安装脚本、openwrt源,但是为了操作简便,我选择了这个LUCI App进行安装管理:

https://github.com/rufengsuixing/luci-app-adguardhome

从代码提交记录上看,作者还是在2019年对这个项目进行了更新,时隔三年,我目前发现还是能正常使用。

这个包安装过程没啥说的,到项目的releases页面下载ipk文件,然后到openwrt管理界面安装即可。

我这里说下我在使用过程中遇到的几个坑。

安装完ipk之后,AdGuardHome核心需要单独下载,不知道是不是历史遗留问题,这个项目作者下载AdGuardHome的命令使用的是wget-ssl,但是我发现openwrt源里有wget-ssl这个包但是并没有提供wget-ssl可执行程序,所以,下载AdGuardHome核心之前可能需要到openwrt终端执行如下两行命令:

opkg update
opkg install wget-ssl
ln -s /usr/bin/wget /usr/bin/wget-ssl

这样就能解决wget-ssl命令不存在的问题了。当然,如果还是出现AdGuardHome核心无法下载的情况,建议先配置好r2s自由上网。

还有一个问题就是,openwrt自带的DNSMASQ默认监听端口就是53,而如果要使用AdGuardHome运行到openwrt且为局域网设备提供DNS解析及广告过滤服务也要让AdGuardHome监听53端口才可行,所以这就造成了一个冲突,要么让DNSMAQ监听53端口,要么是AdGuardHome监听53端口。

我的选择是,不修改DNSMASQ的配置,让DNSMASQ监听53端口,AdGuardHome监听别的端口比如5335,再将将53端口重定向到AdGuardHome所监听的端口,这样可以不影响DNSMASQ本身的功能,即使重启之后AdGuardHome服务没有启动或者意外退出也不会影响局域网内的DNS解析,如图:

将53端口重定向到AdGuardHome

r2s使用docker运行容器

docker本身我应该没必要过多介绍,简单一句话就是,可以通过在openwrt上安装docker然后利用docker运行各种需要的服务。

友善官方固件是自带了docker相关服务的,如果选择的是openwrt官方固件,可以通过如下命令进行安装:

opkg install docker dockerd luci-app-dockerman luci-i18n-dockerman-zh-cn	

如果不需要图形化管理docker,后面两个包不安装也行,但是我为了方便管理不用每次通过命令行查看,还是安装了后面两个包。

安装完之后重启,再次登录后台就能看到Docker的入口了,具体可以查看我上面的截图。

Docker安装vaultwarden

vaultwarden是bitwarden的开源实现,利用vaultwarden配合bitwarden的客户端软件,可以自行部署一套密码管理系统。

一般来说,使用docker安装vaultwarden会使用docker-compose,同样的,docker-compose对ARM平台也有支持,项目release页面如下:

https://github.com/docker/compose/releases

如果是r2s的话,下载aarch64架构,亲测是可以运行的,搭配vaultwarden的配置文件即可快速运行,详细步骤可移步这里:

docker-compose运行vaultwarden

openwrt安装运行Nginx

经过我的实测,vaultwarden默认是不支持HTTP协议,要正常使用vaultwarden,需要配置HTTPS,vaultwarden镜像确实可以直接配置HTTPS,但是为了443端口复用,我选择使用Nginx反代vaultwarden。

openwrt安装Nginx没啥可说的,一行命令即可:

opkg install nginx-ssl

安装过程最后应该会报错,但是可以忽略,对后续应该没有什么影响。

如果直接启动Nginx,大概率是会出错的,报错如下:

root@FriendlyWrt:/etc/nginx# nginx -t
2022/04/01 22:22:13 [emerg] 4216#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed

因为安装过程中并没有自动生成Nginx所需要的nginx.conf文件,解决问题的办法也很简单,一行命令即可:

cp /etc/nginx/uci.conf.template /etc/nginx/nginx.conf

执行完之后再次启动Nginx应该是没问题了。

Nginx反代vaultwarden可以参考上述文章。

openwrt配置WireGuard

除了当路由器用,我还想将r2s打造成一个对外回家的网关,尝试了很多种方案,最后发现WireGuard配置最简单且最适合我,这里简单说下我的WireGuard配置过程。

默认情况下,openwrt应该是不带WireGuard的,安装命令如下:

opkg install wireguard-tools luci-app-wireguard

安装完成之后,在openwrt的控制面板的状态→WireGuard里面能看到当前设备的WireGuard的运行状态。

要配置好WireGuard,还需要生成一对公钥及私钥,终端执行如下命令即可生成:

wg genkey | tee privatekey | wg pubkey > publickey

生成的privatekey为私钥,不能对外公开的,publickey为公钥,需要分发给客户端。

生成之后,到openwrt控制面板按照如下路径添加新接口:网络→接口→添加新接口,

接口名称可以自定义,类型选择WireGuard,如图:

openwrt系统WireGuard添加新接口

添加完之后,点击对应接口后面的编辑,出现如图选项:

openwrt系统WireGuard配置-1

私钥选择上述生成的或者点击秘钥进行生成,然后随意输入一个监听端口,以及一个openwrt端使用的内网IP地址,比如我这边的10.10.10.1,需要注意的是,所选择的监听端口需要可以外网访问,我是在光猫上做了NAT映射,直接将此端口暴露到了公网。

设置完之后,切换到对端选项卡,如图:

openwrt系统WireGuard设置-2

此处的公钥为设备端的公钥,且允许的IP为分配给设备端的,比如说我用的iPhone,分配的IP就是10.10.10.2,各个设备注意不要重复即可。

详细的WireGuard配置过程可参考这里:

为r2s添加无线网卡作为无线路由器使用

虽然说我可以直连光猫进行上网,但是如果通过光猫的WiFi直接上网的话,没法使用到r2s的透明网关以及AdGuardHome的去广告服务,稍加手段也能将无线流量从光猫到r2s绕一圈再出去,但是这么做如果r2s挂了可能会导致整个局域网无法上网。

我知道就算千兆二手的无线路由器很便宜就能买到,但是我需要使用无线网络的设备并不多,再加上我不想多一个路由器以及多一堆的线,为了整个局域网的网络稳定,我还是决定给r2s加挂一个USB无线网卡,给它补上无线功能,使它变成一个完整的路由器。

需要说明的是,经过我的实际测试发现,并不是所有的USB无线网卡都默认能在r2s上驱动,即使部分USB无线网卡通过openwrt安装软件包的形式成功驱动了,也不一定能当做热点来使用,比如我手上的小米随身WiFi,能通过安装驱动成功识别,但是并不能当做AP让别的设备连接它进行上网。

r2s默认支持的USB无线网卡可查看r2s的官方文档:https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R2S/zh#.E5.A6.82.E4.BD.95.E4.BD.BF.E7.94.A8USB_WiFi

也就是这个原因,我最终选择将r2s的固件从openwrt的换成了友善官方的。

在查看了r2s的官方文档之后,我最终选择了COMFAST的CF-811AC,某东入手价格35,支持2.4G及5G频段,r2s的FriendlyWrt系统默认支持,插入即可直接使用,如图:

r2s USB无线网卡

插入之后默认会多出一个FriendlyWrt-xx:xx:xx:xx的WiFi,我上面为了方便区分,改成了r2s。

至于无线网络信号强度,在不物理穿墙的前提下,信号可以满格,NUC及手机同时连接体验也不会有影响。但是实话实说,毕竟是USB无线网卡,不能跟纯粹的路由器相比,信号强度及网速只能说能用,并不能要求太高,这是手机连接r2s的无线网卡的测速截图,出口宽带为100M/30M:

r2s USB无线网卡测速

这个速度,肯定是没有跑满出口宽带的,但是要求不高的话,日常还是够用的,至少手机刷刷视频上上网是没有问题的。

COMFAST的CF-8111AC在FriendlyWrt系统上5G频段的默认信道是36,可能会出现部分设备无法搜索到,我经过实测,发现选择信道40可以让我手上的所有设备连接上。

这里多说一句,因为我上述说了,我的r2s配置好了透明网关及AdGuardHome广告过滤,我无论是电脑还是手机通过r2s的无线网络上网,都能享受到相关服务,一个很明显的体验就是,借助AdGuardHome的DNS去广告服务,各个App的启动速度明显加快,且部分App里面的推广信息明显变少,比如说B站、微信的信息流广告等。

r2s稳定运行情况

本来r2s定位只是一个软路由,却被我配置了这么多本来不该由它运行的服务,承受了不该有的压力,所以我也好奇跑这么多不相干的服务会不会导致r2s本身变得不稳定,但是经过我的实际使用发现,即使跑了这么多不相干的业务,r2s稳定性还是可以的,所有服务配置好之后到我写这篇文章的时候已经运行了将近2个星期,如图:

r2s稳定运行情况

r2s All In Boom使用体验

说到底还是喜欢瞎折腾,不仅是折腾的结果,我更喜欢的是整个折腾的过程,作为一个玩具,r2s我折腾了将近一个月,我个人觉得这200多块钱花的比较值,我对r2s的性能以及功耗等各方面都比较满意。

我分享这些并不建议大家跟我一样在r2s上部署这么多服务,毕竟再怎么说r2s定位也是个软路由,稳定性才是第一,再加上r2s使用的是TF卡,个人不负责任地认为,稳定性可靠性肯定没法跟普通的机械硬盘甚至是固态硬盘相比,像我一样部署了vaultwarden这种重要数据的服务还需要单独做好数据备份。