背景
最近买了一个Raspberry Pi,想做成一个复杂一点的家庭网关。Raspberry Pi确实是一款不错的硬件,小身材大智慧,运行一个基于Debian的Linux系统。
由于本人已经有10多年Linux使用经验,也比较喜欢研究操作系统方面的东西,在Linux方面还算积累了不少经验。配置Rasp的过程还算顺利,但还是碰到不少问题。
本人在Rasp上配置了hostapd+dnsmasq+dhcpcd+dhcpd+n2n+monit,主要提供以下几个功能:
- 一个n2n网络,提供任意两个子网的P2P访问
- 一条外网访问内部子网的通道
- 一条fuck gfw的通道及WiFi热点
- 一个可视化管理页面
整个过程还算顺利,基本上一天就搞定了,但还是遇到一些问题:
- 服务异常退出
- 网络访问异常
于是乎,我就开始了研究Linux网络配置的过程,这个过程非常痛苦,基本没有一篇完整的文章,只能从别人的回复中去发现真相。
由于Linux发展历史已经很长,再加之各种不同的软件与发行版本存在,即使使用相同的软件,在不同发行版本中系统配置也可能不一样,这使得发现问题的过程非常难。比如/etc/network/interfaces这个大家非常熟悉的配置文件,来自ifupdown软件包,但经过长久发展interfaces的作用在慢慢消息,但其他功能又都存在。
其次,这种软件包之间的依赖、调用关系复杂,因果关系复杂,使得发现问题的过程异常艰辛。
为什么这个难?
我们都知道Linux发展非常久了,社区一直也繁荣,成果也非常突出。但是,除开发环境,普通消费场景较少见到Linux的普遍应用。
由于本人人事软件开发差不多十年,对软件开发和软件架构也算有点心得。纵观Linux系统,由很多软件堆起来的,功能强大,扩展性强。
但是……
- 配置文件 - 复杂,明明说对绝大多数人适用的配置,却还要写在conf中,零配置的情况几乎为零
- 软件角色 - manager与worker角色不明,软件相互关联、相互影响,严重影响软件使用与问题判断
- 新旧交替 - 软件更新替代界限不明,大量无用代码影响判断
- 功能重叠 - 不同软件功能重叠,相互影响
该怎么做?
有了以上问题,本人就想该怎么做。其实本人一直很想实现以下软件架构
kernel -> systemd(boss) -> networkd(manager) -> dhcpcd+dhcpd+openresolv+dnsmasq+hostapd+…(workers)
networkd实施策略管理(manager),实现状态更新,错误判断,智能分析等,通过调用相关workers执行具体动作:
- 向路由器获取ip/dns等
- 设置本机路由
- 建立wifi ap
- 网络健康分析、智能路由、……
- 提供网络服务(dnsmasq\nginx)
level
- device plug
- interface up - dhcpclient …
- service up - dhcpcd hostapd …
- provider up - dnsmasq nginx …