速通OpenWrt-24.10软路由实操篇 #
1. 硬件配置 #
1.1 硬件信息 #
我这里的硬件是用的某个小厂itx主板:
- CPU N100
- SO-DIMM DDR4 8G x1
- Intel I226-V 2.5G 网口 x2
- M.2 NVMe x2
- SATA3.0 x1
- 机械硬盘250G
- PCI-E x4 插槽
- Intel I350 T2 双口千兆(加装)
1.2 硬件选购 #
这里为啥2.5G网口不用,还要再插一个PCI-E千兆网卡?因为Intel I226-V会掉速断流,用一会儿变成100m或者10m带宽:
root@ImmortalWrt:~# lspci
关于I225、I226限速断流的问题,网上吐槽的帖子一大堆,这里不多赘述。英特尔发布临时补丁,修复 I225、I226 等网卡的间歇性断网问题
OpenWrt的github上有个老哥提了一个Issue,遇到了跟我类似的问题[24.10.0-rc1] x86/64: LAN interface only negotiating 100Mb/s despite supporting and advertising 1000Mb/s
所以到底是OpenWrt的问题,还是网卡本身的问题还有待商榷?!
小众品牌的主板还是尽量避开。我这块主板,除了Intel网卡作妖,主板本身还有不少问题:
-
说是PCIe通道不足,把雷电接口强引去做USB 3.0。在Windows系统下有个硬件弹感叹号,驱动不了。这是软件层面的。
-
硬件层面,上面这个USB 3.0用起来也不稳,持续写文件会断流。读写的文件有多大呢?也没多大,就一个4G左右的win10 ISO镜像,写到70-80%就报错。
-
至于CPU调教,那当然是没有了。最近买的超微X11SSH-F主板 + E3-1260L v5 CPU + 6个硬盘 + 3个12cm风扇,待机功耗才30多w。N100功耗本来就低,这个itx主板 + 2个硬盘,待机功耗也有30多w,感觉一点优化都没有。没有发挥出N100这颗低功耗CPU的优势。
-
最后是价格,24年下旬买的时候花了500多,并不实惠。
关于硬件选购的总结:
- 谨慎选购Intel I225-V/I226-V网卡
- 谨慎选购小众品牌的主板
- 最好是选带2个网口以上的主板。网络上有一些角度比较刁钻的做法,让软路由器在交换机的配合下用一个网络端口同时承载WAN和LAN流量,但是配置和运维又变得复杂了。
2. OpenWrt系统下载 #
2.1 OpenWrt原版系统 #
通用Release固件在上面的地址下载,品牌路由器固件在下面的地址下载:
-
在下载地址找到对应的目录:
各个版本的区别:
-
ext4-combined-efi.img.gz
- 使用可读写的ext4分区,没有squashfs的只读文件系统
- 根分区可以使用更大的驱动器(e.g. SSD/SATA/mSATA/SATA DOM/NVMe/etc)进行扩展
- 没有故障安全模式和出厂重置等功能,这些功能需要squashfs的支持
- 自带引导分区和根分区以及主引导记录 (MBR) 区域以及更新的 GRUB2
- 支持efi引导
-
ext4-combined.img.gz
- 同1,但不支持efi引导
-
squashfs-combined-efi.img.gz
- squashfs是个只读的文件系统, 相当于windows的ghost, 支持故障安全模式和出厂重置等功能
- 包含一个只读的根文件系统和一个存储设置以及安装软件可读写的分区
- 组合模式,只有不到100MB的空间来存储额外的包和配置,并且无法扩展根分区
- 支持efi引导
-
squashfs-combined.img.gz
- 同5,但不支持efi引导
2.2 原版OpenWRT/LEDE/ImmortalWRT 功能特性对比 #
原版OpenWRT(Open Wireless Router)诞生于2004年,是一个基于Linux的嵌入式操作系统,最初为Linksys WRT54G路由器开发。OpenWRT打破了传统路由器固件的封闭性,提供了一个完全可定制和可扩展的平台,允许用户根据需要安装和配置软件包。
LEDE(Linux Embedded Development Environment)项目于2016年由部分OpenWRT开发者分叉创建,旨在解决当时OpenWRT项目管理和开发过程中的一些问题,如更新滞后、代码质量下降等。LEDE 强调透明的开发流程和高质量的代码。2018 年,LEDE与OpenWRT项目重新合并,但LEDE的理念和改进被保留并融入了OpenWRT。
ImmortalWRT是由国内开发者基于OpenWRT和LEDE分叉而来,专注于满足国内用户的特殊需求。由于国内网络环境的特殊性,ImmortalWRT集成了许多针对性的优化和功能,如去广告、科学上网等。
特性 | OpenWRT | LEDE | ImmortalWRT |
---|---|---|---|
起源 | 原始项目 | OpenWRT 的分叉 | OpenWRT/LEDE 的国内分支 |
定制性 | 高 | 高 | 高 |
更新频率 | 稳定 | 更快 | 活跃 |
社区支持 | 全球社区 | 强调社区协作 | 国内社区 |
插件支持 | 丰富的软件包 | 类似 OpenWRT | 内置丰富插件 |
本地化 | 支持多语言 | 支持多语言 | 专注中文支持 |
优化 | 通用优化 | 改进代码质量 | 针对国内环境优化 |
适用人群 | 全球用户 | 追求新特性的用户 | 国内用户 |
-
OpenWRT:如果您需要一个经过长期验证的稳定系统,且对全球社区资源有需求,OpenWRT 是首选。
-
LEDE:如果您希望体验更快速的更新和更高的代码质量,LEDE 能满足您的需求。
-
ImmortalWRT:如果您是国内用户,想要开箱即用的丰富功能,且需要针对国内网络环境的优化,ImmortalWRT是最佳选择。
发现ImmortalWRT更好用之后,这里直接更换阵营。
2.2 从原版OpenWRT更换到ImmortalWRT #
更换固件用的实际还是固件升级功能,基于ImmortalWRT和OpenWRT同源的特性,版本相同的情况下,应该是可以直接在OpenWRT上更新ImmortalWRT(我已经试验过了):
1. ImmortalWRT下载地址:https://firmware-selector.immortalwrt.org/
2. 下载相同版本的ImmortalWRT:
3. 更新固件(换家):
3. OpenWrt安装 #
准备:
- 1个U盘
- PE引导系统(微PE)
- OpenWrt系统镜像:ext4-combined-efi.img.gz
- img镜像文件写盘工具:DiskImage_1_6_WinAll,https://roadkil.net/download.php?FileID=409&ProgramID=12
安装过程:
-
U盘写入微PE
-
复制系统镜像到U盘
-
插入U盘,开机启动
-
使用DiskGenius删除系统盘所有分区
-
使用DiskImage_1_6_WinAll写入OpenWrt系统镜像到目标硬盘
Tips:
- 跟平常安装ISO文件不一样,ext4-combined-efi.img就是一个展开的OpenWrt文件系统,里面没有安装器一类的东西。
- 这里我们需要自己准备写盘工具,DiskImage_1_6_WinAll可以把OpenWrt系统原封不动的从U盘复制到目标硬盘。
4. OpenWrt基础配置 #
基础设置的官方文档:https://openwrt.org/docs/guide-user/base-system/start
4.1 访问OpenWrt的网页管理端 #
Openwrt安装完成后,默认只分配一个wan口,一个lan口。查看网口配置:
cat /etc/config/network
通常第一个口(eth0)是lan口,第二口(eth1)是wan口,OpenWrt默认从wan口访问不了网页。
OpenWrt默认账户密码是:root 和 password,首次登陆记得修改。
OpenWrt默认地址是:192.168.1.1,可以直连电脑进行配置:
软路由(OpenWrt)192.168.1.1 <--- 电脑(dhcp)
如果软路由和电脑不直连,中间多一个路由器,需要把这个路由器上网模式改桥接:
软路由(OpenWrt)192.168.1.1 <--- 第二个路由器(桥接) <--- 电脑(dhcp)
如果要修改lan口ip,只需要改config interface ’lan’这一项:
vim /etc/config/network
config interface 'loopback'
option device 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd0e:5056:7223::/48'
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'
config interface 'lan'
option device 'br-lan'
option proto 'static'
option ipaddr '192.168.5.1' # 修改
option ip6assign '60'
config interface 'wan'
option device 'eth1'
option proto 'dhcp'
config interface 'wan6'
option device 'eth1'
option proto 'dhcpv6'
重启网络服务:
service network restart
4.2 解决光猫改桥接之后,访问不了管理网页 #
光猫开启桥接模式后,软路由作为默认网关进行拨号与NAT,导致客户端设备无法获取与光猫相同网段的IP地址,进而也就无法登陆光猫的后台管理界面。
实现原理其实很简单,只要在现有DHCP服务端正常工作的前提下,为软路由的wan口再分配一个与光猫网段相同的IP地址即可。OpenWrt支持多wan。
操作步骤:
添加新接口 -> 设置名称 -> 静态地址 -> 选择wan口对应的设备eth1
可以通过命令:cat /etc/config/network 查看wan口对应的设备
配置防火墙规则,将wan口的防火墙区域绑定到新接口:
配置一个跟光猫同网段的ip:
保存应用:
重启软路由:
5. 配置lan #
添加lan口(如果存在lan口,就不需要添加,直接在原本的基础上编辑修改),设置协议:静态地址,选择设备:br-lan
设置ip地址,这里的ip地址就是软路由的管理ip,以后局域网的设备都在这个网段下面。设置子网掩码,其它不需要设置:
设置防火墙:
开启DHCP,不勾选就是启用:
切记保存并应用:
6. 添加wan/宽带拨号连接,设置局域网全局ipv6 #
6.1 添加wan/宽带拨号 #
通过命令:cat /etc/config/network 查看wan口对应的设备:
config interface 'wan'
option device 'eth1'
option proto 'dhcp'
config interface 'wan6'
option device 'eth1'
option proto 'dhcpv6'
删除原本的wan和wan6,重新新建一个wan口:
设置宽带账号、密码:
设置完成之后,要想设置生效,一定要点“保存并应用”。默认会自动创建一个wan_6口:
此时,wan口接上光猫就可以正常上网了。
6.2 配置ipv6 #
主要是解决内网电脑ipv6地址分配的问题,通过上面的配置,内网电脑获取到的是局域网ipv6地址,要想获得全局ipv6地址还需要进行修改:
6.2.1 关闭Dnsmasq过滤IPv6 AAAA记录 #
关闭Dnsmasq的“过滤IPv6 AAAA 记录”功能:不要勾选
6.2.2 wan口设置ipv6地址 #
-
不需要新建wan6,已有的wan6接口要删除
-
配置wan口:
-
在wan口的高级设置中,开启ipv6的选项,并勾选使用运行商通告的DNS
-
启用ipv6源路由,启用委托ipv6前缀,禁用ipv6分配长度
-
在WAN接口的DHCP中检查设置,确保DHCP -> IPv6设置已经关闭
6.2.3 lan口设置下发ipv6地址 #
-
“委托IPv6前缀”允许下级设备再划分子网,按需勾选
-
“IPv6分配长度”设置64
-
使用eui64参数来启用EUI-64网络地址分配方式,从而形成固定IP(参考自:immortalwrt/user-FAQ/如何优雅的使用IPV6)
-
启用EUI-64网络地址分配方式,关闭DHCPv6,其它为空
-
启用SLACC
6.3 测试 #
新接口配置完成后,DNS缓存会有一定延迟,导致无法正常浏览网页,重启一下接口:
如果ip地址正常获取,上不了网,检查接口的防火墙是否正确设置:
- lan口
- wan口
ipv6测试:https://ipw.cn/ipv6webcheck/?site=ipw.cn
ping本地OpenWrt软路由的ipv6地址:
- 备注:
-
OpenWrt防火墙默认拦截ipv6的入站内网的请求,从外网通过ipv6 ping自己内网的电脑是ping不通的(测试的时候,Windows系统要把防火墙关了,Windows防火墙默认拦截ping请求)。
-
如果ping通了,赶紧检查一下OpenWrt防火墙是否正确设置。从网络安全的角度,即便是使用ipv6,也不建议把内网设备暴露在公网。
-
7. 安装软件 #
7.1 opkg包管理器 #
安装软件需要联网,需要配好wan口宽带上网。
OpenWrt除了在网页端安装软件,也可以使用opkg包管理器:
# 更新软件源
opkg update
# 获取软件列表
opkg list
# 获取软件列表
opkg install xxx
# 对已经安装的软件包升级
opkg upgrade xxx
# 卸载已经安装的指定的软件包
opkg remove xxx
# 升级所有包
opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade
7.2 安装中文语言包 #
网页端登录:
- 进入【System】—>【Software】,点击【Update lists】更新软件包列表
- 在过滤框中输入 luci-i18n-base-zh-cn,然后点击【Install】安装语言包。
- 安装完成后,刷新页面
- 如果界面没有自动变成中文,手动切换语言: 进入【System】—>【System】—>【Language and Style】。 在【Language】选项中选择【简体中文 (Chinese Simplified)】。 点击【Save & Apply】保存应用
7.3 安装usb有线网卡驱动 #
安装usb工具:更新列表 -> 搜索usb -> 安装usbutils
获取usb信息:
root@OpenWrt:~# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux 6.6.73 xhci-hcd xHCI Host Controller
Bus 002 Device 001: ID 1d6b:0003 Linux 6.6.73 xhci-hcd xHCI Host Controller
Bus 003 Device 001: ID 1d6b:0002 Linux 6.6.73 xhci-hcd xHCI Host Controller
Bus 003 Device 003: ID 05ac:024f SONiX USB DEVICE
Bus 003 Device 004: ID 046d:c07f Logitech Gaming Mouse G302
Bus 003 Device 005: ID 0b95:1790 ASIX Elec. Corp. AX88179
Bus 004 Device 001: ID 1d6b:0003 Linux 6.6.73 xhci-hcd xHCI Host Controller
搜索网卡AX88179,找到对应驱动:
驱动安装完成,usb有线网卡自动识别到,系统多了一个eth2。
7.4 安装usb无线网卡驱动 #
安装usb无线网卡驱动,需要知道无线网卡使用的芯片。有3个方法:
-
1.直接去厂家官网通过产品型号查,我用的这款厂家官网没写用的啥芯片
-
2.一般这种usb无线网卡都是Windows免驱的,可以插上Windows系统直接看到对应的芯片信息。这里可以在知道我这款无线网卡用的是联发科MT7612U芯片
-
3.安装usb-modeswitch:opkg install usb-modeswitch, 通过lsusb命令也可以识别
在OpenWrt的软件包里面搜索,就能找到对应的驱动(如果官方软件库没有,得自己编译):
8. 配置防火墙 #
参考这篇帖子进行设置:https://iyzm.net/openwrt/3313.html
帖子里面提到ipv6不支持端口转发,这里勘误一下,端口转发在24.10已经支持ipv6了。
8.1 通过端口转发映射内网主机 #
上文说ipv6 ping不通内网主机,这里设置端口转发,实现外网通过ipv6 ping通内网主机
-
关闭Windows防火墙
-
添加一条转发规则:allow-icmp-ping:
-
这里设置的是转发icmp协议,实际上也支持转发 tcp、udp协议,也就是说可以通过这种方式把内网的端口映射出去
8.2 通过设置通信规则映射内网主机 #
-
设置通信规则
-
添加一条规则:allow-host,开放内网主机的(ipv6)的TCP、UDP、ICMP协议
9. 挂载硬盘/根目录扩容 #
9.1 挂载硬盘 #
安装cfdisk软件包:
运行:cfdisk,还剩200多G,准备扩容
New:
Write,之后输入yes确定,再点Quit退出:
把新分区格式化为ext4文件系统:
mkfs.ext4 /dev/sda3
在网页找到挂载点,点生成配置把 -> 挂载已连接的设备,外接磁盘挂载就完成了:
9.2 根目录扩容 #
如果想对原本根目录进行扩容,磁盘分区的步骤跟上面一样。后面点:生成配置,这里不要点自动挂载:
挂载点 -> 编辑:
勾选已启用 -> 作为根文件系统使用,复制红框里的命令。然后,保存设置(重要):
保存设置并应用(重要):
ssh登录终端,依次执行复制的命令(不是原封不动的执行,硬盘路径需要修改),完成之后重启:
root@ImmortalWrt:~# mkdir -p /tmp/introot
root@ImmortalWrt:~# mkdir -p /tmp/extroot
root@ImmortalWrt:~# mount --bind / /tmp/introot
# 注意:这条命令需要修改,替换成自己的硬盘路径,我这里是/dev/sda3。可以通过fdisk -l命令确定自己的磁盘
root@ImmortalWrt:~# mount /dev/sda3 /tmp/extroot
root@ImmortalWrt:~# tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
root@ImmortalWrt:~# umount /tmp/introot
root@ImmortalWrt:~# umount /tmp/extroot
root@ImmortalWrt:~# reboot
扩容效果:
10. 修改wan口和lan口的mac地址 #
编辑/etc/config/network文件:
vim /etc/config/network
网页搜索一个mac地址随机生成器,生成单播、全局地址:
添加option macaddr项:
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'
option macaddr 'xx:xx:xx:xx:xx:xx'
config interface 'wan'
option device 'eth1'
option proto 'pppoe'
option username '123456'
option password '123456'
option ipv6 'auto'
option force_link '1'
option macaddr 'xx:xx:xx:xx:xx:xx'
11. wan口链路聚合/wan口宽带多播,突破带宽上限 #
一般来说想突破千兆外网,有以下方式:
- 1.有2.5G电口的万兆光猫,下接2.5G路由器/交换机(缺点:设备昂贵)
- 2.用猫棒代替光猫,接入2.5G/10G内网设备(缺点:还是设备昂贵,而且10G EPON猫棒更贵)
- 3.光猫桥接,软路由配置2个WAN口拨号,然后聚合带宽(缺点:很多地方已经禁多拨或者多拨也没提升)
- 4.光猫拨号,软路由配置2个WAN口自动获取地址,再进行聚合(缺点:多一层NAT)
- 5.光猫桥接,软路由配置2个口聚合为WAN口进行拨号(缺点:需要光猫支持,支持的光猫很少)
11.1 wan口链路聚合 #
前置知识:
-
在Linux中设置链路聚合(Link Aggregation)通常使用bonding或teamd技术,将多个物理网络接口绑定成一个逻辑接口,以提高带宽和冗余性。
-
OpenWrt使用bonding技术。
操作步骤:
-
不需要像 https://post.smzdm.com/p/av7o06mn/ 帖子说的那样手动改脚本,现在可以直接在网页端操作
-
安装bond相关的依赖:
-
添加bond接口:
-
重新设置wan口对应的设备:
-
最后保存并应用:
-
实测效果:
- 网络测速更容易跑满千兆,但是突破不了千兆上限
- 是光猫不支持,还是移动宽带没有留有余量?!
11.2 wan口宽带多播 #
12. 关于I226-V网卡掉速的权益之计 #
现在初春时节,还不热,机箱都是冷冰冰的,网卡芯片上象征性的贴了一个散热片:
用iperf3测试,稳定跑了一晚上,跑了2.5TB流量,竟然没有掉速?!
再加一个定时任务,周期性检测:
i226-v-reset.sh脚本内容如下:
#!/bin/sh
ethtool eth0 | grep -q "Link detected: no" || ethtool eth0 | grep -q "Speed: 1000Mb/s" || ethtool -s eth0 speed 1000 duplex full autoneg off
ethtool eth1 | grep -q "Link detected: no" || ethtool eth1 | grep -q "Speed: 1000Mb/s" || ethtool -s eth1 speed 1000 duplex full autoneg off
i226-v-reset.sh脚本作用:
- 判断网口是否连接;
- 如果已连接,判断速度是否为1000Mb/s;
- 如果速度不是1000Mb/s,强行设置网口速度。