反向路径过滤——reverse path filter

一、原理

先介绍个非对称路由的概念

参考《Understanding Linux Network Internals》三十章,

30.2. Essential Elements of Routing

Symmetric routes and asymmetric routes

Usually, the route taken from Host A to Host B is the same as the route used to get back from Host B to Host A; the route is then called symmetric . In complex setups, the route back may be different; in this case, it is asymmetric.

关于反向路径过滤,参考《Understanding Linux Network Internals》三十一章,

31.7. Reverse Path Filtering

We saw what an asymmetric route is in the section "Essential Elements of Routing in Chapter 30. Asymmetric routes are not common, but may be necessary in certain cases. The default behavior of Linux is to consider asymmetric routing suspicious and therefore to drop any packet whose source IP address is not reachable through the device the packet was received from, according to the routing table.

However, this behavior can be tuned via /proc on a per-device basis, as we will see in Chapter 36. See also the section "Input Routing" in Chapter 35.

二、检查流程

如果一台主机(或路由器)从接口A收到一个包,其源地址和目的地址分别是10.3.0.2和10.2.0.2,

即, 如果启用反向路径过滤功能,它就会以为关键字去查找路由表,如果得到的输出接口不为A,则认为反向路径过滤检查失败,它就会丢弃该包。

关于反向路径过滤,ipv4中有个参数,这个参数的说明在Documentation/networking/ip-sysctl.txt中。

rp_filter - INTEGER

0 - No source validation.

1 - Strict mode as defined in RFC3704 Strict Reverse Path

Each incoming packet is tested against the FIB and if the interface

is not the best reverse path the packet check will fail.

By default failed packets are discarded.

2 - Loose mode as defined in RFC3704 Loose Reverse Path

Each incoming packet's source address is also tested against the FIB

and if the source address is not reachable via any interface

the packet check will fail.

Current recommended practice in RFC3704 is to enable strict mode

to prevent IP spoofing from DDos attacks. If using asymmetric routing

or other complicated routing, then loose mode is recommended.

The max value from conf/{all,interface}/rp_filter is used

when doing source validation on the {interface}.

Default value is 0. Note that some distributions enable it

in startup scripts.

三、源代码分析

git commit 373da0a2a33018d560afcb2c77f8842985d79594

net/ipv4/fib_frontend.c

192 int fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst, u8 tos,

193                         int oif, struct net_device *dev, __be32 *spec_dst,

194                         u32 *itag)

195 {

// 是否启用反向路径过滤

216         /* Ignore rp_filter for packets protected by IPsec. */

217         rpf = secpath_exists(skb) ? 0 : IN_DEV_RPFILTER(in_dev);

// 检查路由表

// 注意这里的源地址贺目的地址是反过来的,

// 看看其他函数是如何调用fib_validate_source()就明白了。

227         if (fib_lookup(net, &fl4, &res))

228                 goto last_resort;

// 运行到这里,说明反向路由是可达的

// 下面分成两种情况检查输出设备是否就是输入设备

237 #ifdef CONFIG_IP_ROUTE_MULTIPATH

// 启用多路径时,任意一个匹配,就用它了

238         for (ret = 0; ret < res.fi->fib_nhs; ret++) {

239                 struct fib_nh *nh = &res.fi->fib_nh[ret];

240

241                 if (nh->nh_dev == dev) {

242                         dev_match = true;

243                         break;

244                 }

245         }

246 #else

247         if (FIB_RES_DEV(res) == dev)

248                 dev_match = true;

249 #endif

250         if (dev_match) {

// 反向路径过滤检查成功了,返回

251                 ret = FIB_RES_NH(res).nh_scope >= RT_SCOPE_HOST;

252                 return ret;

253         }

254         if (no_addr)

255                 goto last_resort;

// 运行到这里,说明反向路径检查是失败的,

// 如果rpf为1,表示反向路径检查必须成功才能正常返回,

// 否则只好返回错误。

256         if (rpf == 1)

257                 goto e_rpf;

278 e_rpf:

279         return -EXDEV;

四、实例

本网络有三台机器,R1, R2 和PC,子网掩码都是255.255.0.0。

R2 (10.1.0.2) ---- (10.1.0.1) R1 (10.3.0.1) ---- (10.3.0.2) PC

R2 (10.2.0.2) ---- (10.2.0.1) R1

注意,设置R2的默认路由为10.1.0.1

现在,从PC上能够ping通10.1.0.2,但是ping不通10.2.0.2。

tcpdump显示,R2接到icmp request,但是不发送icmp reply。

PC

$ ip a

inet 10.3.0.2/16 brd 10.3.255.255 scope global eth0

$ ip r

10.3.0.0/16 dev eth0  proto kernel  scope link  src 10.3.0.2

default via 10.3.0.1 dev eth0

R1

$ ip a

inet 10.1.0.1/16 brd 10.1.255.255 scope global eth1

inet 10.2.0.1/16 brd 10.2.255.255 scope global eth2

inet 10.3.0.1/16 brd 10.3.255.255 scope global eth3

$ ip r

10.1.0.0/16 dev eth1  proto kernel  scope link  src 10.1.0.1

10.2.0.0/16 dev eth2  proto kernel  scope link  src 10.2.0.1

10.3.0.0/16 dev eth3  proto kernel  scope link  src 10.3.0.1

R2

$ ip a

inet 10.1.0.2/16 brd 10.1.255.255 scope global eth1

inet 10.2.0.2/16 brd 10.2.255.255 scope global eth2

$ ip r

10.1.0.0/16 dev eth1  proto kernel  scope link  src 10.1.0.2

10.2.0.0/16 dev eth2  proto kernel  scope link  src 10.2.0.2

default via 10.1.0.1 dev eth1

请问这是什么原因?

你可以返回去细细思考5分钟......

我的回答:

假设R2的两个接口分别为A(10.1.0.2)、B(10.2.0.2)。

从PC ping 10.2.0.2时,包的路径是PC-->10.3.0.1-->10.2.0.2,

此时包的 ,

以进行反向路径检查, 得到输出设备是A,

因为目的地址是10.3.0.2,只能使用默认路由。A!=B,反向路径检查失败,

丢弃该包!

五、如何解决

两种方法:

1 On R2:

ip route add 10.3.0.0/16 via 10.2.0.2

增加一条关于10.3.0.0/16子网的路由。

2 On R2:

/etc/sysctl.conf

net.ipv4.conf.default.rp_filter = 0

禁用反向路径检查。

阅读(1409) | 评论(0) | 转发(0) |

linux内核路由反向检查,反向路径过滤——reverse path filter相关推荐

  1. linux内核路由反向检查,反向路径过滤

    第13章 内核网络参数 13.1. 反向路径过滤 缺省情况下,路由器路由一切包,即使某些数据包"明显地"不属于你的网络.一个简单的例子就是私有IP空间溢出到了Internet上.如 ...

  2. linux内核路由反向检查,Linux非对称路由

    首先解释一下什么是对称路由和不对称路由. 对称路由:symmetric route,指从A到B所走的路由和从B到A所走的路由是相同的 不对称路由:asymmetric route,指从A到B所走的路由 ...

  3. linux 内核网络协议栈--linux内核路由机制(一)

    内核的路由部分是是网络中重要部分,目前在Linux内核中默认的路由查找算法使用的是Hash查找,所以你会看到很多的数据结构是XXX_hash什么之类(例如fn_hash).Linux内核从2.1开始就 ...

  4. Linux3种进程,linux内核获取进程的全路径3种方法

    本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性. /*----------------------------------------------------- ...

  5. linux内核路由反向检查,Linux路由设置 反向路由设置

    反向路由设置: route add –net 192.168.200.0  netmask 255.255.255.0 gw 172.31.1.209 route del –net 192.168.2 ...

  6. linux内核路由转发表的组成,linux路由转发表的检索过程(fib_lookup)

    1) 转发表(fib_table)是记录IP转发信息的索引表, 转发表的每一记录(节点)描述了具有某一类目的地址的IP包应该使用哪一输出设备发给哪一目的主机. 转发表记录按网络区进行分类, 每一网络区 ...

  7. Linux内核 eBPF基础:ftrace源码分析:过滤函数和开启追踪

    Linux内核 eBPF基础 ftrace基础:过滤函数和开启追踪 荣涛 2021年5月12日 本文相关注释代码:https://github.com/Rtoax/linux-5.10.13 上篇文章 ...

  8. linux 内核配置简介

    Gentoo Linux Gentoo内核(gentoo-sources)特有的选项 Gentoo Linux support CONFIG_GENTOO_LINUX 选"Y"后, ...

  9. 论文中文翻译——Double-Fetch情况如何演变为Double-Fetch漏洞:Linux内核中的双重获取研究

    本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--How Double-Fetch Situations turn into Double-Fetch Vulnerabil ...

最新文章

  1. Datawhale组队学习周报(第047周)
  2. 6.项目资源管理总结
  3. AI理论知识整理(14)-矩阵的秩
  4. store内部数据调用 与 view使用store数据
  5. VMware-viewagent-direct-connection安装
  6. 什么是TypeScript的字符串索引签名
  7. python 三引号_入门Python 必备知识基础(一)
  8. linux io ports io memory
  9. MMC-HVDC仿真模型,pscad柔性直流输电仿真mmc仿真模型
  10. 英语各类词担任的句子成分
  11. 【视觉运控一体机小课堂】三分钟实现图像颜色通道切换和RGB图转灰度图的功能
  12. python——个税计算器
  13. 下载安装electron和electron-builder遇到的问题及部分解决办法
  14. 相似度计算常用方法综述
  15. 在网页版 BOSS直聘 上实现 批量打招呼,发信息等操作
  16. 【iOS开发】ipa安装到手机上的三种方式
  17. 想跳槽却简历石沉大海?一起来围观月薪20k的软件测试工程师真实简历 (含金量高面试题)
  18. drupal8 存取session
  19. 腾讯云标准型S3服务器独享100%CPU性能评测
  20. gamma校正到底是个什么玩意儿

热门文章

  1. hdu4845 状态压缩BFS
  2. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 中根据 File 加载 DexFile | loadDexFile 分析 )
  3. 【Android 逆向】Android 进程注入工具开发 ( 调试进程中寄存器的作用 | 通过 EIP 寄存器控制程序运行 | EIP 寄存器的存档与恢复 )
  4. 【SeeMusic】创建 SeeMusic 工程并编辑相关内容 ( 创建工程 | 导入 MIDI 文件 | 导入音频 | 导入视频 )
  5. 【计算理论】可判定性 ( 通用图灵机和停机问题 | 可判定性 与 可计算性 | 语言 与 算法模型 )
  6. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )
  7. 【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )
  8. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( 设置 ANativeWindow 缓冲区属性 | 获取绘制缓冲区 | 填充数据到缓冲区 | 启动绘制 )
  9. 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )
  10. opencv 图片剪切