PHASE 2 · 路由器解剖

2.1路由器跑了哪些进程

OpenWRT 守护进程全景

Phase 1 你学的全是内核能力——接口、路由、netfilter、tc。但内核只提供"机制":它能转发、能改地址、能过滤,却不会自己决定"LAN 用哪个网段、给新设备发什么 IP、防火墙放行什么"。这些"策略"由一堆用户态进程来定。Phase 2 从这里开始:SSH 进一台 OpenWRT 路由器,看它到底跑了哪些进程、各自干什么——你会发现,一台路由器 = Linux 内核(Phase 1 的机制)+ 一组各司其职的守护进程

一句话定义

一台路由器的功能,由内核机制(转发 / NAT / 防火墙)加上一组用户态守护进程(daemon)共同实现:进程负责"配置内核、提供服务、响应管理",内核负责"真正搬运数据包"。

1换个视角:机制 vs 策略

一个贯穿整个 Phase 2 的分工:

  • 内核 = 机制:一张能被配置的路由表、一套能被填规则的 netfilter、能被启停的接口……但它不会自己填。它是被动的机制。
  • 用户态进程 = 策略:读取配置,把这些机制配置成一台真正的路由器——netifd 去建接口配路由、firewall4 去写 nftables、dnsmasq 去发 DHCP 和答 DNS……
用户态守护进程 · 策略(谁来决定怎么做)
procdubusdnetifddnsmasqodhcpdfw4hostapduhttpdrpcd
↓ 读配置,调内核(敲 ip / nft / …)
Linux 内核 · 机制(能做什么,但要被配置)
接口路由表netfilterconntracktcnamespace

类比你熟的东西:内核像一套 API / 系统调用,进程像调用这些 API 的应用程序。Phase 1 你在命令行手动"调 API"(敲 ipnfttc);OpenWRT 的这些进程,就是替你自动、持续地调这些 API 的常驻程序。所以理解一台路由器分两半:Phase 1 的内核机制(已经会了),加这一阶段的进程(现在开始)。

2进程全景:到底跑了什么

SSH 进 OpenWRT,ps 一下,你会看到十来个守护进程。逐个认(按"管 Phase 几的什么"归类):

bash
ps            # busybox 的 ps;或 top 看谁在跑
进程干什么对应你学过的
procdPID 1,init + 服务管理(启停 / 监控守护进程)§3
ubusd消息总线,各进程互相通信 / 被查询§3
netifd网络接口守护进程:按配置建接口、配 IP、配路由1.1 / 1.2
dnsmasqDNS 转发 + DHCP 服务器(给 LAN 发 IP、答 DNS)0.5 DHCP/DNS
odhcpdDHCPv6 / RA(路由通告),下发 IPv6 地址IPv6 加餐
fw4防火墙:把 UCI 规则编译成 nftables 装进内核1.3 nftables
hostapdWi-Fi AP:管 802.11 接入、认证、WPA 加密0.2 / 1.1 wlan
wpa_supplicantWi-Fi 客户端(路由器当 client / 中继时)同上
uhttpdWeb 服务器,serve LuCI 管理界面0.5 HTTP
rpcd后端 RPC(LuCI 经它 + ubus 操作系统)§3
pppdPPPoE 拨号(部分宽带的 WAN 接入)2.6
logd系统日志

看清结构:procd / ubusd 是骨架(下一节),netifd / dnsmasq / fw4 / hostapd 是主力(各对应 Phase 1 的一块能力),uhttpd / rpcd 是管理面。(注:fw4 更像一个"被触发时把规则装进内核"的程序,而非常驻守护进程;其余多为常驻。)

品牌固件也大同小异

你买的品牌路由器固件里跑的东西差不多(可能换成 udhcpd、私有防火墙脚本、闭源 Web UI),但骨架一样:一个 init、一个配置系统、DHCP/DNS、防火墙、WiFi、Web UI。OpenWRT 的价值是这些几乎全是标准开源组件,可读、可换、可 SSH 进去看——所以是最好的解剖对象。

3procd 与 ubus:把这些进程黏在一起

上面那些进程不是各跑各的,而是被 procd 管着、通过 ubus 协作。

procd — OpenWRT 的 init

  • PID 1(启动的第一个用户态进程,扮演桌面 Linux 里 systemd / init 的角色)。
  • 按依赖顺序启动各服务、监控它们、崩了拉起来、处理热插拔(hotplug)事件。
  • /etc/init.d/dnsmasq restart 之类,最终经 procd 管理服务生命周期。

ubus — 进程间消息总线

  • ubus(OpenWRT micro bus)+ ubusd:一条轻量的进程间消息总线(类比桌面 Linux 的 D-Bus)。各守护进程把自己的能力注册到 ubus,别人就能调用 / 查询。
  • 例:LuCI 想改网络配置,不是自己去敲 ip 命令,而是经 rpcd 通过 ubus 调 netifd;netifd 再去操作内核。ubus 是各组件解耦协作的中枢。
  • 命令行也能玩:ubus list(看有哪些对象)、ubus call system board(查一个对象的信息)。
路由器关联 router-link

如果说各守护进程是一组微服务,procd 是它们的进程管理器(启停 / 编排),ubus 就是它们之间的消息总线(RPC / 事件)。这套"init + 总线 + 一堆守护进程"就是 OpenWRT 架构的骨架:UCI(配置)→ netifd / fw4 等(执行)→ 内核(生效),中间用 ubus 串起来、procd 管着进程。下一章 2.2 把这整条链画清楚。

4一个设备连 WiFi 的进程接力

把 Phase 0"设备开机拿 IP、上网"的故事,换成"哪些路由器进程在背后接力",就看清进程和数据包的关系了。一台手机连上你的 OpenWRT、到能刷网页:

  1. 关联 WiFi:手机发起 802.11 关联,hostapd 处理认证 + WPA 加密握手(0.2 链路层 / WiFi),放它进无线网。
  2. 进入 LAN:hostapd 管的无线接口,被 netifd 桥进了 br-lan(1.1 bridge)——手机现在和有线设备同在一个二层网。
  3. 拿 IP:手机发 DHCP DORA(0.5),dnsmasq 作为 DHCP 服务器分给它 192.168.x 地址 + 网关 + DNS。
  4. 查 DNS:手机解析域名,请求发到 dnsmasq(它也是 DNS 转发器,0.5),向上游查、缓存、返回。
  5. 出网被过滤:手机的包转发出 WAN,经内核 FORWARD 链,fw4 写的 nftables 规则(1.3)放行 + 在 POSTROUTING 做 masquerade(0.6 NAT)。
  6. 路由出门:netifd 早已配好的默认路由(1.2)把包送出 WAN 口。

一句话:Phase 0 那个抽象的"设备开机上网",现在每步都能对到一个具体进程——hostapd 管进门、dnsmasq 管发牌、netifd 管布线和路由、fw4 管安检和 NAT。内核搬运,进程指挥。

路由器关联 router-link

这条接力,正好是 Phase 2 后面几章的目录:2.3 讲 dnsmasq / odhcpd(发牌 + DNS)、2.4 讲 fw4(安检 + NAT)、2.5 讲 hostapd(WiFi 进门)、2.6 讲 WAN 接入(出门那条线怎么建)。本章先把全体演员认全,后面逐个深入。

本章小结

  • 路由器 = 内核机制(Phase 1:转发 / NAT / 防火墙 / 接口)+ 一组用户态守护进程;进程出策略,内核出力气。
  • 进程全家福:netifd(接口 / 路由,1.1/1.2)、dnsmasq(DHCP/DNS,0.5)、odhcpd(IPv6/RA)、fw4(防火墙,1.3)、hostapd(WiFi,0.2)、uhttpd/rpcd(LuCI 管理面,0.5 HTTP)。
  • procd = PID 1 init + 服务管理;ubus = 进程间消息总线(类比 systemd + D-Bus);LuCI 改配置经 rpcd → ubus → netifd → 内核,不直接敲命令。
  • 设备连 WiFi 上网的接力:hostapd(进门)→ netifd(桥进 LAN)→ dnsmasq(发 IP+DNS)→ fw4(过滤+NAT)→ 路由出 WAN,每步对应一个进程。
  • 全体演员认全后,Phase 2 后续逐个深入(2.2 架构、2.3 DHCP/DNS、2.4 防火墙、2.5 WiFi、2.6 WAN)。

动手练习

  1. 若有 OpenWRT 路由器,SSH 进去跑 pstop,找出 procd、netifd、dnsmasq、fw4、hostapd,对照本章说出各自职责。
  2. ubus list 看注册了哪些对象;ubus call system board 看它返回什么(体会 ubus 是"可查询的进程能力总线")。
  3. 思考题:为什么 LuCI 改网络设置要经过 rpcd + ubus + netifd,而不是自己直接敲 ip 命令?(提示:解耦、统一配置来源、并发安全。)
  4. 进阶:把第 4 节"设备连 WiFi 上网"的接力,和 Phase 0"curl 的一生"对照——同一件事,一个从数据包视角讲(Phase 0),一个从进程视角讲(本章)。写出每步"数据包在哪一层 ↔ 哪个进程在管"。