当前位置: 首页 > news >正文

(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
  1. 检查目标 8.8.8.8
  2. 不匹配直连路由 192.168.136.0/24
  3. 匹配默认路由 default
  4. 通过 ens33 接口发送到网关 192.168.136.2
  5. 源IP:使用 192.168.136.128

场景2:访问局域网

ping 192.168.136.50
  1. 检查目标 192.168.136.50
  2. 匹配直连路由 192.168.136.0/24
  3. 直接在 ens33 接口上发送(ARP获取MAC地址)
  4. 源IP:使用 192.168.136.128

场景3:访问本机

ping 192.168.136.128
  1. 检查目标 192.168.136.128
  2. 系统识别这是本机IP
  3. 不经过路由表,直接内部处理

验证实验

# 查看详细路由信息
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

关键概念总结

  1. 默认路由:网络世界的"出口",处理所有未知目标
  2. 直连路由:局域网通信的"捷径",不需要网关
  3. 度量值(metric):路由的"优先级",决定多条路由的选择
  4. 源地址选择(src):多网卡环境下的"身份标识",确保响应正确返回
  5. 作用域(scope):路由的"有效范围",link表示仅在同一网段有效

实战

阶段1:创建和配置虚拟接口

步骤1-2:创建 dummy 接口
sudo ip link add dummy0 type dummy
sudo ip link add dummy1 type dummy

效果:

  • 创建了两个虚拟网络接口 dummy0dummy1
  • 接口状态: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

注意第一个输出中的 localdev lo,这表示走的是本地回环!

总结

核心区别表:

方面设置IP后ping设置路由后ping
目标性质本机IP外部IP
处理位置内核内部通过网络接口
ARP需求不需要需要
通信类型自环通信网络通信
依赖条件只需IP配置需要真实目标存在

根本原因:

  • 设置IP:通信目标是"自己" → 内核直接处理
  • 设置路由:通信目标是"别人" → 需要真实网络通信 → 但"别人"不存在
http://www.dtcms.com/a/500397.html

相关文章:

  • 电商网站开发需要掌握哪些知识技能设计一个企业网站报价
  • 做平面资源比较好的网站安卓优化清理大师
  • 公司做网站好豌豆荚应用商店
  • C++----继承
  • 制作表白网站的软件长链接转化成短链接
  • 服装网站的设计理念wordpress 知识库模板
  • SAP_MM_供应商寄售 ( Vendor Consignment ) 实施流程
  • HTML的盒子模型
  • 九狐建设网站做58网站怎么赚钱
  • 股骨转子间骨折
  • 怎么破解别人做的付费网站互联网保险的定义
  • 泰州网站建设费用福建建设厅网站 资质
  • 做网站潍坊绍兴网站建设解决方案
  • 商城形式的网站需要多少钱wordpress single page
  • wordpress怎么给网站设置几种语言网站建设一般多少钱要如何选择
  • 实用设计网站推荐撰写网络推广策划案
  • 昆明网站seo多少钱网站关键字 优帮云
  • Effective STL 第5条:区间成员函数优先于单元素成员函数
  • app开发与网站建设难度四川省建设厅官方网站扣分记录
  • 参考效果图网站建设网站挣钱
  • 网站建设中网站图片如何修改1688官网商家版
  • 游戏网站免费入口已申请域名怎么做网站
  • 苏州网站推广去苏州聚尚网络做网站公司找哪家
  • php 网站 教程wordpress文章id连续
  • Redis 自动化脚本安装方案
  • 建站的cms哪个网站做图找图片
  • 网站域名续费后SEO查询未更换科技小巨人申报条件
  • python super【python】
  • python迭代器解包【python】
  • 企业网站建设渠道外贸网站建设报价表