Phase 1 最后一章。前面你把接口、地址、路由、防火墙、QoS 一个个拆开、亲手操控。这章讲隧道(tunnel)——把一个完整的数据包塞进另一个包里,让它穿过中间的网络。这是 VPN、异地组网、容器跨主机通信的共同底层。而讲完你会发现一个漂亮的收束:隧道再花哨,对 Linux 来说也不过是"又一个接口"——你早就会操控它了。
隧道(tunnel)= 封装(encapsulation):把一个完整的数据包当作载荷,塞进另一个包里发送;到对端再拆开、还原成原始包。中间的网络只看到外层包,看不到里面装的东西。
1隧道是什么:把一个包塞进另一个包
回想 0.1 的封装:每一层给上层数据加一个头(HTTP → TCP → IP → 以太网)。隧道是把这个思路再套一层:一个完整的 IP 包(它自己已经有 IP 头、TCP 头…)整个被当作载荷,外面再包一个新的 IP 头发出去。
1.1.1.1 → 2.2.2.2 隧道头
(WG/GRE)
10.0.0.5 → 10.0.0.9 TCP 数据
为什么要这么干:
- VPN / 异地组网:让两个内网(各自 192.168.x)像在同一个局域网,跨公网互通——把内网包塞进公网包运过去。
- 加密:外层包在公网上传输,里层包可以被加密,中间人只看到一坨密文(WireGuard)。
- 跨越不兼容的网络:比如让二层帧穿过三层网络(VXLAN),或在只有 IPv4 的链路上传 IPv6。
隧道在 Linux 上通常表现为一个虚拟接口(1.1 的 tun/tap 那一类):你把要走隧道的流量路由到这个接口,内核 / 程序就替你做封装、发给对端。所以隧道天然是"接口 + 封装"的组合——记住这句,第 4 节会收束到它。
2WireGuard:现代加密隧道
WireGuard 是一个简洁、快速、内核级的加密隧道:在两端各建一个 wg 接口,用公钥认证 + 现代加密,把流量安全地封装运输。它为什么是现在的首选:
- 简单:全部配置就几行(相比 OpenVPN / IPsec 的繁琐);代码量极小,易审计。
- 快:在内核里实现,用现代加密算法,性能远超 OpenVPN。
- 基于公钥:每个节点(peer)有一对密钥,像 SSH 那样用公钥互认(呼应 0.5 的非对称加密 / TLS 思路)。
核心结构:一个 wg 接口(如 wg0)配自己的私钥 + 一个隧道内网 IP;每个 peer 配它的公钥、公网 Endpoint、以及 AllowedIPs。最小配置(两端各一份):
[Interface]
PrivateKey = <本机私钥>
Address = 10.66.0.1/24
ListenPort = 51820
[Peer]
PublicKey = <对端公钥>
Endpoint = 203.0.113.9:51820
AllowedIPs = 10.66.0.2/32, 192.168.9.0/24
sudo wg-quick up wg0 # 拉起隧道
sudo wg show # 看握手与状态
AllowedIPs 是 WireGuard 最妙也最容易误解的一项,它身兼两职:
- 出方向当路由:去往这些网段的包,被路由进 wg0、发给这个 peer(wg-quick 会自动加对应路由);
- 入方向当过滤:从这个 peer 收到的包,源地址必须落在它的 AllowedIPs 内,否则丢弃。这叫 cryptokey routing(密钥路由)。
你不是信任"某个 IP",而是信任"某把公钥"。谁持有对应私钥,谁就是合法对端——地址可以变(漫游),身份靠密钥。这套非对称加密 + 认证,正是 0.5 TLS 那套思想在 VPN 里的应用。
在路由器上配 WireGuard,就是加一个 wg0 接口 + 若干 peer,再把想走隧道的流量路由过去。本课程 3.4 的"WireGuard mesh"(多个节点两两组网)就是给每台配上彼此的公钥和 AllowedIPs。异地家庭组网、随时回家访问内网 NAS、多地点互联——WireGuard 是当下最省心的方案。
3GRE 与 VXLAN:另外两种隧道
不是所有隧道都加密。另外两种常见的:
GRE — 不加密的裸三层隧道
GRE(Generic Routing Encapsulation):最简单的三层隧道,把 IP 包塞进 GRE + 外层 IP 发走,不加密。常用于两站点间建一条点对点虚拟链路,在上面跑路由协议、或叠加 IPsec 来加密。它只负责封装,不管安全。
sudo ip tunnel add gre1 mode gre remote 203.0.113.9 local 198.51.100.5
sudo ip addr add 10.99.0.1/30 dev gre1
sudo ip link set gre1 up
VXLAN — 把二层帧塞进三层
VXLAN(Virtual Extensible LAN):把整个二层以太网帧(0.2)塞进 UDP + IP 发走——即 L2 over L3,让分处不同三层网络的机器像在同一个二层网段(同一广播域)。回想 1.4:一台机器上的容器靠 namespace + veth + bridge 互通;跨多台物理机时,VXLAN 把各机上的虚拟二层网连成一张"大二层",让容器无视物理位置直接二层通信。每个 VXLAN 段有个 VNI,像 VLAN ID 的加强版(VLAN 只有 4094 个,VNI 有约一千六百万)。
| 隧道 | 封装 | 加密 | 典型场景 |
|---|---|---|---|
| WireGuard | L3 · IP over UDP | ✓ 内建 | VPN、异地组网 |
| GRE | L3 · IP over IP | ✗ | 站点互联、承载路由 / IPsec |
| VXLAN | L2 · 帧 over UDP | ✗ | 数据中心 / 容器覆盖网 |
4隧道的本质 = 接口 + 路由
看穿隧道:无论 WireGuard、GRE 还是 VXLAN,最终都给你一个虚拟接口(wg0 / gre1 / vxlan0)。封装 / 加密是这个接口内部的事;对你来说,操作它和操作 eth0 没区别:
- 配 IP:
ip addr(1.2); - 决定什么流量走它:
ip route/ AllowedIPs(1.2)——去往对端网段的路由指向这个隧道接口,流量就自动被封装送走; - 要分流:
ip rule+ fwmark(1.2 / 1.3);要限速:tc(1.5)。全套照旧适用。
于是 Phase 1 在这里闭环:你学的接口(1.1)、iproute2(1.2)、防火墙(1.3)、namespace(1.4)、tc(1.5),对隧道接口一样管用。隧道不是新东西,是这些基本盘的又一次组合。
回头看:Phase 0 你"看懂"了数据包穿过的每一层;Phase 1 你在一台 Linux 上,把接口、地址、路由、防火墙、流量控制、隔离、隧道——每一样都亲手造了出来、调了个遍。你现在具备的,正是一台路由器内部所需的全部内核能力。Phase 2 换视角:不再是散装的命令,而是去拆一台真实的 OpenWRT 路由器,看它怎么把你手里这些内核能力,用 UCI、netifd、procd、firewall4 组织成一个完整、可配置的系统。
本章小结
- 隧道 = 封装:把整个原始包当载荷塞进外层包(0.1 封装再套一层),穿过中间网络,对端拆封还原。
- WireGuard:简洁、快、内核级的加密隧道;公钥认证(像 SSH,接 0.5);
AllowedIPs身兼"出方向路由 + 入方向过滤"(cryptokey routing)。 - GRE:不加密的裸三层隧道,常作载体;VXLAN:二层帧封进三层(L2 over L3),给容器 / 虚拟机造跨主机大二层(接 1.4 overlay)。
- 隧道的本质:每种都给你一个虚拟接口;配 IP(1.2)、路由到它(1.2)、分流 / 限速(1.3 / 1.5)照旧——隧道只是接口 + 路由的又一次组合。
- Phase 1 完结:一台路由器所需的内核能力,你已全部亲手玩过;Phase 2 去看 OpenWRT 怎么把它们组织成系统。
动手练习
- 画一张"包中包"示意:给定原始包
10.0.0.5→10.0.0.9、隧道两端公网1.1.1.1 / 2.2.2.2,写出封装后外层 IP 头的源 / 目的,并说明中间路由器看到的是哪一层。 - (有两台机器或两个 namespace 时)配一对 WireGuard:各生成密钥、互填公钥、设 AllowedIPs,
wg-quick up后互 ping 隧道内网 IP;wg show看握手。 - 思考题:WireGuard 的 AllowedIPs 同时起了路由和过滤两个作用,分别是什么?若把某 peer 的 AllowedIPs 设成
0.0.0.0/0会怎样?(提示:所有流量都路由进隧道 = 全局 VPN。) - 进阶:结合本章和 1.4——想让两台不同物理机上的容器像在同一个二层网里互通,该用哪种隧道?为什么不是 WireGuard 或 GRE?(提示:你要的是"二层"打通。)