1. 什么是路由表(Routing Table)?
路由表是操作系统或路由器中用于决定数据包应该被发送到哪里(网卡、接口) 的数据结构。
它是一个 查找表,记录了:
- 不同网络地址(目的地址段)
- 到这些地址的下一跳(网关)
- 下一跳的接口(如 en0、tun0 等)
- 其他辅助信息(如 metric、flags)
2. 路由表解决了什么问题?
- 核心问题: 网络数据包发出去时,该往哪个接口发?该发给谁?
- 例如:
-
- 当前设备有2个物理网卡,链接者两个不同的网络。当这台设备上的应用程序发送一个IP包,这个IP包应该从哪个网卡中发送呢?路由表就可以帮助操作系统决定用哪个网卡发送。下面是两个网卡的地址和路由表:
-
-
- 网卡 1 (连接到网络 A):
192.168.1.100
- 网卡 2 (连接到网络 B):
10.0.0.100
- 网卡 1 (连接到网络 A):
-
-
- 假设该设备的路由表如下所示:
目标网络 | 子网掩码 | 网关地址 | 接口 | 备注 |
---|---|---|---|---|
192.168.1.0 | 255.255.255.0 | 直接连接 | eth0 | 目标网络 192.168.1.0/24 :这个网络是直接连接的,意味着任何发送到这个子网的数据包都应该通过 网卡 eth0(连接到网络 A)发送。 |
10.0.0.0 | 255.0.0.0 | 直接连接 | eth1 | 目标网络 10.0.0.0/8 :这个网络也是直接连接的,数据包应该通过 网卡 eth1(连接到网络 B)发送。 |
0.0.0.0 | 0.0.0.0 | 192.168.1.1 | eth0 | 默认路由 0.0.0.0/0 :这个路由表示,当数据包的目标不在前两个网络中时(例如访问外部互联网),数据包应该通过 网卡 eth0 发送,并且需要经过网关 192.168.1.1 。 |
-
- 当设备的应用程序需要发送一个目标 IP 为
10.0.0.150
的数据包时,操作系统需要根据路由表来决定哪个网卡用于发送数据包。
- 当设备的应用程序需要发送一个目标 IP 为
-
-
- 检查路由表:
-
-
-
-
- 首先,它会检查目标地址
10.0.0.150
是否属于路由表中的某个网络。 - 在此情况下,目标
10.0.0.150
属于 10.0.0.0/8 网络,因此匹配到第二条路由记录。
- 首先,它会检查目标地址
-
-
-
-
- 选择网络接口:
-
-
-
-
- 根据路由表中的第二条记录,目标地址
10.0.0.150
在 10.0.0.0/8 网络内,因此它应该通过 网卡 eth1(连接到网络 B)发送。
- 根据路由表中的第二条记录,目标地址
-
-
-
-
- 数据包转发:
-
-
-
-
- 由于
10.0.0.0/8
网络是直接连接的,操作系统将直接通过 eth1 将数据包发送出去。
- 由于
-
-
3. 路由表在VPN中的应用
3.1. wireguard客户端
wg客户端需要拦截所有的发往外网的IP包,需要建立一个tun虚拟网卡,比如名字是utun5网卡(IP 192.168.3.1/16)。然后再建立一个路由规则:
目标网络 | 子网掩码 | 网关 | 接口 |
---|---|---|---|
0.0.0.0 | 0.0.0.0 | 192.168.1.1 | utun5 |
那么发往外网的全部IP包都传给utun5发送,而tun网卡可以让开发者在用户空间拦截到这些IP包,并做相应的业务逻辑。这里需要注意被拦截的IP包的源IP被设置为utun5的IP地址,也就是192.168.3.1。
3.2. wireguard后端
wg后端需要拦截所有目标服务器的响应IP包,然后将拦截的IP包转发给wg客户端。比如tun网卡utun5的IP地址为10.0.0.1/16,转发发的客户端IP的源IP是虚拟IP 10.0.0.2。当目标服务器返回的IP包经过wg后端OS的NET服务后,IP的目标IP被转换为10.0.0.2,这个IP就会命中下面的路由规则:
目标网络 | 子网掩码 | 网关 | 接口 |
---|---|---|---|
10.0.0.1 | 255.255.0.0 | utun5 |
这个IP就会被转给utun5接口,然后ip包就会被wg拦截到。
4. 路由表在哪些场景下使用?
✅ 操作系统层的常见使用场景:
场景 | 路由表的作用 |
---|---|
📱 应用程序访问互联网 | 系统查路由表决定数据包要从哪张网卡(如 en0)发出,是否通过网关转发 |
🔁 回环通信(127.0.0.1) | 路由表中指定 127.0.0.0/8 的数据包走 lo0 (loopback)接口 |
🌐 多网卡设备 | 路由表用于区分数据包该从 Wi-Fi、以太网、还是 VPN 发出 |
🔒 VPN/TUN 应用 | 拦截系统数据包后,转发给虚拟网卡(如 tun0),实现加密/代理等功能 |
🛜 本机网络服务监听 | 系统判断是本地连接(走 lo0)还是远程连接(走 en0/tun0) |
✅ 网络设备(如路由器)中的使用场景:
场景 | 路由表的作用 |
---|---|
🛣️ 网络转发(L3 路由) | 路由器转发来自其它网络的数据包,查表决定往哪个下一跳发 |
🔁 连接多个子网 | 路由器连接 192.168.1.0/24 和 10.0.0.0/24,就需要路由表条目区分 |
📶 家庭网关 | 家用路由器转发内网设备的数据到公网 ISP 网关 |
📡 BGP/OSPF | 大型网络自动生成复杂路由表来支持全球互联网路由 |