
【All in Boom】第 1 期:基础网络搭建
目录:
0x00 总体介绍
在上一篇文章中我们讨论过。本次的网络拓扑架构为虚拟的 OpenWRT 为软路由,而 TP-Link 路由器作为 AP 使用。因此,需要部署一个 OpenWRT 的虚拟机,并通过某种方式(网桥或 PCI-e 直通)将其与外界的交换机连接,而交换机与 AP 连接,最终完成。
软路由通常的部署方法不外乎几种:
- 主路由,需要一个入户
WAN 口
和一个LAN 口
,一进一出。 - 旁路由,用户自行指定网关及 DNS 服务器位置,需要在设备上进行手动配置, PASS
- 单臂路由, 主路由的一个变种,一条网线承担 WAN 口和 LAN 口,配置稍微复杂,此为最终解决方案,理由将会在下面进行详细分析。
0x01 软硬件准备
0x01.1 硬件
- Intel X520,较老的 10G 双 SFP 口网卡
- 兮克交换机,2 个 SFP 10G 网口 + 5 个 2.5G 电口
- TP 路由器,一个 2.5G SFP 网口 + 4 个 1G 电口
- NOKIA G-010S-A GPON ONT SFP 2.5G 模块
- 两个 10G 光模块
- 一个 2.5G 电模块
0x01.2 宿主系统
最开始其实选择的是 ESXi 7.0
系统,认为企业级别的系统要优于开源的 Proxmox Virtual Environment
系统,且 VMWare 的优秀技术使其性能损失较小。然而,ESXi 严格的兼容性要求(Intel x520 就不受 ESXi 8.0 支持和大量的 NVMe 硬盘驱动在某次“更新”后就被移除了)导致需要在这个系统上进行一定魔改工作。此外,ESXi
面向完整健全的服务器,因此在处理我这种忒修斯之船的时候较为无力,比如在之后部署的显卡直通会频繁出现问题,重启后必须重新设置才给虚拟机使用。
这时候之前的 PVE
系统就成为了下一个选择方案,整体硬件兼容性优秀,且相对于 ESXi
来说,增加了虚拟机(VM
)和虚拟容器(LXC
)两种符合不同需要的虚拟机类型。 VM
为更底层级别的虚拟机,可以承担需要不同内核、资源独享和硬件直通的任务;而 LXC
作为操作系统级别的虚拟容器,提供了更低的资源消耗和更高的运行效率,使其可作为 Linux 虚拟机的可靠替代方案。更重要的一点是,优秀的硬件兼容性使其几乎不用魔改其他的内容就可以使用,因此使用 PVE
作为宿主系统。
宿主机的安装教程可以参考官网,成功部署之后就可以使用网线访问了。
0x01.3 宿主系统中 NVMe / 存储直通配置
显卡和网卡作为 PCI-e
设备,可以很方便的进行直通,而对于存储,PVE 则是通过构建存储池来实现。虽然其便于维护、隔离和管理,但是在接下来的 NAS 系统部署中,就存在相当大的不变,因此,如何将硬盘直通给 VM
是一个很重要的问题。通过查询资料和 GPT,以下步骤亲测可将傲腾和 SATA 机械
直通给指定 VM
:
- 启用
IOMMU
支持,在BIOS
启用 Intel 相关支持后,修改/etc/default/grub
中的内容,添加字段GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
。更新grub
后重启 - 使用
lsblk
命令确定需要直通的硬盘或者lspci
找到指定的 PCI-e 设备 - 修改
/etc/pve/qemu-server/<vmid>.conf
下的配置文件,加入hostpci0: 0000:01:00
以直通 PCI-E 设备(如傲腾) - 对于直通单块硬盘,而不是整个 SATA 控制器。应该首先
ls -l /dev/disk/by-id/
找到单块硬盘所在的物理信息 - 使用命令
qm set <vm_id> –<disk_type>[n] /dev/disk/by-id/<type>-$brand-$model_$serial_number
直通指定硬盘到虚拟机
0x01.4 OpenWRT 系统选择
OpenWRT
作为一个开源的路由器固件,部署较为灵活,可以有效应用在科学上网、校园网破解、多拨等灰色场景。此外,由于其高可定制性,可以安装多种插件以适用不同场景。
考虑需要使用科学上网的功能,因此选择具有一定争议但是还算好用的 (2025.03.21 更新:出于支持库不够多,且不需要采用闭源代码针对特有设备进行优化,换用了更加主流的 Lean's LEDE
分支ImmortalWrt
)进行编译。按照教程进行编译后会获得一个 qcow2
文件。下一步需要转换为 PVE
所识别的 qcow2
格式以导入至虚拟机中。首先将 qcow2
上传至服务器以备导入。
经过分析需求,构建一个 VM
,使用 UEFI
模式启动,并分配 1S1C
的 CPU, 2G
内存给 VM。同时创建一个虚拟 EFI Disk
用来存储 UEFI
系统。在设置中,设置为开机自启,顺序为 1
(注意:这个顺序越小,开机时越优先,关机越晚)。进行首次启动的时候需要进入 UEFI BIOS 关闭安全启动,完成设置后即可开始将 qcow2
文件导入至 VM
内。导入命令如下:
qm importdisk <vmid> <qcow2name>.qcow2 local-lvm --format qcow2
重启,即可完成 OpenWRT
部署。
0x02 单臂路由部署
在虚拟机开机后,即可着手设置单臂路由设置。第一步为登入交换机后台,对相关端口进行设置;随后在 OpenWRT进行设置,在这里已经假设猫棒已经正确配置并已可正常拨号。
0x02.1 交换机端设置
首先设置几个 VLAN
以作区分,在这里,设置 VLAN 10
为 WAN
口而将 VLAN 20
设置为 LAN
口。将猫棒所在网口设置为 ACCESS
状态的 VLAN 10
。而将 PVE
所在的网口设置为 TRUNK
模式的 Native
VLAN 20
, 并允许 VLAN 10
和 VLAN 20
。将其余网口设置为 ACCESS
状态的 VLAN 20
。
关于这段的解释,可以参考 ChatGPT
的解释,我认为说的已经足够明确了:
这段话描述了如何配置交换机端口的
VLAN(虚拟局域网)
设置,目的是区分不同的网络流量,如WAN(广域网)
和LAN(局域网)
。具体来说,配置的步骤和含义如下:
设置
VLAN
:
VLAN
是通过虚拟划分的网络,每个VLAN
可以看作是一个独立的子网。这里设置了两个VLAN
:
VLAN 10
用于WAN
口,也就是广域网接口。VLAN 20
用于LAN
口,即局域网接口。配置猫棒所在网口为
ACCESS
状态的VLAN 10
:
ACCESS
模式表示该端口仅属于一个VLAN
,不能同时承载多个VLAN
的流量。这里的 “猫棒” 指的是连接到宽带或互联网的设备(如调制解调器)。- 将猫棒所在的网口设置为
ACCESS
模式,并将其分配给VLAN 10
,表示这个网口用于连接WAN
网络,并且只会传递VLAN 10
的流量。配置
PVE
所在的网口为TRUNK
模式的Native
VLAN 20
,并允许VLAN 10
和VLAN 20
:
TRUNK
模式允许通过该端口传输多个VLAN
的流量。- 在
PVE
(通常是一个虚拟化平台)的网口设置为TRUNK
模式后,该端口会处理多个VLAN
的数据流。通过设置Native
VLAN 20
,表示默认情况下该端口上未标记VLAN
的流量会被认为是VLAN 20
的流量。此设置同时允许VLAN 10
和VLAN 20
的流量通过该端口。- 这样,
PVE
既能够接收VLAN 10
的WAN
流量,也能够接收VLAN 20
的LAN
流量。配置其余网口为
ACCESS
状态的VLAN 20
:
- 对于其他的网口,这些端口将被设置为
ACCESS
模式,且分配给VLAN 20
,表示这些端口用于LAN
网络,只会传递VLAN 20
的流量。总结:
这段话的核心目的是通过配置不同的端口模式(
ACCESS
和TRUNK
)和VLAN
(VLAN 10
和VLAN 20
),将不同的网络流量隔离开来。WAN
流量通过VLAN 10
传输,LAN
流量通过VLAN 20
传输,同时通过TRUNK
模式将VLAN 10
和VLAN 20
的流量都带入到PVE
的网口。
0x02.2 OpenWRT 端设置及 IPv6 设置
进入 OpenWRT 后台,并进行相关配置,首先删除所有的WAN 口设置,并在设备配置界面设置两个新的 VLAN (802.1q)
设备,都基于接入物理接口,设置 VLAN 10
和 VLAN 20
。
将 VLAN 20
设置后的 ethx.20
加入至原有的 br-lan
设备内。对于拨号的 ethx.10
,则在接口界面进行正常 wan 口
设置。测试拨号后可以部署 IPv6
。
对于较为成熟的移动宽带,可以直接暴力将 lan
网络下的所有 IPv6 模式
设置为混合
,而在 wan口
将所有设置为中继
。即可在所有设备上获得本地 IPv6
和网络 IPv6
地址。
0x03 OpenWRT 选装插件及配置
为了保证部署 OpenWRT 之后所带来的便利(要不然我这么折腾干什么?),需要在 OpenWRT 上完成一些应用的部署及配置。总体上来说,除了科学上网以外(关于这个内容,还请自行寻找教程),需求不外乎几点:
- 广告及追踪拦截
- 其他应用部署
- 外网访问本地资源
- 加速器、音乐变灰解决以及 KMS 等其他需要部署在路由器上的应用
对于最后一个需求,在步骤 0x01.4 中的 make menuconfig
即可提前选择对应的包进行定制编译,并提供了相当成熟的用户界面以帮助完成这一工作。而对于剩下的主要需求,则在下文进行讨论。
0x03.1 DNS 及广告拦截
考虑到 DNS 的需求为提供内网域名访问、广告拦截和多重 DNS 选优。因此采用链式传递 DNS 请求的方式。
首先截断运营商 DNS(可能有 DNS 广告污染的问题),随后采用 SmartDNS
转发至多个上游 DNS 服务器查询地址,转交至 Ad Guard Home
实现广告拦截。最后,需要在 Dnsmasq
中指定内网域名及地址。额外的,由于科学上网的需要,SmartDNS
也需要开启第二服务器以备 DNS 查询。具体步骤如下:
- 在
SmartDNS
内部署多个上游服务器,如Quad 9
、Cloudflare
等,同时不设置为Dnsmasq
的上游服务器,指定好本地端口后即可启用服务。第二服务器也如此设置,并将端口指定为科学上网所需要的 DNS 端口。注意的是,直到在Dnsmasq
设置完成之前,一切都不受影响 Ad Guard Home
内的设置 DNS 屏蔽名单及规则后,设置 SmartDNS 的端口为上游查询服务器,同时设置几个 bootstrap 服务器以防止无法获取 DNS- 在
Dnsmasq
的常规设置中,对地址采用格式/<domain>/<IP>
的方式进行内网分配,同时,记得在静态地址分配固定 IP - 在转发中,指定
Ad Guard Home
所监听的端口,随后在网络接口设置中,将lan 口
的自定义 DNS 服务器设置为127.0.0.1
这里留一个小坑,如何给内网设置反向代理和公网证书将会在一个单独文章内讲。
0x03.2 ZeroTier 部署
First things first,你需要有一个 ZeroTier
账号,并且在编译固件的时候已经编译了相关包。由于采用官方服务器就足够使用(10 个设备,1M/s 左右的下载速度),因此不需要使用 Planet
和 Moon
的自行搭建方案实现。
在获取到 网络 ID 后就将其输入至 OpenWRT
的后台,并允许配置 NAT 客户端以访问内网。而对于接口部分则让 ZeroTier
自行配置即可。然而,通过域名访问内网是下一步实现 内网 SSO 的必要前置,因此需要在 ZeroTier
页面进行额外配置。具体步骤如下:
- 通过
IPv4 Auto-Assign
确定ZeroTier
网段,并将路由器的ZeroTier IP
进行固定分配 - 在
DNS
开启Search Domain
,填写自己的根域名,并将其分配至路由器ZeroTier IP
- 在
Routes
中加入路由,将自己使用的本地网段通过路由器ZeroTier IP
ZeroTier
本地也需要进行相关设置,允许 DNS Configuration,这样就可以在外网通过域名访问内网。