前言
我家里有一台红米 AX6,我在几年前把它刷了 OpenWrt,我尝试过多种固件,最终成功刷上了 Kiddin9’ 的固件(又名 Kwrt),后来由于 Kwrt 带有太多我不使用的功能,我又切换成了 ImmortalWrt。我也尝试过原版 OpenWrt,但它的 squashfs factory 刷机包在我的路由器上无法开机(不知为何,initramfs factory 刷机包能开机,但 initramfs 刷机包的每次重启都会丢失数据,仅用于测试用途)。
话题 1. 找到刷机包、刷机与救砖
这部分随路由器型号不同而不同,因此不多赘述,但我和我的朋友也在这上面踩过坑,因此放出如下几点经验和建议。
- 为了获得稳定的更新,优先尝试原版 OpenWrt、ImmortalWrt、Kwrt 等长期更新的分支。本文基于发布前的 ImmortalWrt 最新版 25.12.1 编写,可能不使用于旧版。另外 OpenWrt 分支众多,还有 LEDE、iStoreOS、X-Wrt 等我未使用过,因此我也不能保证本文适用于你使用的分支。
- 一定要有方便的救砖固件,如 U-Boot 或者 Breed,除了(通常)不能刷回官方固件什么都能刷那种,不然变砖了就只能拆开焊接串口刷机了(是的,我经历过一次)。部分型号的救砖固件可能需要付费,如我使用的红米 AX6(在此购买 注意:仅代表我个人使用过该固件,第三方内容不做质量担保)。
- 如果真的变砖了且没有第三方救砖固件,尝试使用官方的救砖工具,但不保证能救回来,也不保证不会越救越坏。官方的救砖工具有适用范围,如小米的救砖工具只适用于未刷扩容分区表。
- 我未成功自行编译过 OpenWrt,因此本文不涵盖这部分。
话题 2. 更新
OpenWrt 的更新主要有两种方式,一个是自行下载 sysupgrade 固件,然后在“系统→备份与更新→操作→更新固件”处上传新的固件,注意这种方式会丢失自己安装的软件包,除非你在构建时包含了它们。你也可以勾上“将当前安装的包列表备份在 /etc/backup/installed_packages.txt”然后在更新后手动安装这些软件包(OpenWrt Wiki 上有脚本可以快速安装,自行承担风险使用)。部分固件,如 Kwrt,勾选上备份软件包列表后会在更新之后自动安装。
另一个是使用“系统→值守式系统升级”,这会向构建服务器请求一个包含已安装软件包的固件,因此可以保留自己安装的软件包,但不是所有的分支都提供这个功能。
不推荐重新刷 factory 固件(真的会有人这么干吗?),这会丢失所有的配置和软件包,尽管 OpenWrt 也提供了手动备份和恢复的选项。
话题 3. 基本和杂项配置
成功安装 OpenWrt 后建议做以下基本配置,此处也包含一些杂项配置:
- “系统→系统→常规设置→主机名”,这不仅会影响左上角显示的名字,还会影响局域网 DNS 的解析(包括浏览器输入
http://主机名访问后台或者ssh 主机名) - “系统→系统→语言和界面→主题”,是的,这一步纯粹是个人喜好,我不喜欢部分固件自带的 Argon 主题,我还是更适应原版 OpenWrt 的 Bootstrap 主题。
- “系统→管理权→路由器密码”,这就是网页后台(社区习惯称作 LuCI)的密码,仅此而已,但为了安全,要设置强密码,尤其是当你需要把后台暴露到公网上时。至于用户名,OpenWrt 默认就是 root,也没有地方修改(事实上也不建议修改 Linux 的 root 用户名,尽管技术上可行),随他去吧。
- “系统→管理权→SSH 访问”,取消勾选“密码验证”和“允许 root 用户凭密码登录”,然后在“系统→管理权→SSH 密钥”上传你的 SSH 公钥(永远不要上传你的私钥到任何地方!真的有人找别人要公钥然后对方在 QQ 上发了个私钥,如果有人不怀好心那你就完了,我没开玩笑),禁用密码登录有助于进一步提高安全性。
- “系统→LED 配置”,部分路由器的官方固件提供了关闭灯光的选项,在 OpenWrt 上可以通过这个页面关闭灯光,不过个人不建议关闭,不然哪天误操作变砖了你都不知道(乐)。
- “网络→接口→接口→lan”,点击右侧的“编辑”,在“IPv4 地址”处修改路由器的局域网地址和网段,Kwrt 默认是
10.0.0.1/24,我习惯使用192.168.0.1/24。 - 有的人还想修改 IPv6 的局域网网段,这个在“网络→接口→全局网络选项→IPv6 ULA 前缀”,而 IPv6 局域网后缀在 lan 接口的“高级设置→IPv6 后缀”里。
- “网络→无线→无线概况”,点击热点右边的“编辑”修改 Wi-Fi 热点的 ESSID,什么你不知道 ESSID 是什么?ESSID 就是平时说的 SSID(前面多一个 E 是为了和人类不可见且通常不可修改的 BSSID 区分),也就是 Wi-Fi 看到的名字。
- 如果需要“双频合一”,将 2.4 GHz 和 5 GHz 的 ESSID 设置成相同的。
- 勾选“隐藏 ESSID”以隐藏 Wi-Fi(如果有 2.4 GHz 和 5 GHz,两个都要勾上)。
- 另外,你可能还想修改 Wi-Fi 的信道以及信道宽度(以达到路由器厂商宣传的 160 MHz 频宽)。
- 记得在“无线安全”里面修改 Wi-Fi 密码,可选修改加密方式和算法。由于家里老设备的兼容性原因,我使用“WPA2-PSK(强安全性)”加密和“强制使用 CCMP(AES)”算法。为了安全,不要选择“WPA-PSK”加密或者“强制使用 TKIP”算法。
- 如果需要使用路由器拨号(建议,部分运营商分配的 IPv6 前缀长度为 64,无法继续使用 DHCP-PD 分派前缀,如果不使用路由器拨号,就只能使用 IPv6 中继了,见后文),点击“网络→接口→接口→wan”右边的“编辑”,将协议改为 “PPPoE”,点击出现的“切换协议”,然后输入“PAP/CHAP 用户名”和“PAP/CHAP 密码”即可。本文不细讲如何将光猫改为桥接,大致上你需要光猫的超管密码,你需要向你所在片区装宽带的师傅要(如果忘了就找客服要师傅的电话),态度诚恳一点。
- 如果不想使用运营商 DNS,还是点击“网络→接口→接口→wan”右边的“编辑”,在高级设置里取消勾选“自动获取 DNS 服务器”并添加“使用自定义的 DNS 服务器”。IPv6(wan6)的配置方法相同。
- 如果要强制使用路由器作为局域网 DNS(即 DNS 劫持),勾选“网络→DNS→常规→DNS 重定向”,注意 DoH 等不受影响。
更改以上设置后,务必记得点击右下角的“保存并应用”,不然你就白改了。
话题 4. DDNS、ACME 证书以及暴露路由器到公网
如果你需要把路由器的网页后台和 SSH 暴露到公网,首先需要安装 luci-app-uhttpd,软件包的安装在“系统→软件包”,如果搜不到软件包列表,就点击“更新列表”。推荐安装 luci-i18n-uhttpd-zh-cn 翻译包,搜索软件包时应该会自动显示对应的翻译包,下同,故不再赘述。
安装完后,刷新网页(安装所有 luci-app- 开头的包都需要刷新,下同),你应该看到“服务→uhttpd”,在“HTTPS 监听(地址:端口)”里添加你想使用的端口(由于国内运营商通常会阻止 80、443、8080 等常见 HTTP / HTTPS 端口),地址部分使用 0.0.0.0(IPv4)或 [::](IPv6)以监听全部,我添加了 0.0.0.0:1443、[::]:1443。
如果需要暴露 SSH,在“系统→管理权→SSH 访问”里取消勾选“绑定接口”,可选修改“端口”。
然后在“网络→防火墙→通信规则”里添加两条规则,按以下方式配置:
- 名称:自己取,我用的
Allow-SSH和Allow-LuCI-HTTPS - 协议:TCP
- 源区域:wan
- 目标区域:设备
- 目标端口:你的 SSH 或 HTTPS 端口
- 操作:接受
此时你就可以使用 IP 地址从公网访问路由器了,但使用 IP 地址不方便,你可以使用 DDNS 来解决这一问题。首先你需要一个域名,你可以买一个,或者去 https://nic.eu.org 注册一个免费域名(如果只是远程访问家里云,免费域名通常足够了,但 eu.org 的审核可能需要一阵子),然后你需要把你的域名托管给一家 DNS 解析服务商,我使用 Cloudflare(注意:使用 Cloudflare 时务必关掉 DNS 记录里的“代理”)。
然后安装 luci-app-ddns,根据你的 DNS 解析服务商不同,你可能需要安装额外的软件包,如 ddns-scripts-cloudflare。在“服务→动态 DNS”里点击“添加新服务”,名称还是自己取,“IP 地址版本”根据你需要做 IPv4 还是 IPv6 DDNS 选择,服务商选择你使用的服务商,然后点击“创建服务”。
接下来找到刚刚创建的 DDNS 服务右边的“编辑”,将靠上面的域名设置成你使用的域名(如 router.example.com)。然后以 Cloudflare 为例,下面的域名设置成 @ 分割的子域名和域名(如 router@example.com),用户名和密码分别设置成你的邮箱和 API 令牌,其他服务商可能不同。创建 API 令牌需要前往 https://dash.cloudflare.com/profile/api-tokens,点击“创建令牌”,选择“API 令牌模板”中的“编辑区域 DNS”,点击区域资源一栏最右边的下拉框,选择你的域名,创建完成的令牌权限应该为“区域:DNS:编辑”,区域资源则形如“包括:特定区域:example.com”。
然后在“动态 DNS 服务项”的“高级设置”里设置“IP 地址来源”,通常使用“网络”即可,下面一栏“网络”如果是 IPv4 路由器拨号,选择“wan”,如果是 IPv6 路由器拨号,选择“wan_6”(注意下划线),如果是 IPv6 光猫拨号,选择“wan6”。注意如果是 IPv4 光猫拨号(有 IPv4 公网的话还是尽量路由器拨号,光猫的防火墙可能阻止公网访问,如果确实不可行,尝试设置光猫的端口转发或者 DMZ 主机),你可能需要把“IP 地址来源”改成“URL”。
配置完成后,等待一段时间后 DNS 缓存刷新,你就应该能从域名访问路由器了。部分服务商需要你手动添加对应的 DNS 记录才能通过 API 更新相应的记录。
但你发现浏览器依然会警告自签名证书,因此你需要配置 ACME 证书。安装 luci-app-acme 和 acme-acmesh-dnsapi,在“服务→ACME 证书”里设置“电子邮件帐户”,然后你应该可以直接点击“找到 DDNS 域名”右边的“导入 xxx”,如果没有,你需要手动配置,首先在左下角的输入框里输入名称(不是域名,可以自己取),然后点“添加”,弹出的对话框里“验证方式”选择“DNS-01 DNS质询验证”(由于 HTTP 验证使用的端口在国内通常被运营商屏蔽,因此通常使用 DNS 验证),“域名”添加你的域名(这里才是需要证书的域名),在“DNS 质询验证”标签中选择“DNS API”为 “CloudFlare”,输入 CF_Key 和 CF_Email(同 DDNS 使用的 API 令牌),其他服务商可能不同。
最后在“服务→uhttpd”里的“HTTPS 证书 (DER 或 PEM 格式)”和“HTTPS 私钥 (DER 或 PEM 格式)”选择获得的证书和私钥,分别选择 /etc/acme/你的域名_ecc/你的域名.cer 和 /etc/acme/你的域名_ecc/你的域名.key 即可。
注意:部分 OpenWrt 分支可能使用 Nginx 而非 uHTTPd,如 Kwrt,由于我很久未使用 OpenWrt 上的 Nginx,因此此处不细讲,不过 Nginx 也有自己的 LuCI 包。
如果你除了路由器后台,还有其他服务通过端口转发使用同一域名,你可以通过 scp -O ...(加上 -O 是因为 OpenWrt 上可能无法使用 SFTP 协议而只能使用 SCP 协议)命令从路由器上拉取 ACME 证书到设备上,记得配置定时任务(cron 或者 systemd-timer)。
话题 5. 开启 IPv6
部分固件,如 Kwrt,默认开启完整的 IPv6 支持,但另一部分固件,如 ImmortalWrt,默认则不开启 IPv6 或者不开启 DHCPv6 地址分配。要开启 IPv6,在“网络→接口→接口→lan”右边点击“编辑”,在弹出的界面中选择“DHCP 服务器→IPv6 设置”,将“RA 服务”和“DHCPv6 服务”设置为“服务器模式”,然后在“DHCP 服务器→IPv6 RA 设置”中勾选“启用 SLAAC”并将“RA 标识”设置为“管理配置 (M)”和“其他配置 (O)”(若不设置“RA 标识”,则 DHCPv6 可能不会生效)。
如果你在使用光猫拨号,且无法切换到路由器拨号,你可能需要使用中继模式(部分运营商下发的前缀是 /64 的,此时只能使用中继模式;若前缀长度小于 /64,则通常可以使用服务器模式),你需要将 lan 的“RA 服务”、“DHCPv6 服务”和“NDP 代理”设置为“中继模式”或“混合模式”。然后你需要设置中继模式使用的主接口,点击“网络→接口→接口→wan6”右边的编辑,选择“DHCP 服务器”标签页,点击“配置 DHCP 服务器”,“常规设置”中的“忽略此接口”应该会自动勾选,如果没有,手动勾选即可;然后在“IPv6 设置”中勾选“指定的主接口”。
话题 6. 暴露设备到公网
如果有暴露设备到公网的需求,在“网络→防火墙→端口转发”处添加端口转发即可。添加端口转发之前你需要先固定设备 IP 地址,固定 IPv4 地址在“网络→DHCP→租约”,点击“添加”,设置“MAC 地址”和“IPv4 地址”即可,固定 IPv6 地址有两种方法,一种是使用 DHCPv6(个人推荐,因为 SLAAC EUI64 会暴露你的 MAC 地址),一种是使用 SLAAC EUI64。
使用 DHCPv6 时,在“网络→DHCP→租约”点击“添加”,设置“DUID/IAIDs”和“IPv6令牌”,其中“DUID/IAIDs”在下拉框中选择即可,会显示对应的主机名,而“IPv6 令牌”是分配的后缀,比如要分配 ::2/-64 到设备,填写“02”即可。
使用 SLAAC EUI64 时,需要在设备而非路由器上启用 EUI64,此处附上 Linux NetworkManager 的配置方法:nmcli connection modify "连接名或ID" ipv6.addr-gen-mode eui64。
然后在“网络→防火墙→端口转发”添加端口转发,内部 IP 地址填写设备的局域网地址(IPv6 填写 IPv6 ULA,即 fcxx 或 fdxx 开头的地址),注意就算“地址族限制”为“自动”,IPv4 也只能转发到 IPv4,IPv6 只能转发到 IPv6,因此如果你需要部署双栈,你需要每个配置添加两份,一份 IPv4,一份 IPv6。
IPv4 的端口转发添加好即可正常使用,如果没有,检查设备的防火墙。但 IPv6 的端口转发添加了也不能直接使用,需要先打开 IPv6 NAT,在“网络→防火墙→常规设置”下“wan ⇒ REJECT”右边点击编辑,弹出的窗口找到“高级设置”,勾选“IPv6 伪装”,然后在“将 IP 动态伪装源地址限制在指定子网”里添加一条“fc00::/7”(否则设备在使用 IPv6 访问网站时,网站看到的地址是路由器的地址而非设备的地址)。然后你还需要禁用 sourcefilter,目前版本这个选项不会出现在网页中,需要 SSH 连接到路由器然后运行:
1 | uci set network.wan6.sourcefilter="0" |
(如果是路由器拨号,将 wan6 改成 wan)
不过 IPv6 除了端口转发还有另一种方式暴露设备到公网,你同样需要固定 IPv6 后缀,然后在设备而非路由器上做 DDNS,将设备的 IPv6 GUA(即 2xxx 开头的地址)绑定到域名。然后在路由器的“防火墙→通信规则”里添加一条,按如下方式配置:
- 名称:自己取,我用的
Allow-IPv6-Forward-设备名 - 协议:TCP、UDP(通常这两个就够了,也可以任意)
- 源区域:wan
- 目标区域:lan
- 目标地址:设备的后缀/-64(如
::2/-64,此处前缀长度为负 64 意味着匹配后缀而非前缀) - 操作:接受
事实上,直接将设备 IPv6 GUA 暴露在公网通常更优,因为可以免去 NAT66 的开销。但我同时配置了端口转发和通信规则,因为我将 router.su226.eu.org 配置为双栈,指向路由器,而 pc.su226.eu.org 配置为纯 IPv6,指向设备。
话题 7. 远程访问设备
通过 Tailscale 等开箱即用的组网软件可以轻松访问设备,不过有两点需要注意,一是在路由器上安装 luci-app-upnp,二是勾选“网络→防火墙→常规设置”里面的“启用 FullCone NAT”(原版 OpenWrt 无此功能,但大部分分支有),主机游戏等其他 P2P 打洞应用也可以因此受益。
如果你不想使用 Tailscale,且有公网 IP(IPv4、IPv6 均可),可以手动配置 WireGuard,方法如下:安装 luci-proto-wireguard,重启路由器(由于 WireGuard 有内核模块,所以需要重启)。然后在“网络→接口→接口”点击“添加新接口”,输入接口名称,协议选择“WireGuard VPN”,然后点击“生成新的密钥对”,“监听端口”输入你想使用的 UDP 端口(如 51820),“IP 地址”输入你想使用的 IP 地址和网段(如 192.168.226.1/24)。然后在“防火墙设置”标签的“创建/分配防火墙区域”将接口分配到“lan”区域(也可以创建新区域,需要自行配置防火墙允许新区域到 lan 的转发)。然后在“对端”标签里点击“添加对端”,输入对端描述,点击“生成新的密钥对”和“生成预共享密钥”,“允许的 IP”设置为想要设备使用的 IP,前缀长度为 32(如 192.168.226.2/32),勾选“为允许的 IP 创建路由”,可选配置“持续保持连接”。然后点击“生成配置”,“连接端点”设置成 DDNS 使用的域名,“允许的 IP”设置成使用的网段(如 192.168.226.0/24),“DNS 服务器”可以留空,“地址”应该自动填好,如果没有,再次填入想要设备使用的 IP(如 192.168.226.2/32),最后用设备扫描二维码,或者复制 / 下载下面的配置文件让设备导入即可。
当然,你还需要在“防火墙→通信规则”里放行刚刚使用的端口,配置如下:
- 名称:自己取,我用的
Allow-WireGuard - 协议:UDP
- 源区域:wan
- 目标区域:设备
- 目标端口:WireGuard 端口(如 51820)
- 操作:接受
话题 8. 桥接模式下配置光猫
将光猫改为桥接模式且配置路由器拨号后,就没办法再打开光猫的配置界面了,除非把路由器 wan 的协议改回 DHCP 客户端。要在不反复改协议的情况下访问光猫,可以按以下方式配置:在“网络→接口→接口”添加一个新接口,名称为“config”(或者自己取),协议为“DHCP 客户端”,设备为“wan”。然后在“高级设置”标签取消勾选“使用该接口的网关作为默认网关”、“自动获取 DNS 服务器”、“委派 IPv6 前缀”,然后在“防火墙设置”里将“创建/分配防火墙区域”设置为“wan”。
此时应该可以访问光猫的配置界面了,如果不能,在“网络→路由→静态 IPv4 路由”里添加一条新路由,接口为“config”,路由类型为“unicast”,目标为光猫的网段(如 192.168.1.0/24),网关为光猫的 IP 地址(如 192.168.1.1)。
话题 9. 远程开机(网络唤醒)
首先在设备上启用网络唤醒,网络唤醒可能由操作系统也可能由 BIOS 管理,如果是操作系统管理,你需要在系统内配置网络唤醒,可能需要多次重启;如果是 BIOS 管理,在 BIOS 内找到“PCIe 唤醒”或者“网络唤醒”等字样,打开即可。
然后在路由器上安装 luci-app-wol,安装后打开“服务→网络唤醒”,点击“添加”,填写名称和 MAC 地址,接口选择 br-lan(注意:尽管 wakeonlan 不支持这个选项,但使用 etherwake 还是必须填写这个选项的),就可以远程唤醒设备了。当然,别忘了将路由器后台暴露在公网上。
另外,为了防止网络唤醒失效,我还买了一个米家的智能插座,并在 BIOS 里设置了上电开机。你也可以考虑使用开机卡或者让哥们帮忙开机(有超级加辈的风险)等方案。
后记
暂时就想到 / 遇到过这么多了,以后有什么新变化再更新吧。