家庭服务器搭建(一)-环境网络篇
2022-11-8
| 2022-12-6
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
Dec 6, 2022 08:30 AM

0. 前言

本文是《家庭服务器搭建》系列文章的第一篇——环境网络篇。
家庭服务器是利用家里的小型服务器搭建网络服务,提高内网网络质量,替代公共网络服务的一体化解决方案。Self-Hosted 是一个庞大的范畴,有大量的社区和资源可以探索研究,本系列文章会介绍网络存储设施 NAS,网盘,网络相册,影音娱乐,下载器等各种实用的个人自建网络服务。

1. 物理网络部分

路由器网关设置为:192.168.84.1
服务器的网卡:
  • 2.5G NIC1 84-47-09-04-F1-AE 这个连接着路由器的电口 2.5G
  • 2.5G NIC2 84-47-09-04-F1-AF
  • Wifi E0-D4-64-81-54-FC
路由器 dhcp 地址池从 192.168.84.100 开始分配,192.168.84.1-99 用于手工指定固定的设备,避免 ip 占用:
  • 192.168.84.1 - 分配给路由器
  • 192.168.84.10 - 分配给 OpenWRT,作为旁路网关
域名配置方案参见后文
主路由器的 DHCP IP 地址池分配方案
主路由器的 DHCP IP 地址池分配方案
网关默认即可,但是如果想使用旁路网关接管所有局域网设备的网络,则需要使用互指的配置方式实现,详见 4.4 节。
IP 地址与 MAC 地址绑定
IP 地址与 MAC 地址绑定

2. Host 系统部分

说一下我的硬件设备,Minisforum TL50,一台2020 年的 Mini PC。
notion image
notion image
选择这台机器的原因是体积小/性能强。15cm*15cm*5cm 的体积即可以放在电视柜上也可以挂在电视后或者墙面上,都不占位置。在这样的体积上还搭载了一枚 11th Gen Intel Core i5-1135G7 CPU 处理器,达到 4 核 8 线程 2.4Ghz 的基础频率,这枚芯片的集成显卡能力对家庭多媒体服务而言也绰绰有余。另外就是功率,家庭服务器是 7*24 小时开机,从我的长时间使用的情况来看,服务器的运行功率在 16w 左右,平均每天不到 0.4 度电。
操作系统方面选择的是 Windows 10 专业工作站版,Windows 在磁盘休眠管理方面做得还是很好的,没有选择服务器版本是因为服务器版很难用,不符合正常的使用习惯。特别是当我们想要把 Windows 改造成一台 HTPC 的时候,工作站版平衡了长期运行的稳定性和普通用户使用的便捷性。
格式化分区:
  • C - 500G SSD (系统盘)
  • D - 4T HDD (多媒体盘)
  • E - 2T HDD (资料数据盘)
Windows 系统安装在 C 盘,所有软件都安装在 C 盘。D、E 盘用于存放资料文件,这样可以充分利用 Windows 的磁盘休眠策略延长磁盘使用寿命。
使用本地用户初始化系统,用户名在多系统中保持全局一致,例如:kchen,设置本地计算机名称 Server-CK,开启远程桌面。此时可以重启 Server-CK,同时脱离显示器和键鼠等外设直连,使用微软提供的远程桌面客户端可以轻松地在其他设备上完成后续工作:
  • Windows:系统自带
notion image
notion image
如果系统时区不太对,可以在 powershell 中调整时区。
开启共享文件夹和共享卷,需要共享这三个目录:
  • 下载
  • D:\
  • E:\
在主机环境没有全部配置好之前,可以方便通过本地机器下载文件传输过去:
  • Windows:系统自带资源管理器 - 网络
  • macOS:系统自带的 Finder 或第三方 QSpace
  • iOS:系统自带的 Files 或 第三方Documents
配置电源管理计划:使用节能,但是禁止掉自动休眠
notion image
📌
驱动问题:Minisforum 提供了 TL50 的完整驱动工具包 https://www.minisforum.com/support/36 但是漏了一个声卡的驱动,需要自行安装:
Tiger Lake-LP Smart Sound Technology Audio Controller

3. HyperV - Ubuntu 部分

3.1 Hyper-V 设置

宿主机下载好 Ubuntu-Server 的最新安装镜像文件 https://ubuntu.com/download/server
  • 启用 HyperV
  • 虚拟交换机创建桥接网络,使用宿主机的网卡进行桥接
  • 创建虚拟机,推荐的配置分配:
    • 1024MB内存,开启动态内存[256MB,2048MB]
    • 4CPU
    • 虚拟硬盘:120GB
    • 使用上面配置的桥接网络作为网卡
安装 Ubuntu 的部分略去不说,建议用户名和宿主机保持一致。

3.2 Ubuntu 配置

接下来的部分是 ubuntu 的设置
去掉 sudo 密码
code
sudo vim /etc/sudoer
行尾追加:
 
(可选)安装 k-zsh k-vim-server k-tmux 三步曲,确认服务器上有好用的 zsh/vim/tmux 环境
 
需要安装挂载工具 sudo apt-get install cifs-utils
挂载 windows 创建的共享文件夹
参考资料:
⚠️
注意,操作挂载目录的用户权限为 root,不管是 ubuntu 还是 docker 部署的项目需要修改挂载目录下的文件都需要使用 root 用户身份。

4. 透明代理(弃用)

旧的方案中使用 Ubuntu 配置 Clash、SS,修改 iptables 和使用 TProxy 等方式来实现透明代理和翻墙回家,这对 Ubuntu 的网络影响比较大,因此4. 配置 OpenWRT 旁路网关实现透明代理 新方案中单独划拨了256M 内存做 OpenWRT 解决透明代理和回家的问题,大大降低了网络的复杂程度。

4.1 Clash 处理 TCP 流量

首先,在网关机器上打开 ipv4 转发, echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p
安装 clash
下载最新的 linux amd64 二进制包 https://github.com/Dreamacro/clash/releases/ 拷贝到 /usr/local/bin/clash 执行一次获取到相关的配置文件,配置文件存放地址(~/.config/clash)
下载订阅配置到配置文件存放地址
修改配置文件,在服务器端启用 dns
透明代理的 iptables,直接将 路由表保存到 (~/.config/clash/iptables.sh)
 
添加到系统服务
/etc/systemd/system/clash.service
Clash API WebUI: http://clash.razord.top/

4.2 ss-redir 处理 UDP流量

安装和配置 ss
sudo apt install shadowsocks-libev
创建 ss-redir 的配置文件,存放在 (~/.config/clash/ss-redir.config)
添加到系统服务
/etc/systemd/system/ss-redir.service

4. 配置 OpenWRT 旁路网关实现透明代理

4.1 准备镜像

因为 OpenWRT 没有提供 Hyper-V 直接可用的镜像,因此需要在本地进行一下转换。
首先到 OpenWRT 的官方网站下载 x86-64 位架构的镜像,目前最新版是 https://downloads.openwrt.org/releases/22.03.2/targets/x86/64/ 版,选择 generic-ext4-combined-efi.img.gz 下载即可。得到的 gz 压缩包最好使用 tar 命令进行解压缩,得到一个 img 镜像文件。
这时,我们需要使用另一个免费软件 Starwind V2V https://www.starwindsoftware.com/tmplink/starwindconverter.exe 来进行镜像文件的转换,转换的流程比较简单:
  1. 选择 LocalFile 作为输入镜像
  1. 选择刚刚解压出来的 img 镜像文件
  1. 选择 LocalFile 作为输出镜像
  1. 格式选择适合 Microsoft 使用 VHD/VHDX 文件格式
  1. 类型选择 growable vhdx image 无论什么模式占用体积都在200M以内
转换成功后会在 img 镜像文件目录下生成一个 vhdx 文件,我们把文件拷贝到 Hyper-V 的虚拟硬盘文件夹下:C:\Users\Public\Documents\Hyper-V\Virtual hard disks
至此,我们的镜像文件就准备好了。

4.2 创建 OpenWRT 虚拟机

我们在 Hyper-V 中创建一个新的虚拟机:
  • 名称:OpenWRT
  • 代数:第二代
  • 内存:256 MB就够了
  • 网络:选择之前创建好的虚拟交换机
  • 硬盘:使用现有虚拟硬盘,位置就是 C:\Users\Public\Documents\Hyper-V\Virtual hard disks 下的 vhdx 文件
创建完成之后先不要启动,点击虚拟机的设置页,修改以下几个地方:
  • 安全:关闭「启用安全启动」
  • 检查点:关闭「启用检查点」
  • 自动启动操作:选择「始终自动启动此虚拟机」

4.3 配置 OpenWRT

启动虚拟机,Enter 进入 Console,现在的 OpenWRT 由于默认网络设置原因,并没有和我们的主路由在同一个网段下面,因此需要先配置网络:
现在,OpenWRT 从主路由那儿申请到了一个静态 IP,已经可以正常上网了。用浏览器访问 http://192.168.84.10/ 可以打开 OpenWRT 的网页管理界面(默认情况下root 用户没有密码)。
可以先给网页访问设置一个 root 密码保证安全性:System→Administration→Router Password
然后对 OpenWRT 的网络做一些额外的配置,作为旁路网关使用:
添加LAN接口网关
Network→LAN(edit),静态 IP 地址和网关设置已经通过上面的配置文件设置好了,DNS 填写公共 DNS 如 114 和 Google DNS 即可:
notion image
notion image
关闭 DHCP
Network→LAN(edit)→DHCP Server→General 勾选 Ignore Interface
notion image
修改防火墙设置
Network→Firewall,取消选中启用 SYN-flood 防御,选中 LAN 接口的 IP 动态伪装
notion image
OpenWRT 旁路网关的配置就全部结束了,保存并应用更改即可生效。

4.4 旁路网关的使用

旁路网关有两种使用方式:
指定的设备才使用旁路网关
在指定的设备上,手动设置IP地址,将其「网关」和「首选 DNS」改为旁路网关的 IP 地址 192.168.84.10
所有设备全部使用旁路网关
在主路由器的「DHCP 服务器」设置中指定默认「网关」和「首选 DNS 服务器」为旁路旁路网关的 IP 地址 192.168.84.10
notion image
关于使用旁路网关的性能,可以看少数派的这篇文章做的详细测试,我引用一下文章的结论:
优劣对比
主路由模式
旁路网关模式
局域网流量
不影响性能
不影响性能
广域网下行流量
受限于主路由NAT转发性能
受限于主路由NAT转发性能
广域网上行流量
受限于主路由NAT转发性能
同时受限于主路由和旁路网关NAT转发性能
代理上网转发流量
外加受限于主路由CPU性能
同时受限于主路由和旁路网关NAT转发性能,外加旁路网关CPU性能
结论:
  1. 旁路网关的网卡带宽只要不低于你的上传带宽,就不会对普通流量造成瓶颈。考虑到国内的上行带宽通常非常小,所以基本不会造成影响
  1. 旁路网关作为代理上网的转发网关,性能下限是由其 CPU 性能和网卡带宽中最低的部分决定的
从结论来看,我们使用家庭 Windows 服务器虚拟出来的 OpenWRT 无论对局域网还是广域网的上下行流量都基本没有影响,如果要做代理转发,那就是【客户端代理处理能力】和【旁路网关处理能力】的对比了,从我的使用体验来看,用旁路网关来进行代理转发性能是足够的。

4.5 透明代理

我们架设旁路网关接管设备网络流量的目的主要就是为了通过旁路网关的代理设置,为域内设备实现透明代理上网。
Openclash 是 OpenWRT 上的代理应用,使用了 clash 内核,可以兼容大部分 clash 的功能。OpenWRT 的应用库里面默认并没有 openclash 所以需要到官网先下载 ipa 文件:https://op.supes.top/packages/x86_64/luci-app-openclash_0.45.70-223_all.ipk 上传安装或者直接在网页上 System→Software 填写链接安装:
notion image
安装完成后载入 Clash 配置文件,启动 openclash 服务即可,这里涉及到 Clash 的使用问题,就不再缀述了。
notion image
关于代理节点选择、连接查看、代理策略等控制面板,openclash 提供了 YACD 和 Dashboard 两个 panel 使用。
⚠️
Clash 的运行模式务必使用兼容模式。否则无法将 SS 的端口或者内网使用透明代理的设备通过 NAT 端口映射到公网上。

4.6 局域网域名解析

前文提到我们会为 Host 和 Hyper-V Ubuntu 分配域名 http://win.lan/ http://me.lan/ 这样我们后续在Host 和 Ubuntu 上部署服务的时候可以通过 Nginx 反向代理来实现二级域名访问 Network→DHCP and DNS→General Setting→Addresses 添加:
  • /me.lan/192.168.84.3
  • /win.lan/192.168.84.2
notion image
这样,局域网的设备可以通过域名或二级域名来访问到对应的主机。(局域网设备需配置 192.168.84.10 为 DNS 服务器,或将主路由的 DNS 服务器指向 192.168.84.10)

4.7 外网访问局域网设备

通常情况下,局域网设备都在路由器的 NAT 网络之后,无法直接从外网连接到。常见的内网穿透方法有两种:端口映射和反向代理。
  • 端口映射需要路由器分配到公网的 IP 地址,通过路由器将公网的某个端口映射到内网设备的另一端口,实现内网穿透。
  • 反向代理需要一台具有公网地址的服务器,通过反向代理的服务端和客户端建立隧道连接,实现远程端口转发到内外机器端口。常见的反向代理工具有 frp、ngrok 等。
这两者都直接把内网服务直接暴露在了公网上,增加了内网被攻击的风险,而且内网服务如果有变更,还需要调整对应的映射,比较麻烦。如果能像在家一样访问内网的设备和服务,就可以做到既安全又便捷。其实要实现也不难,因为我出门在外时所有的手机和电脑总是开着网络代理软件的,因此只需要在我和家中的 OpenWRT 间建立起加密通信隧道,即可在外访问家里的局域网,shadowsocks-libev 映入眼帘。
注意:该方案为保证网络质量,要求家中路由器能分配到公网的 IP 地址。
在软件中心安装 luci-app-shadowsocks-libev 应用 System→Software:
notion image
安装完成之后,打开 Service→shadowsocks-libev 应用,开启 ss_server。建议加密方法使用 chacha20-ietf-poly1305
notion image
然后我们在主路由器中开启端口转发,将主路由器的端口映射到 OpenWRT 的 9001 端口,每个品牌的路由器设置端口转发的位置和方法不太一样,下图以 TP Link 路由器为例,将路由器的 18388 端口转发到 OpenWRT 的 9001 端口:
notion image
为了避免路由器的公网 IP 发生变化导致服务不可用,同时启用主路由上的 DDNS 动态域名,使得动态域名永远指向路由器的公网 IP,TP Link 路由内置了 DDNS 服务:
notion image
如果主路由没有内置 DDNS 服务,也可以在 OpenWRT 软件中心内安装 luci-app-ddns 服务。
下面是客户端的设置
我在外需要使用家里服务的设备一般是两个,公司的电脑自己的笔记本都是 macOS,手机 iPhone。使用的客户端分别是 ClashX Pro(开启增强模式) 和 QuantumultX,两者都有很好的规则分流能力,可以把家庭网络服务的流量通过 Shadowsock 代理转发。思路上都是设置一个叫做 【🏠 Home】的策略组,组内包含 Direct 直连和 Home-SS 代理节点,根据是否在家选择不同的连接方式,通过规则处理 IP-CIDR 为 192.168.84.0/24 的网段,以 Clash 的配置为例:
以 QX 的配置为例:
区别在于,QX 默认 192.168.84.0/24 走 Home-SS,当且仅当连接家中的 WiFi 时走直连。而 Clash 需要手工选择 192.168.84.0/24 到底走 Home-SS 还是直连。(当然利用 Mac 上的自动化工具是可以根据 WiFi 切换规则的)
如果内网的服务都绑定了局域网域名,需要在代理工具中添加域名解析才能在外也使用域名访问,以 Clash 的配置为例:
以 QX 的配置为例:

5. 小结

至此,Windows 宿主机和 Ubuntu 虚拟机的基本环境和 OpenWRT 网络配置都全部就续,需要进行一些简单的校验,确认配置无误:
  • 确认内网设备可以正常使用主路由上网
  • 确认内网设备可以通过配置旁路网关正常上网,并且正常代理上网
  • 确认 Windows Host 和 Server Ubuntu 的网络行为和局域网内其他设备表现一致
  • 确认外网设备可以通过代理直接访问内外设备
测试的方法,包含但不限于:
 
 
技术分享
  • How-to
  • Self-Hosted
  • 家庭服务器搭建(二)-多媒体服务篇怪奇工具包:神奇海螺试验场
    目录