起因:

最近在完成网关的一个相关功能时,对于网关本身通过socket发送的数据包,没有从正确的wan接口发送出去,但是在udp_sendmsg

函数里打印出来的

信息显示路由查找是正确的,但是当数据包进入OUTPUT HOOK点的hook函数处理后,其路由缓存就发生了变化,难道netfilter模块还

会修改数据包的路由缓存吗?

本文主要是因为上面所说的问题而进行分析的,其实也就是自己阅读netfilter的代码不够仔细,导致没有注意到netfilter模块也会改变数据包的

路由缓存,

所以本文以此命题,以提醒自己。

1. 修改数据包路由缓存的case

修改数据包的路由缓存,按模块来分,可分为两个方面

NAT模块:

a)在PRE_ROUTING链,当修改了数据包的目的地址后,若数据包的dst指针不为空,则需要release该dst指针,迫使协议栈重新查找路由

(但是这个查找路由还是由协议栈实现的)。

b)在OUTPUT链,当修改了数据包的目的地址后,由于此时的数据包已经进行了路由查找,接下来协议栈也不会再进行路由查找,所以此时

就会调用ip_route_me_harder重新查找路由,这次查找就由netfilter模块代劳了 MANGLE模块

a)在OUTPUT链,当修改了数据包的源ip地址/目的ip地址/tos/mark后,则会调用函数ip_route_me_harder

综上,可以发现。当netfilter模块修改了数据包的ip地址、tos或者mark后,若是后续协议栈还会进行路由查找,则netfilter模块只是将数据包的dst指针

设置为空; 若后续协议栈不再进行路由查找了,则netfilter模块则会自己调用路由查找函数,为数据包重新查找路由。

例如,当我们在mangle表的OUTPUT链,增加了一个修改数据包的mark值的规则后,就需要小心了,如果我们使用了策略路由,增加了策略规

则参数,但是ip_route_me_harder里却没有在flowi的查找变量里增加对该变量的设置后,就可能使策略路由匹配出错。

在我实现的功能里,就在策略规则里增加了新的判断成员,但是仅仅考虑了协议栈中路由查找的函数,却忘了在netfilter模块的路由查找函数里也

增加对该成员的判断,从而对本地发出的数据包,出现策略路由匹配失败的问题。

也怪自己没有对路由代码有一个全面的分析,对于路由查找还不是很熟悉,后面会开始学习路由。

linux netfilter路由表,Linux netfilter 学习笔记 之十四 netfilter模块会修改数据包关联的路由缓存吗...相关推荐

  1. TensorFlow学习笔记(十四)TensorFLow 用mnist数据做classification

    之前的例子,给的都是tf来做regression,也就是回归问题,现在用tf来做一个classification的处理,也就是分类问题. 这里用的数据集是mnist数据. 代码: "&quo ...

  2. Cty的Linux学习笔记(十四)

    Linux学习笔记--第十四篇 环境变量配置文件: /etc/profile:预设了几个重要的变量,例如PATH,USER,LOGNAME,MAIL,INPUTRC,HOSTNAME,HISTSIZE ...

  3. Windows保护模式学习笔记(十四)—— 阶段测试

    Windows保护模式学习笔记(十四)-- 阶段测试 题目一 解题步骤 题目二 解题步骤 题目一 描述:给定一个线性地址,和长度,读取内容 int ReadMemory(OUT BYTE* buffe ...

  4. OpenCV学习笔记(十四):重映射:remap( )

    OpenCV学习笔记(十四):重映射:remap( ) 图像的坐标映射是通过原图像与目标图像之间建立一种映射关系,这种映射关系有两种,一种是计算原图像任意像素在映射后图像的坐标位置,另一种是计算变换后 ...

  5. QT学习笔记(十四):QLayout的属性介绍

    QT学习笔记(十四):QLayout的属性介绍 主要包括QBoxLayout.和QGridLayout以及QFormLayout等的参数类似. 我主要说明一下QGridLayout在QtDesigne ...

  6. MATLAB学习笔记(十四)

    MATLAB学习笔记(十四) 一.线性方程组求解 1.1 直接法 1.1.1 利用左除运算符 1.1.2 利用矩阵分解 1.2 迭代法 1.2.1 雅可比(Jacobi)迭代法 1.2.2 高斯-赛德 ...

  7. python数据挖掘学习笔记】十四.Scipy调用curve_fit实现曲线拟合

    #2018-03-28 10:02:08 March Wednesday the 13 week, the 087 day SZ SSMR python数据挖掘学习笔记]十四.Scipy调用curve ...

  8. Spring Security技术栈学习笔记(十四)使用Spring Social集成QQ登录验证方式

    上一篇文章<Spring Security技术栈开发企业级认证与授权(十三)Spring Social集成第三方登录验证开发流程介绍>主要是介绍了OAuth2协议的基本内容以及Spring ...

  9. 深度学习笔记(十四)—— 超参数优化[Hyperparameter Optimization]

      这是深度学习笔记第十四篇,完整的笔记目录可以点击这里查看.      训练神经网络会涉及到许多超参数设置.神经网络中最常见的超参数包括: the initial learning rate lea ...

最新文章

  1. Socketserver 笔记
  2. 多任务学习(Multi-Task Learning, MTL)、其他分类形式、与迁移学习的关系
  3. 使用FIO对SATA、SSD和PCIe Flash进行测试
  4. SpringMVC运行流程分析
  5. 长度最小的子数组--滑动窗口
  6. 雅诗兰黛天猫超级品牌日:未央唇膏、红装小棕瓶“当红不让”
  7. 访问修饰符,封装,继承
  8. i++和++i作为参数时的编译器处理方式分析
  9. Springboot打jar包项目无法访问jsp问题解决
  10. Docker-compose编排微服务顺序启动解决方案
  11. ArcGIS 后台服务器抛出异常
  12. 安阳工学院ACM历史(续)
  13. 【数据】社区发现数据集
  14. Encoded password does not look like BCrypt的原因及解决办法
  15. powerbuilder建数据库
  16. vue项目通讯录_vue 自定义组件实现通讯录功能
  17. Markdown 教程: 1 数学公式和特殊符号
  18. 文字图片水平居中对齐
  19. IPv6 路由信息查看命令
  20. MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引

热门文章

  1. 华为的JAVA面试题及答案(部分)
  2. Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能
  3. 【BZOJ1406】【codevs2478】密码箱,数论练习
  4. 【BZOJ1082】【codevs2456】栅栏,让人抓狂的优化剪枝
  5. 2017.9.9 堵塞的交通 思考记录
  6. 【Level 08】U07 Mixed Feelings L1 Day trip
  7. 【英语学习】【WOTD】accolade 释义/词源/示例
  8. 【英语学习】【WOTD】sentient 释义/词源/示例
  9. js如何提高for循环的效率_如何提高rv减速机的散热效率
  10. 开源资产管理系统_部署开源夜莺运维监控平台V3版本