0x00 前言

从过年回来到现在,一直在寻找路由器的替代品,一台设备集成路由、防火墙和基础的私有云。因为现在还不稳定的原因,不能组一台高性能网关(没地方放),而且这种设备基本上是通宵开机,不能影响休息,所以噪音不能太大,所以带机械硬盘和大风扇的就不用考虑了。

现在用是本科留下来的极路由2,因为固件不多,只能将就官方的系统,不过换成openwrt源之后,也实现了一些扩展,包括ss和v2ray的非透明代理(通过端口访问)。作为路由器来说,功能已经满足需求了,但是受限与性能和百兆网口,无法实现更加高级的功能。

后来在坛子里面收了台NUC,正好赶上鱼竿厂SSD降价,搭了一个简单的私有云(nextcloud方案),勉强满足了现有的需求。但是NUC最大的遗憾是只有一个独立的网口(不要提那个什么骷髅,穷!)。

前段时间也在淘宝买了台ER-X,折腾了两天,算是解决了百兆网络的瓶颈。因为性能还是捉急,也没有物理的扩展性(非标准POE真的坑),做不了独立的网关。不过基于Debian的EdgeOS真的好用,而且最新版系统中用了systemd管理服务,在软件方面有很大的潜力,于是打算稳定用了。但天有不测风云,用了两天,路由器莫名挂了,reset都没用,变砖了?!只好联系卖家寄了回去。后来想想,这东西相对极路由来说,其实并没有本质的提升,作为网关还需要额外的设备(wifi,透明代理受限于内核不能用)。售后也墨迹,两周没给出实质性的回复,索性退货了。

后来又去看了下各种软路由、硬路由的评测,顺便总结了下需求:

  1. 不占地方,ITX以上的就不考虑了
  2. 噪音小
  3. 性能不能太差
  4. 有一定硬件扩展能力

回过头来看,才发现NUC真的不错:小巧、core i系列处理器、pcie m.2、7mm sata、自带无线网卡……近乎完美,然而,它只有一个网口。虽然也能配置成单臂路由,但是也需要额外的设备(交换机支持VLAN)。最后,只能折中一下,在usb口上插一张胡会长同款有线网卡。

方案

最初本想在BSD上面搭建,但是折腾一段时间后弃疗了,Linux真香!

  1. 基础系统:ubuntu 18.04 x64 desktop
  2. 网络设备管理:systemd-networkd
  3. 防火墙:iptables
  4. DNS+DHCP:dnsmasq
  5. AP:hostapd
  6. 动态域名:ddclient
  7. web:apache2
  8. 私有云:nextcloud
  9. 媒体中心:emby
  10. 远程下载:transmission-daemon
  11. 代理:v2ray+shadowsocks-libev
  12. 透明代理:iptables tproxy(待续)

0x01 基础系统

这里选择ubuntu桌面版的唯一原因是:省事。

系统安装没什么说的,pcie硬盘装系统,sata装数据。

网络配置

三张网卡:eth0、eth1和wlan0。第一个是板载网卡,第二个是usb网卡,第三个是无线。

使用systemd-networkd配置网络。eth0作为wan口,只需要配置一个能上网的IP就行,这里配置为192.168.1.233/24。建一个网桥lan-br0,作为lan的虚拟交换机,然后将 eth1桥接到lan-br0上。wlan0暂时不用管,后面由hostapd统一管理。在lan-br0上配置好IP,作为内网网关,这里暂用192.168.133.1/24。在配置文件中打开IPForward以支持包转发。

iptables里面配置NAT,将192.168.133.0/24过来的数据包做MASQUERADE。iptables使用白名单配置,INPUT和FORWARD链默认禁用,允许来自内网的访问,允许外部icmp、https等服务协议访问:

https://s2.ax1x.com/2019/03/25/ANpzLT.png

使用dnsmasq作为DNS缓存和DHCP服务,将本机的域名写入host来避免内网NAT相关的问题(或者通过NAT loopback解决)。dnsmasq服务开机自启时会因lan-br0未就绪而启动失败,所以考虑在systemd服务配置文件中增加 Restart=on-failureRestartSec=3 ,用于在失败后自动重启,后面的ss和v2ray同理。

最后在ddclient中配置好动态域名,在光猫上做好转发,基础网络配置就差不多了。

AP

这台NUC集成了intel的8260ac无线网卡,本以为能用来作为5g 802.11ac热点,然而试了下发现不行(折腾了下国家代码啥的,似乎也没什么用):

https://s2.ax1x.com/2019/03/26/ANVKJS.png

翻了下intel的官方坛子,得到的结果是5g频段只支持作为客户端连接到AP……考虑到在家对无线网的需求不高,将就用2.4g了。hostapd配置就不贴了,需要注意的是,如果要用systemd来管理,需要在 /etc/default/hostapd 中,把配置文件路径赋值给 DAEMON_CONF 变量,然后unmask掉对应的hostapd服务。

0x02 软件部分

软件主要基于web,包括nextcloud、emby和transmission,除此之外,还包括ss和v2ray用于科学上网。

web服务器使用apache2,原因是nextcloud官方文档默认用的apache进行配置,省事。对apache2的配置主要包括https和代理。

https

首先配置https,生成一对服务器秘钥,然后生成包含密钥的CSR(Certificate Signing Request),向CA申请。有不少免费的可以用,例如letsencrypt,不过3个月就得重新申一次,比较麻烦。

这里也可以自签名,但相对来说,考虑到安全性,自签名证书得提前手动导入客户端,使用起来还是比较麻烦。拿到CA的证书后,apache配置如下:

https://i.loli.net/2019/03/26/5c99b26aded9e.png

nextcloud & emby & transmission

nextcloud跟icloud很像,除了网盘功能,还带照片自动上传、联系人备份功能。按照官方文档配就行,数据目录设置为sata盘的时候需要注意权限的管理。

emby对我来说貌似没太大的需要,用官方docker镜像就行了。

transmission用apt get官方仓库的transmission-daemon。

https://i.loli.net/2019/03/26/5c99b475a4023.png

http代理

transmission和emby提供了独立的web服务,也就是说他们在主机开了独立的服务端口,这里考虑使用apache代理提供外部访问服务,一方面继承了https,另一方面可以使用apache的授权模块,授权信息通过htpasswd配置:

https://i.loli.net/2019/03/26/5c99b7a076e05.png

https://i.loli.net/2019/03/26/5c99b5e0298d3.png

科学上网

本打算折腾透明代理,但做的时候发现维护起来并不算舒服(也有可能没找到正确的姿势),这里就仅仅在NUC的内网段开了两个端口,作为ss和v2ray的服务,客户端配合浏览器插件使用。

安装似乎没什么折腾的,v2ray用官方脚本,ss用apt get安装shadowsocks-libev。

ss安装后包含了server、local、tunnel和redir几个服务,我们这里只需要用到local,在 /etc/shadowsocks-libev 中添加一个配置文件(暂定local.json),执行 systemctl status shadowsocks-libev-local@local ,命令中最后一个local对应配置文件名字。

0x03 收工

虽然踩坑很多,但写起来似乎也就这样了,有需要再补充吧。

https://i.loli.net/2019/03/26/5c99bb6837aa0.png