从零开始打造一台全能软路由:Docker + 无线发射 + 双网口

从零开始打造一台全能软路由:Docker + 无线发射 + 双网口

GT610 Lv3

折腾有风险,搞机需谨慎。

想看配置过程可以直接跳转到“系统安装与基础配置”小节。

📌 背景

原本宿舍里的路由器是一台运行 ImmortalWrt 的小米 AX3000T,我白天上课时会远程连接宿舍电脑,晚上在宿舍用电脑做软件开发或者打游戏。

然而,随着负载越来越高,这台 AX3000T 已经明显撑不住了:时不时死机、断网、甚至无法连接终端,只能重启路由器解决。最要命的是打游戏时候断网,还好都是和朋友组队,不然我得被祖安多少次了。

但是上哪儿找比 AX3000T 性能还好的路由器呢?有,但为什么不直接上软路由呢?x86 不仅拥有强大的性能,也拥有吓人的功耗和极高的自由度,不仅仅做软路由,还能顺便放一些工作任务。

既然上软路由了,那么就一步到位,我们要让这台软路由能够满足以下需求:

  • ✅ 提供稳定高效的有线+无线网络服务
  • ✅ 支持运行 Docker 容器
  • ✅ WAN/LAN 网络隔离
  • ✅ 在意外断网时自动重启路由器
  • ✅ 功耗合理、长期稳定运行

等一下,为什么要无线网络服务?

学校虽然提供了统一的免费无线网络,但是限制每次最多接入 3 个设备。我询问学校的网络负责人,他们建议我们使用无线路由器。我手上的设备很多,同时我也需要局域网的文件互传,所以我的软路由也必须提供无线网络才能给我的手机平板上网。

本文将记录我的整个搭建过程,包括遇到的问题及解决方法,希望对同样想玩软路由的朋友有所帮助。

🛠️ 硬件清单

首先说明的是:这绝对不是最好的软路由硬件选择,想抄作业的需要注意一下。接下来解释我为什么这样配。

组件 型号/规格
主机 NEC8(联想 M720Q 日本版)
CPU Intel i3-8100(65W TDP)
内存 16GB DDR4 SODIMM
存储 西数 SN530 512GB NVMe SSD
网卡 板载 Intel 千兆网卡 + PCIe 双口 Intel 82576NS 网卡
无线网卡 联发科 MT7921(支持 Wi-Fi 6E)
电源 100W 联想 Type-C 适配器 + 转接头
系统 ImmortalWrt

为什么这样配?

我原本考虑使用 J / N 系列多网口主板作为主机,但是这个时候,一位朋友要出一些硬件:

  • i3-8100
  • 16GB DDR4 SODIMM
  • 西数 SN530 512GB NVMe SSD
  • 联发科 MT7921 无线网卡
  • 100W 联想 Type-C 适配器

打包 320 元,比全部单买要便宜很多。于是我直接买了,顺便请他打了两把舞萌(唉舞萌痴)

主机

i3-8100 只能配桌面级主板了,板载多网口的 H310 很少也很贵,H110 能刷 BIOS 上八代,但是价格也很高。ATX / mATX 的主板可以通过 PCIe 扩展网卡,但是尺寸太大,而且我已经购买了 DC 适配器,再加一个 DC 转 ATX 的模块又多此一举。

最后我选择了联想 M720Q:B360 芯片组直接上八代,联想方口直供电(当然我还得需要一个方口转 Type-C 转接头),有一个 PCIe 插槽(需要转接卡),还预留了无线接口,体积比 ITX 小,简直完美!

于是在闲鱼以 236 元拿下 M720Q 的日本版:NEC 8代小主机(NEC8)。别问我为什么选 NEC8,便宜 20 块,还是白色的,好看。

准系统交易记录
准系统交易记录

NEC8 和 M720Q 就是一个型号的两个马甲,只是换了个外壳,毕竟 NEC 的个人电脑业务早就被联想收购了。

有线网卡

我在宿舍只有笔记本电脑需要接有线网,主板自带一个千兆网口,按理来说我只需要再加一个网口就够,不过我还是选择了一个双网口的 Intel 82576NS 千兆网卡,闲鱼 44 元,便宜且尺寸合适。

选购 PCIe 扩展设备的时候需要注意,长度不能超过 16 cm宽度不能超过 8cm高度不能超过 2 cm。选择带散热片或者带风扇的设备最好确认高度,否则可能会超高。

网卡交易记录
网卡交易记录

我们还需要一个 M720Q 的 PCIe 转接卡,这是因为联想小主机的 PCIe 插槽不是标准型的。闲鱼蹲了好久蹲到一个 30 元包邮的,二话不说拿下。

PCIe 转接卡交易记录
PCIe 转接卡交易记录

前面说过,由于我购买的是 Type-C 接口的电源,我还需要额外购买一个 Type-C 转方口的转接头。拼多多 7 块拿下。

转接头交易记录
转接头交易记录

一共 636.92 元。钱包在滴血……

🔧 系统安装与基础配置

1. 安装系统

路由器系统有很多,提供 x86 固件的有 OpenWrt、ImmortalWrt、LEDE 等。

我应该选择什么系统?

  • OpenWrt (Open Wireless Router)诞生于 2004 年,是一个基于 Linux 的嵌入式开源发行版,最初为 Linksys WRT54G 路由器开发,也是公认的最正统的开源路由器系统。

  • ImmortalWrt 是基于 OpenWRT 和 LEDE 分叉而来的开源发行版,针对国内特殊的网络环境进行了调整和增强,我个人认为是这三个里面最好用的。

  • LEDE(Linux Embedded Development Environment)项目于 2016 年由部分 OpenWrt 开发者分叉创建,旨在解决当时 OpenWrt 项目管理和开发过程中的一些问题,如更新滞后、代码质量下降等。LEDE 强调透明的开发流程和高质量的代码。2018 年,LEDE 与 OpenWRT 项目重新合并,但 LEDE 的理念和改进被保留并融入了 OpenWRT。

我个人更倾向于使用 ImmortalWrt,它在 OpenWrt 的基础上补足了很多缺失功能,例如全锥 NAT 开关、上网工具等,而且也可以和 OpenWrt 直接互刷。

Lean’s LEDE 不完全开源,部分插件是专有的。

OpenWrt 固件选择页面
OpenWrt 固件选择页面

ImmortalWrt 固件选择页面
ImmortalWrt 固件选择页面

squashfsext4,我该选哪个?

在固件选择页面中,我们可以看到 squashfsext4 两种格式的固件。下面介绍这两种格式的区别。

squashfs 是一种高度压缩且只读的文件系统,一般是给资源有限的设备使用,可以减少设备的读写开销,也可以在第三方软件故障时启动备用模式确保正常运行。但是由于只读特性,所有的更改都是在上层挂载 overlay 完成的,一些 Docker 镜像运行时需要额外配置。

ext4 就是 Linux 上常见的文件系统,可读可写,占用空间会略大。

我自己选择的是 squashfs,毕竟路由器是重要的网络设备,安全第一。

下载镜像

建议仅从官方渠道下载镜像。

OpenWrt 官方固件选择器:https://downloads.openwrt.org/

ImmortalWrt 官方固件选择器:https://firmware-selector.immortalwrt.org/

然后选择 Generic x86/64(64 位)或者 Generic x86(32 位)。如果你的设备支持 64 位系统,请选择 64 位。

如果你的设备为 UEFI 启动,则下载 COMBINED-EFI;如果你的设备为传统 BIOS 启动,则下载 COMBINED

后面的括号为文件系统格式,请根据需要自行选择。对于 ImmortalWrt,请下载后缀为 .IMG.GZ 的文件。

下载完成后请检查文件 SHA-256 值,确保完整性。路由器刷机不能有任何闪失。

写入镜像

对于 x86 设备,我们直接将镜像写入空硬盘即可。我选择的是 ImmortalWrt Generic x86/64 COMBINED-EFI 镜像。

在 Linux 环境下使用 dd 命令写入镜像。

  1. 准备一个 Linux 启动盘。任何 Linux 发行版(Ubuntu、Debian、Arch Linux、Fedora 等)都可以。

  2. 将下载的 img.gz 压缩包移动到 U 盘(或其他外置存储)中。

  3. 在 BIOS 中关闭安全启动,然后通过启动盘启动到 Linux 系统。

  4. 插入带有 img.gz 压缩包的存储设备。

  5. 打开终端,输入 lsblk 查看目标磁盘。比如你要安装到的磁盘是 /dev/sda,那么目标磁盘为 /dev/sda。对于 NVMe 设备,目标磁盘应该是 /dev/nvme0n* 这样的形式。

  6. 输入以下命令:

    1
    2
    3
    cd 压缩包所在目录
    gzip -d 压缩包文件名.img.gz
    dd if=解压出来的文件名.img of=目标磁盘 bs=1M

命令执行结果
命令执行结果

  1. 关机,移除启动盘,然后开机。

2. 系统初始配置

重启过后,软路由接入显示器就可以访问终端。

视频输出的终端界面
视频输出的终端界面

设置 root 密码

root 密码是登录网页管理界面的唯一凭据,请妥善设置和保管 root 密码。

在终端中输入 passwd,然后输入两次新密码。

🌐 网络配置

以下为我自己的配置参考,实际情况根据你的设备而定。

1. 接口划分

软路由接入网线并启动之后,通过 ip a可以查看到接口 eth 信息以及对应的 IP 地址。

通过 ethtool -i 接口编号 可以查询接口对应的网卡,网卡编号在 bus-info 中,然后我们使用 lspci | grep 网卡编号 就可以确定该接口对应的是哪一块网卡了。

我的设备的查询结果如下:

接口 类型 功能
eth0 PCIe 网卡 LAN 口(桥接 br-lan)
eth1 PCIe 网卡 LAN 口(桥接 br-lan)
eth2 板载网卡 WAN 口(DHCP 获取上游 IP)

但是 OpenWrt 默认的路由配置中,eth0 被作为 WAN 接口,其他两个接口没有启用,这导致我插上网线后,什么事情也没有发生。为了能够正常使用,我需要将 WAN 口手动调整eth2 上。

修改 /etc/config/network 文件:

1
vi /etc/config/network

编辑以下三个部分,将 eth2 添加到 wan 接口中,同时预先分配一个 LAN 接口以便调试:

1
2
3
config interface 'wan'
option device 'eth2'
option proto 'dhcp'
1
2
3
4
5
6
config interface 'lan'
option device 'br-lan'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6assign '60'
1
2
3
4
5
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'
list ports 'eth1'

然后键入 :wq 保存并退出。然后执行 /etc/init.d/network restart 重启网络组件。

之后就能看到,WAN 接口和接入网线的 LAN 接口都亮灯,此时应该可以正常访问网页管理界面。

确认可以访问之后,登录到网页管理界面。

2. br-lan 网桥

在“网络”-“接口”中应该能看到系统默认创建的网桥 br-lan

如果上网有问题,需要检查 br-lan 是否配置正确。它应该是这样的:

参数
协议 静态地址
设备 br-lan
开机自动运行
IPv4 地址 192.168.1.1(如果上游网段也为 192.168.1.0/24,则此项应该设置为其他不冲突的值,比如 192.168.2.1
IPv4 网关 留空不填时,默认为 WAN 获取到的地址
IPv4 子网掩码 255.255.255.0

3. 设置 WAN 接口

如果你的路由器上游支持 DHCP,则添加一个“DHCP 客户端”接口,名称为 wan,设备指定到你想作为 WAN 口的接口即可。

如果你需要 IPv6,你可以再添加一个“DHCPv6 客户端”接口,名称为 wan6,设备指定到wan 同一个接口

添加 WAN 接口
添加 WAN 接口

为 WAN 接口添加 IPv6
为 WAN 接口添加 IPv6

4. 设置 LAN 接口

进入“网络”-“设备”,选择 br-lan,在“网桥”端口中勾选你想作为 LAN 口的接口切记不要勾选 WAN 端口

添加 LAN 接口
添加 LAN 接口

5. 应用

点击“保存并应用”之后,将网线接入 WAN 口,将需要的设备接入 LAN 口,然后通过 br-lan 上的 IPv4 地址(默认是 192.168.1.1)访问你的路由器。

📡 无线 AP 配置

转到“网络”-“无线”菜单,可以看到无线网卡 radio0。如果你的无线网卡是 2.4/5GHz 双频的,那么可以看到两个设备 radio0radio1

MT7921 就是双频 WiFi-6E 网卡,但是不支持同时开启 2.4GHz 和 5GHz

可以看到我只开了 2.4GHz
可以看到我只开了 2.4GHz

对于部分型号网卡,需要安装驱动才能正常工作。以下为 MT7921 / MT7922 / RZ616 安装驱动的方法:

  1. 跳转到“软件包”章节(在下面),配置好镜像源。

  2. 安装以下软件包:

    • kmod-mt7921e
    • kmod-mt792x-common
    • kmod-mt7921-common

    MT7921 需要额外安装以下软件包:

    • kmod-mt7921-firmware
    • mt7921bt-firmware

    MT7922 / RZ616 需要额外安装以下软件包:

    • kmod-mt7922-firmware
    • mt7922bt-firmware
  3. 安装以下软件包以启用 Wi-Fi 6:

    • hostapd-common
    • hostapd
    • wpa-supplicant
  4. 安装完成后重启系统。

接下来创建一个无线网络。点击你想使用的 radio 设备右侧的“添加”按钮,在“设备配置”-“工作频率”中,根据情况选择“模式”和“带宽”,“信道”选择 auto,通道宽度不动或者选择最大的。

以下为“模式”与 Wi-Fi 标准的对照表:

模式 Wi-Fi 标准
Legacy 原始 Wi-Fi 标准,没必要用
N Wi-Fi 4
AC Wi-Fi 5
AX Wi-Fi 6 / 6e
BE Wi-Fi 7

国家代码选择 CN - China,其他保持不动。

网络资料指出,改为其他国家的代码也可以正常使用,并可能会通过增大功率来提升信号强度,达到更高的无线网络质量效果。如果你了解相关内容,可以自行调整,如果你不了解,请勿随意修改

在“接口配置”-“常规设置”中,“模式”选择“接入点 AP”,ESSID 为无线网的名称,根据需要自己设置。“网络”选择 lan,其余不动。

如果需要设置密码,在“接口配置”-“无线安全”中,加密算法选择 WPA2-PSK,“密钥”一栏填写你要设置的密码。

最后点击最下方的“保存”。

参考配置
参考配置

如果保存后没有启用,点击无线网络右边的“启用”按钮。如果还是没有启用,或启用后无线网无法连接、无法上网,请检查配置是否正确。

📦 软件包

软件包管理是 OpenWrt 的一大特色,也是几乎所有 Linux 发行版都支持的一个功能。

更换镜像源

更换国内镜像源可以更快地下载软件包。

OpenWrt 镜像源更换教程

ImmortalWrt 镜像源更换教程

切换镜像源后,命令执行 opkg-update 或者在网页的“系统”-“软件包”中点击“更新列表”按钮。

🐳 Docker

在网页管理界面中切换到“系统”-“软件包”,点击“更新列表”,等待完成后在“过滤器”中搜索 docker

然后安装 dockerdocker-compose 包。我推荐将以下包都安装,这样可以在网页端轻松配置容器。

推荐安装的软件包
推荐安装的软件包

然后执行以下命令让 Dockers 开机启动:

1
2
/etc/init.d/dockerd start # 立即启动
/etc/init.d/dockerd enable # 开机自启动

然后就可以使用了。

如果你安装了推荐包,刷新网页后你可以看到“Docker”选项,这里可以直观地管理容器。

⚙️ 网络中断时自动重启

为了避免因校园网不稳定导致的服务中断,我编写了一个简单的 shell 脚本用于检测网络状态并在断网后自动重启路由器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/sh

TARGET_IP="8.8.8.8"
MAX_FAILURES=3
LOG_TAG="InternetCheck"

failure_count=0

for i in $(seq 1 $MAX_FAILURES); do
ping -c 1 -W 2 $TARGET_IP > /dev/null 2>&1
if [ $? -ne 0 ]; then
failure_count=$((failure_count + 1))
else
failure_count=0
break
fi
sleep 1
done

if [ $failure_count -ge $MAX_FAILURES ]; then
logger -t $LOG_TAG "检测到 Internet 连接中断,正在重启路由器..."
reboot
else
logger -t $LOG_TAG "网络状态正常"
fi

校园网每日 0:00-6:00 断网,所以只让其在 6:00-23:59 内检查即可,然后 0:00 准时关机。

至于定时开机,其实可以通过定时插座+来电自启实现,但是我自己没做。

在“系统”-“计划任务”中写入下列内容,然后保存:

1
2
* 6-23 * * * /bin/sh /root/check_internet.sh
0 0 * * * /sbin/poweroff

💡 功耗与稳定性分析

连续运行 5 天后的系统负载情况
连续运行 5 天后的系统负载情况

我还没找到在系统内查看 CPU 实际功耗的方法,我也没有购买功率测量插座。但是从目前的运行情况来看,CPU负载大概在 20% 左右,频率高峰期满载,低谷期 1.0GHz 左右,自己估算每天的平均功耗应该在 25-35W 左右。

相比旧路由器(满载 6W),虽然略高,但换来的是更稳定的运行环境、更低的温度、更强的功能扩展性,是非常值得的投资。

反正电费都是宿舍所有人平摊,学校每个学期还送用不完的电,这不用白不用么?

📝 写在最后

实际部署情况。对,它就这么大
实际部署情况。对,它就这么大

系统概况。已经稳定运行了两个月
系统概况。已经稳定运行了两个月

这是我第一次写那么长的文章,写得很详细,一方面是能尽量保留搭建软路由的全部细节,另一方面是想把过程和结果分享给更多人,希望对同样想搭建 x86 软路由的你,有所帮助。

我在查找资料的时候发现,国内关于 x86 软路由的资料比较分散,已有的教程写得也有待完善。软路由并不是什么门槛很高的东西,当你真正上手去做,以及做成的那一刻,你会感觉到你所有的付出都是值得的。

如果对你有帮助的话,欢迎分享给更多人。如果有什么需要补充或者修正的地方,欢迎在评论区留言,感谢大家。

🤔 真的是“写在最后”吗……?

这一台软路由因为一些原因移动到了工作室,作为工作室的主路由使用。这样的话,宿舍就需要第二台软路由了。这次没有了任何约束,我打算从硬件选择开始,搭建第二台 x86 软路由。

下一台软路由,敬请期待……
下一台软路由,敬请期待……

  • 标题: 从零开始打造一台全能软路由:Docker + 无线发射 + 双网口
  • 作者: GT610
  • 创建于 : 2025-07-12 17:40:18
  • 更新于 : 2025-09-23 15:09:18
  • 链接: https://gt-610.dpdns.org/2025/07/12/build-a-x86-router-from-scratch/
  • 版权声明: 本文章采用 CC BY 4.0 进行许可。
评论