Please enable Javascript to view the contents

借一次家庭局域网互联探索 - 谈谈互联网原义

 ·  ☕ 6 分钟

image-20240310143521710

图:广州艺术博物馆顶。拍摄于 2024年 2 月

对于大牛,这段内容有点哆嗦唠叨,毕竟读者想看的或者就是个配网方法,而作者想写的竟然是 Internet 历史,不喜可跳过。

我为何要说这些从业者人尽佳知的老概念?因为,对于这些旧技术,我觉得大家现在只记得这个词,而忘记了他们的源。为何而来,从可而来。但这重要吗?So what? 过时的技术本身的直接职业价值与学习付出比的确非常低。对,有时间为何不学点 AI。我之所以这样想,因为我也是这样一路走过来的一名程序员:

  • 国内单机时代(1990 ~ 2000 ):研究 DOS/C++/VC++/Windows/…

  • 国内电信与互联网起步阶段(2000 ~ 2010):研究 Socket/多线程/Java

  • 国内互联网应用、移动应用大爆发期(2010 ~ 2019):Linux/Cloud Native

  • AI (2019 ~ 现在):突然学不动/麻木了

作为一名平凡程序员,搞钱当然重要。但我想作为一个爱思考的人,在那么多波科技浪潮随波逐流、飘飘荡荡后,是不是应该换个高视角,看看这些浪潮的源动力和核心创造力。不要指望这些思考会给现实世界带来什么现实的东西,但如果你觉得思考本身就是个有趣的事情,这个思考方向就会变得很有趣。

有个哲学的专业大师说过。**哲学本质是什么?大概就是思考思考本身的问题。**对于理科生,这个概念可能可以比喻为,微积分之于加减乘除。

最近由于种种原因,需要在旧居和新居之间跑。在旧居中已经和一套网络和设备了。包括一些树莓派主机,一台 Dell 服务器,以及上面运行的服务。人在新居时,需要连接到旧居设备是相当麻烦的事,反之也是。原因大家都知道,因为是两个独立的局域网。

根据伟大的 7 层开放系统交互模型( Open Systems Interconnection model (OSI model) ) ,是否可能连接起两个局域网?

image-20240309225216062

https://en.wikipedia.org/wiki/OSI_model

然后再看看在我们大部分现实世界的事实:

ethernet_model

Network Reference Model - PROFINET University

我不可能在新旧居之间拉一条网线,也不想采用搭建一个软以太网桥的方法,因为这会让广播的行为参与者太多,新居那边有比较多米家的 WIFI 设备。那么就考虑在 IP 层互联吧。这也正是 Internet 的本原。

image-20240310094109044

https://en.wikipedia.org/wiki/Internet

方案

链家组网方案

“链家” 的 Wireguard 组网方案

上面就是我的 “链家” Wireguard 组网方案图。下面说说一点点实现细节片段。 和以前习惯一样,我不会写一个 cookbook ,手把手去教那种。只提一些要点。相信真实施的人是那种已经有相当背景积累,只需要一点点 tips/idea。

方案设计上,raspberry pi 作为 所在LAN 中的所谓旁路由,只负责路由本 LAN 到另一个 LAN 的流量。这个路由的输出当然不是明文的原始 IP 包,是经过 Wireguard 加密的。加密包经过互联网,到达另一个运行 Wireguard 的 raspberry pi 。这个 raspberry pi 解密数据包为标准 IP 包,然后发现是 TCP 请求,于是 sNAT 代理连接到本 LAN 的其它设备。

raspberry pi 的路由与 NAT 配置

首先是让 kernel 打开 ip 路由功能:

1
2
sudo sysctl -w net.ipv4.ip_forward=1
sudo vi /etc/sysctl.conf

然后是 sNAT 了:

 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
26
#!/bin/sh

export LANIF=eth0
export WANIF=wg0

# Default policy to drop all incoming packets.
#iptables -P INPUT DROP
#iptables -P FORWARD DROP

# Accept incoming packets from localhost and the LAN interface.
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i $LANIF -j ACCEPT

# Accept incoming packets from the WAN if the router initiated the connection.
iptables -A INPUT -i $WANIF -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT

# Forward LAN packets to the WAN.
iptables -A FORWARD -i $LANIF -o $WANIF -j ACCEPT

# Forward WAN packets to the LAN if the LAN initiated the connection.
# iptables -A FORWARD -i $WANIF -o $LANIF -m conntrack \
# --ctstate ESTABLISHED,RELATED -j ACCEPT

# NAT traffic going out the WAN interface.
iptables -t nat -A POSTROUTING -o $WANIF -j MASQUERADE

Wireguard 的配置其实也不算难,这里不打算写明白。提一点是,AllowedIPs 的配置

[Peer]
PublicKey = ...
AllowedIPs = .../24, 192.168.2.0/24(对端 LAN IP地址段)
Endpoint = foo.bar.com:port
PersistentKeepalive = 25

它让 Wireguard 加入一条 ip route 规则:

192.168.2.0/24 dev wg0 scope link 

有更完美的方案吗

当然有,为配置方便,上面方案用了 sNAT。这就不是完整意义上的直联了。有点像玩 kubernetes 的 service 时, 用虚拟 service ip 带来的服务端看不到流量原 ip 一样的限制。

另一个是,旁路由 的使用增加了网络配置的复杂性。如果主路由足够强大和可玩,还是直接在主路由做好了。

以后 IPv6 的普及,只从技术面看,或者可以一定程度上解决这个互联问题。但技术再好,也胜不了人为的限制。

结语

技术文章到这里完结了。部分读者可能失望 :)

原始的互联网技术,关注的是信号通道层面的互联。而解决异构物理层的网络,如何互联的问题,是原始的互联网技术的最大创新。大家每天使用平淡无奇的技术,其背后都是设计思想上的突破。技术可能陈旧,但思想突破方法上永远无所谓陈旧。于我看来,原始互联网设计上最大的突破是在保留历史底层协议的原则下,统一上层协议,加上有机融合了路由与适配转换。最终成就了现在的互联网。

现世中,天天听到人说财务自由,但很少人说互联 Freedom。曾经,幻想有了财务自由什么都不重要,不过有时讽刺的事,以前最看不起的价值,在一些时候就会变为最在意的事的最后护城河。要 Free 还是要 Freedom ? To be or not to be ?

 數|拷|升|在|以|網|這|自|內|先|行|免|
 位|貝|級|服|虛|路|交|負|附|買|規|費|
 化|免|到|務|擬| |易|盈|有|一| | |
 類|費|雲|器|友|上|倒|虧|群|送|兩|套|
 比| |端|內|情|網|也| |星|一|廂|餐|
 才| |的|面|按|下|實| |聯|又|情|的|
 對| |規|對|贊|載|惠| |手|下|願|酒|
  | |格|面|來|免| | |跨|殺|無|水|
  | |格|進|奉|費| | |年|再|悔|免|
  | |式|化|陪| | | |夜|送| |費|
  | |化|人| | | | |的|一| | |
  | |輪|類| | | | |票|杯| | |
  | |回| | | | | |兩| | | |
  | | | | | | | |位| | | |
  | | | | | | | | | | | |
 


 又|這|才|用|才|我|付|免|換|她|小|給|
 分|一|爬|特|賺|兢|出|費|來|痴|心|誰|
 期|生|到|價|到|兢|的|很|了|心|哪| |
 要|一|這|清|個|業|駟|貴|薄|真| |那|
 頭|世|市|倉|三|業|馬| |情|意|人|多|
 款|的|場|那|十|要|難| |人|驚|生|情|
 自|月|地|優|多|擔|追| |拋|天|不|笑|
 備|租|位|惠|K|驚| | |走|動|那|容|
  |含| |的| |受| | |的|地|麼|免|
  |稅| |方| |怕| | |落|的|完|費|
  |金| |案| | | | |花|犧|美| |
  | | | | | | | |流|牲| | |
  | | | | | | | |水| | | |
  | | | | | | | | | | | |
  | | | | | | | | | | | |
 


 羅| |大|讓|大|免|救|讓|等|起|血|且|
 大| |家|各|家|費|贖|專|降|飛|拼|浩|
 佑| |一|位|快|萬|給|機|落| |就|浩|
  | |起|都|快|歲|慈|豪| |窗|是|蕩|
 -| |體|能|來| |悲|宅|人|外|要|蕩|
  | |會|體|排| |的|魚|出|的|對|的|
 免| | |會|隊| |鹵|翅|境|風|你|促|
 費| | | | | |肉|超|煙|景|回|銷|
  | | | | | |飯|跑|酒|免|饋|加|
  | | | | | |和|的|免|費| |班|
  | | | | | |礦|原|稅| | | |
  | | | | | |泉|罪| | | | |
  | | | | | |水| | | | | |
  | | | | | | | | | | | |
  | | | | | | | | | | | |
  
分享

Mark Zhu
作者
Mark Zhu
An old developer