折腾NUC
文章目录
0x00 前言
从过年回来到现在,一直在寻找路由器的替代品,一台设备集成路由、防火墙和基础的私有云。因为现在还不稳定的原因,不能组一台高性能网关(没地方放),而且这种设备基本上是通宵开机,不能影响休息,所以噪音不能太大,所以带机械硬盘和大风扇的就不用考虑了。
现在用是本科留下来的极路由2,因为固件不多,只能将就官方的系统,不过换成openwrt源之后,也实现了一些扩展,包括ss和v2ray的非透明代理(通过端口访问)。作为路由器来说,功能已经满足需求了,但是受限与性能和百兆网口,无法实现更加高级的功能。
后来在坛子里面收了台NUC,正好赶上鱼竿厂SSD降价,搭了一个简单的私有云(nextcloud方案),勉强满足了现有的需求。但是NUC最大的遗憾是只有一个独立的网口(不要提那个什么骷髅,穷!)。
前段时间也在淘宝买了台ER-X,折腾了两天,算是解决了百兆网络的瓶颈。因为性能还是捉急,也没有物理的扩展性(非标准POE真的坑),做不了独立的网关。不过基于Debian的EdgeOS真的好用,而且最新版系统中用了systemd管理服务,在软件方面有很大的潜力,于是打算稳定用了。但天有不测风云,用了两天,路由器莫名挂了,reset都没用,变砖了?!只好联系卖家寄了回去。后来想想,这东西相对极路由来说,其实并没有本质的提升,作为网关还需要额外的设备(wifi,透明代理受限于内核不能用)。售后也墨迹,两周没给出实质性的回复,索性退货了。
后来又去看了下各种软路由、硬路由的评测,顺便总结了下需求:
- 不占地方,ITX以上的就不考虑了
- 噪音小
- 性能不能太差
- 有一定硬件扩展能力
回过头来看,才发现NUC真的不错:小巧、core i系列处理器、pcie m.2、7mm sata、自带无线网卡……近乎完美,然而,它只有一个网口。虽然也能配置成单臂路由,但是也需要额外的设备(交换机支持VLAN)。最后,只能折中一下,在usb口上插一张胡会长同款有线网卡。
方案
最初本想在BSD上面搭建,但是折腾一段时间后弃疗了,Linux真香!
- 基础系统:ubuntu 18.04 x64 desktop
- 网络设备管理:systemd-networkd
- 防火墙:iptables
- DNS+DHCP:dnsmasq
- AP:hostapd
- 动态域名:ddclient
- web:apache2
- 私有云:nextcloud
- 媒体中心:emby
- 远程下载:transmission-daemon
- 代理:v2ray+shadowsocks-libev
- 透明代理: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等服务协议访问:

使用dnsmasq作为DNS缓存和DHCP服务,将本机的域名写入host来避免内网NAT相关的问题(或者通过NAT loopback解决)。dnsmasq服务开机自启时会因lan-br0未就绪而启动失败,所以考虑在systemd服务配置文件中增加 Restart=on-failure 和 RestartSec=3 ,用于在失败后自动重启,后面的ss和v2ray同理。
最后在ddclient中配置好动态域名,在光猫上做好转发,基础网络配置就差不多了。
AP
这台NUC集成了intel的8260ac无线网卡,本以为能用来作为5g 802.11ac热点,然而试了下发现不行(折腾了下国家代码啥的,似乎也没什么用):

翻了下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配置如下:

nextcloud & emby & transmission
nextcloud跟icloud很像,除了网盘功能,还带照片自动上传、联系人备份功能。按照官方文档配就行,数据目录设置为sata盘的时候需要注意权限的管理。
emby对我来说貌似没太大的需要,用官方docker镜像就行了。
transmission用apt get官方仓库的transmission-daemon。

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


科学上网
本打算折腾透明代理,但做的时候发现维护起来并不算舒服(也有可能没找到正确的姿势),这里就仅仅在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 收工
虽然踩坑很多,但写起来似乎也就这样了,有需要再补充吧。

文章作者 ya0db9
上次更新 2019-03-25