(2)路由表
路由表分析
keson@ubuntu24:~$ ip route show
default via 192.168.136.2 dev ens33 proto dhcp src 192.168.136.128 metric 100
192.168.136.0/24 dev ens33 proto kernel scope link src 192.168.136.128 metric 100
1. 默认路由 (Default Route)
default via 192.168.136.2 dev ens33 proto dhcp src 192.168.136.128 metric 100
各字段解析:
-
default
=0.0.0.0/0
- 匹配所有目标地址的通用路由
- 当没有更具体路由时的备用路由
-
via 192.168.136.2
- 下一跳网关地址
- 数据包要发送到的路由器IP
-
dev ens33
- 出口网络接口
- 数据包通过 ens33 网卡发出
-
proto dhcp
- 路由来源协议
- 表示这条路由是通过 DHCP 自动获取的
-
src 192.168.136.128
- 源地址选择:当使用这条路由时,默认使用这个源IP地址
- 确保从该接口发出的数据包使用正确的源IP
-
metric 100
- 路由度量值:优先级指标
- 数值越小优先级越高
- 当有多条到相同目标的路由时,选择 metric 值小的
2. 直连路由 (Direct Route)
192.168.136.0/24 dev ens33 proto kernel scope link src 192.168.136.128 metric 100
各字段解析:
-
192.168.136.0/24
- 目标网络地址和子网掩码
- 匹配 192.168.136.1 - 192.168.136.254 的所有地址
-
dev ens33
- 直接连接的接口
- 不需要网关,直接在局域网内通信
-
proto kernel
- 路由来源:内核自动生成
- 当给接口配置IP地址时,内核自动创建对应的直连路由
-
scope link
- 作用域:链路本地
- 表示目标在同一物理网络段内
-
src 192.168.136.128
- 源地址选择:发送到该网络的数据包使用这个源IP
-
metric 100
- 度量值:与默认路由相同
路由决策过程示例
场景1:访问互联网
ping 8.8.8.8
- 检查目标 8.8.8.8
- 不匹配直连路由 192.168.136.0/24
- 匹配默认路由
default
- 通过 ens33 接口发送到网关 192.168.136.2
- 源IP:使用 192.168.136.128
场景2:访问局域网
ping 192.168.136.50
- 检查目标 192.168.136.50
- 匹配直连路由 192.168.136.0/24
- 直接在 ens33 接口上发送(ARP获取MAC地址)
- 源IP:使用 192.168.136.128
场景3:访问本机
ping 192.168.136.128
- 检查目标 192.168.136.128
- 系统识别这是本机IP
- 不经过路由表,直接内部处理
验证实验
# 查看详细路由信息
ip route get 8.8.8.8
# 输出:8.8.8.8 via 192.168.136.2 dev ens33 src 192.168.136.128 uid 1000ip route get 192.168.136.50
# 输出:192.168.136.50 dev ens33 src 192.168.136.128 uid 1000# 查看所有路由表(包括本地路由)
ip route show table all# 查看路由缓存
ip route show cache
关键概念总结
- 默认路由:网络世界的"出口",处理所有未知目标
- 直连路由:局域网通信的"捷径",不需要网关
- 度量值(metric):路由的"优先级",决定多条路由的选择
- 源地址选择(src):多网卡环境下的"身份标识",确保响应正确返回
- 作用域(scope):路由的"有效范围",link表示仅在同一网段有效
实战
阶段1:创建和配置虚拟接口
步骤1-2:创建 dummy 接口
sudo ip link add dummy0 type dummy
sudo ip link add dummy1 type dummy
效果:
- 创建了两个虚拟网络接口
dummy0
和dummy1
- 接口状态:
DOWN
(未激活) - 生成了随机的 MAC 地址
- 在系统网络设备列表中可见
步骤3-4:激活接口
sudo ip link set dummy0 up
sudo ip link set dummy1 up
效果:
- 接口状态变为:
UP, LOWER_UP
- 可以开始收发数据包
- 自动生成 IPv6 链路本地地址(fe80::/64)
步骤5-6:分配 IP 地址
sudo ip addr add 172.16.1.51/24 dev dummy0
sudo ip addr add 192.168.10.10/24 dev dummy1
效果:
- 为每个接口分配了 IPv4 地址
- 自动生成直连路由(这是关键效果!)
阶段2:验证配置
查看接口状态
ip addr show dummy0
ip addr show dummy1
输出效果:
3: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWNlink/ether 36:e2:3d:df:95:32 brd ff:ff:ff:ff:ff:ffinet 172.16.1.51/24 scope global dummy0 ← IPv4 地址inet6 fe80::34e2:3dff:fedf:9532/64 scope link ← 自动生成的 IPv6
查看路由表
ip route show
效果:新增了两条直连路由
172.16.1.0/24 dev dummy0 proto kernel scope link src 172.16.1.51
192.168.10.0/24 dev dummy1 proto kernel scope link src 192.168.10.10
关键点:
proto kernel
:内核自动生成scope link
:直连网络作用域src
:自动设置的源地址
阶段3:测试连通性
Ping 测试
ping -c 2 172.16.1.51
ping -c 2 192.168.10.10
效果:
- 两个 IP 都能 ping 通
- 数据包在内核网络栈内部处理
- 不依赖物理网络硬件
阶段4:高级路由实验
步骤1:添加静态路由到不同网段
sudo ip route add 172.16.2.0/24 dev dummy0
效果:
- 路由表新增:
172.16.2.0/24 dev dummy0 scope link
- 注意:这是
proto static
(手动添加),不是proto kernel
步骤2:验证路由决策
ip route get 172.16.2.88
输出:
172.16.2.88 dev dummy0 src 172.16.1.51 uid 1000cache
效果:
- 系统知道通过
dummy0
发送到 172.16.2.88 - 源地址选择:
172.16.1.51
- 但 ping 失败:因为目标网络没有真实主机
步骤3:添加带网关的路由(使用 onlink)
sudo ip route add 10.10.0.0/16 via 192.168.10.1 dev dummy1 onlink
效果:
- 路由表新增:
10.10.0.0/16 via 192.168.10.1 dev dummy1 onlink
onlink
:强制接受网关,跳过可达性检查
步骤4:验证路由决策
ip route get 10.10.5.66
输出:
10.10.5.66 via 192.168.10.1 dev dummy1 src 192.168.10.10 uid 1000cache
效果:
- 系统选择通过
dummy1
,网关192.168.10.1
- 源地址:
192.168.10.10
- 但 ping 失败:网关不存在
阶段5:清理操作
步骤1:删除静态路由
sudo ip route del 172.16.2.0/24 dev dummy0
sudo ip route del 10.10.0.0/16
效果:
- 手动添加的静态路由被移除
- 路由表恢复为只有自动生成的直连路由
步骤2:关闭接口
sudo ip link set dummy0 down
sudo ip link set dummy1 down
效果:
- 接口状态变为
DOWN
- 重要发现:直连路由仍然存在!
- 但接口无法收发数据包
步骤3:删除接口
sudo ip link delete dummy0
sudo ip link delete dummy1
效果:
- 接口从系统中完全移除
- 所有相关路由自动删除
- 路由表恢复到初始状态
关键学习点总结
1. 自动路由生成机制
- 配置 IP 地址 → 自动生成直连路由
- 标记为
proto kernel scope link
2. 接口状态 vs 路由
- 接口
DOWN
:路由仍然存在 - 接口删除:路由自动清除
3. 路由类型识别
proto kernel
:内核自动生成(直连路由)proto static
:手动添加(静态路由)proto dhcp
:DHCP 客户端添加
4. 源地址选择
- 系统自动选择最合适的源 IP
- 基于路由表的
src
参数
5. 虚拟接口特性
- 本地通信,不依赖物理网络
- 即使接口 DOWN,本地 IP 仍可 ping 通
- 用于测试和开发环境
onlink
的作用机制
没有 onlink
:
数据包 → 路由表 → 需要网关 192.168.10.1 → ARP查询 → 无响应 → 失败
有 onlink
:
数据包 → 路由表 → 需要网关 192.168.10.1 → 跳过ARP检查 → 直接通过 dummy1 发送
这是一个非常好的问题!让我详细解释为什么设置IP能ping通,但设置路由却ping不通的根本原因。
为什么给网卡设置ip的时候可以ping通,但是给这个路由设置路由表,也通过dummy转发,却ping不了呢
核心区别:通信目标的性质
情况1:设置IP地址后ping通
# 设置IP
sudo ip addr add 172.16.1.51/24 dev dummy0
ping 172.16.1.51
情况2:设置路由后ping不通
# 设置路由
sudo ip route add 172.16.2.0/24 dev dummy0
ping 172.16.2.5
详细技术分析
1. 设置IP地址的通信流程
当你执行 ping 172.16.1.51
:
应用层 (ping命令)↓
传输层 (ICMP请求)↓
网络层 (IP处理)↓ 关键判断!→ 目标IP 172.16.1.51 == 本机配置的IP→ 识别为"本地通信"↓
内核网络栈内部处理 ← 不经过接口!↓
直接生成ICMP响应↓
返回给ping进程
关键点:
- 目标IP是本机IP:内核识别为自环通信
- 不经过网络接口:完全在内核内部处理
- 不依赖ARP:不需要地址解析
- 接口状态无关:即使接口DOWN也能通
2. 设置路由的通信流程
当你执行 ping 172.16.2.5
:
应用层 (ping命令)↓
传输层 (ICMP请求)↓
网络层 (IP处理 + 路由查找)↓ 路由表查询!→ 匹配路由:172.16.2.0/24 dev dummy0→ 选择源IP:172.16.1.51↓
数据链路层 (ARP查询)↓ 关键问题!→ 目标IP 172.16.2.5 不在本地→ 需要ARP解析 172.16.2.5 的MAC地址↓
ARP请求广播:Who has 172.16.2.5?↓
无响应 ← 因为172.16.2.5不存在!↓
ARP超时,通信失败
根本原因对比
设置IP能通的根本原因:
# 这是"自己跟自己说话"
ping 172.16.1.51 → 目标就是本机 → 内核直接响应
设置路由不通的根本原因:
# 这是"试图跟别人说话,但别人不存在"
ping 172.16.2.5 → 目标不是本机 → 需要真实通信 → 失败
验证实验
让我们用实际命令验证这个分析:
实验1:查看ARP表
# 在ping之前查看ARP表
arp -n# ping 本机IP
ping -c 1 172.16.1.51
arp -n # 不会有172.16.1.51的ARP条目!# ping 外部IP
ping -c 1 172.16.2.5
arp -n # 会看到对172.16.2.5的ARP查询!
实验2:使用tcpdump抓包
# 在另一个终端抓包
sudo tcpdump -i dummy0 -n# 然后ping
ping -c 1 172.16.1.51 # 应该看不到任何数据包!
ping -c 1 172.16.2.5 # 会看到ARP请求!
实验3:查看路由决策细节
# 查看详细的路由决策过程
ip route get 172.16.1.51
# 输出:local 172.16.1.51 dev lo src 172.16.1.51 uid 1000ip route get 172.16.2.5
# 输出:172.16.2.5 dev dummy0 src 172.16.1.51 uid 1000
注意第一个输出中的 local
和 dev lo
,这表示走的是本地回环!
总结
核心区别表:
方面 | 设置IP后ping | 设置路由后ping |
---|---|---|
目标性质 | 本机IP | 外部IP |
处理位置 | 内核内部 | 通过网络接口 |
ARP需求 | 不需要 | 需要 |
通信类型 | 自环通信 | 网络通信 |
依赖条件 | 只需IP配置 | 需要真实目标存在 |
根本原因:
- 设置IP:通信目标是"自己" → 内核直接处理
- 设置路由:通信目标是"别人" → 需要真实网络通信 → 但"别人"不存在