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

linux vrf icmp reply /vrf icmp 响应错误消息

static inline void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
{__icmp_send(skb_in, type, code, info, IPCB(skb_in));
}

  

static inline void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
{__icmp_send(skb_in, type, code, info, IPCB(skb_in));
}

  

内核协议栈中:

  ip_rcv_coreIPCB(skb)->iif = skb->skb_iif;vrf_ip_rcvskb->dev = vrf_dev;skb->skb_iif = vrf_dev->ifindex;IPCB(skb)->flags |= IPSKB_L3SLAVE;
  • 保存现场: 当数据包刚被网卡接收时,ip_rcv_core 会立即把当前的入接口索引(skb->skb_iif)备份到控制块(IPCB(skb)->iif)中。

  • VRF 干扰: 随后,如果配置了 VRF,VRF 驱动(drivers/net/vrf.c)会接管数据包,并修改 skb->skb_iif 为 VRF 虚拟设备的索引。

  • 恢复现场: 当需要发送 ICMP 错误消息时(比如在 icmp.c 中),skb->skb_iif 已经被改写了,不再是物理接口。这时,代码就会去读之前备份在 parm->iif 中的原始值,从而向正确的接口报告错误。

  当内核生成 ICMP 错误消息时,它去读 skb->skb_iif,读到的是 VRF 设备。结果就是,ICMP 消息的源 IP 变成了 VRF 设备的 IP(或者 VRF 下其他端口的 IP),而不是真正接收数据包的物理接口 IP。

  运行 traceroute 时,显示的路径节点 IP 是错的

 

bugfix:

  • 核心逻辑: 不要直接读取已经被 VRF 修改过的 skb->skb_iif

  • 新方法: 改为读取**控制块(Control Block)**中的 iif 字段。

 

http://www.jsqmd.com/news/71126/

相关文章:

  • 常见八大排序算法介绍(冒泡排序、插入排序、归并排序、计数排序、选择排序、快速排序、堆排序、希尔排序)
  • 自媒体怎么做到批量自动发文?亲测AI智能媒体助理更稳定
  • 第五十天
  • Ansible学习----管理复杂的 Play 和 Playbook 内容 - 教程
  • day3 Java基础
  • Typora最后的免费版本
  • 解决 Chrome 下载 `.crx` 文件被自动删除及“无法安装扩展程序,因为它使用了不受支持的清单版本”难题
  • 多平台批量发布文章的软件哪个好?我选AI智能媒体助理的原因
  • 你的接口很好,但在使用者眼里,它可能只是个打不开的黑盒
  • 第五十一天
  • python —— 满二叉树的构建
  • 2025 最新箱包五金配件厂家 TOP5 评测!高端定制 + 全链服务权威榜单发布,技术赋能重构箱包五金生态 - 全局中转站
  • 1010000
  • 完整教程:Prefix-Tuning:大语言模型的高效微调新范式
  • PPT: Pre-trained Prompt Tuning - 预训练提示调优详解 - 教程
  • python —— 使用hash函数实现类似字典功能的值的存取操作
  • 2025 最新不锈钢五金厂家TOP5 评测!技术赋能 + 品质保障权威榜单发布,匠心打造高端五金解决方案 - 全局中转站
  • 1001110
  • 1001000
  • 1001010
  • 1001100
  • 1001001
  • 1001101
  • 1000010
  • 1001111
  • 1000111
  • 1000100
  • 字符串转换
  • 博客园格式复制与处理方法
  • 2025 最新高端五金辅料厂家TOP5 评测!箱包等高端五金配件优质供应商,品质铸就 + 定制赋能权威榜单发布,技术创新引领行业新生态 - 全局中转站