【学习VPN之路】路由表

1. 什么是路由表(Routing Table)?

路由表是操作系统或路由器中用于决定数据包应该被发送到哪里(网卡、接口)数据结构

它是一个 查找表,记录了:

  • 不同网络地址(目的地址段)
  • 到这些地址的下一跳(网关)
  • 下一跳的接口(如 en0、tun0 等)
  • 其他辅助信息(如 metric、flags)

2. 路由表解决了什么问题?

  • 核心问题: 网络数据包发出去时,该往哪个接口发?该发给谁?
  • 例如:
    • 当前设备有2个物理网卡,链接者两个不同的网络。当这台设备上的应用程序发送一个IP包,这个IP包应该从哪个网卡中发送呢?路由表就可以帮助操作系统决定用哪个网卡发送。下面是两个网卡的地址和路由表:
      • 网卡 1 (连接到网络 A):192.168.1.100
      • 网卡 2 (连接到网络 B):10.0.0.100
    • 假设该设备的路由表如下所示:
目标网络 子网掩码 网关地址 接口 备注
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 的数据包时,操作系统需要根据路由表来决定哪个网卡用于发送数据包。
      • 检查路由表
        • 首先,它会检查目标地址 10.0.0.150 是否属于路由表中的某个网络。
        • 在此情况下,目标 10.0.0.150 属于 10.0.0.0/8 网络,因此匹配到第二条路由记录。
      • 选择网络接口
        • 根据路由表中的第二条记录,目标地址 10.0.0.15010.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 大型网络自动生成复杂路由表来支持全球互联网路由

相关推荐
z_y_j22997043820 小时前
服务器中使用Docker部署前端项目
服务器·前端·docker·容器
游戏开发爱好者820 小时前
iOS 26 崩溃日志深度解读,获取方式、系统变动、定位策略
android·macos·ios·小程序·uni-app·cocoa·iphone
一直向钱21 小时前
android 基于okhttp 封装一个websocket管理模块,方便开发和使用
android·websocket·okhttp
疯癫的老码农21 小时前
【小白入门docker】创建Spring Boot Hello World应用制作Docker镜像并运行
java·spring boot·分布式·docker·微服务
小刘不想改BUG21 小时前
Docker 部署微服务项目详细步骤
docker·微服务·容器
橄榄熊21 小时前
Docker MySQL 使用全流程
mysql·docker·容器
小趴菜822721 小时前
安卓人机验证View
android·java·前端
ajassi20001 天前
开源 java android app 开发(十七)封库--混淆源码
android·java·开源
邂逅星河浪漫1 天前
【DockerFile+Nginx+DockerCompose】前后端分离式项目部署(docker容器化方式)
nginx·docker·centos·部署·docker-compose·dockerfile·容器化部署
野熊佩骑1 天前
CentOS二进制安装包方式部署K8S集群之系统初始化
运维·docker·微服务·云原生·容器·kubernetes·centos