在Linux中,往往会出现一些奇怪的现象,如果你仅仅知道一些皮毛,那么这些现象将会让你抓耳挠腮,因为Linux往往遵循RFC建议而有时却不会保持持久的大众化实现,毕竟,Linux并不是一个人搞定的,特别是网络协议栈这一方面。uRPF这个概念很多人都知道,Linux的实现却很不一致,在Linux实现中,它和策略路由的点点滴滴值得说一番,我们分为以下4个关键点来说明,当然这4点并不是全部关于uRPF的:

1.策略路由和OUTPUT链Linux的Netfilter实现5个HOOK点,其中OUTPUT点在路由之后,那么如果我们将如下的路由:

route add -net 192.168.188.0/24 gw 192.168.40.254

移植到策略路由:

ip rule add $标签1 tab newip route add 192.168.188.0/24 via 192.168.40.254 table newroute del -net  192.168.188.0/24iptables -t mangle -A OUTPUT -XXX -j MARK --set-mark $标签1

那么当我们从本机发包到192.168.188.0/24的时候,得到的结果将是“路由不可达”。这是因为Linux的基于标签的策略路由是为“过路包”设计的,在本机发包进入任何Netfilter钩子点之前首先要经过IP路由,也就是说OUTPUT链在IP路由之后,此时任何的打标签策略都还没有被应用,因此就会出现上述的奇怪现象。

2.CONNMARK target和MARK target在Linux Netfilter中,有CONNMARK和MARK两个target,其作用都是set-mark,那么这两个target有何不同呢?很简单,CONNMARK是为一个“连接”即conntrack打上一个mark,而MARK仅仅是为一个packet打上一个mark,对于CONNMARK,如果想让后续的包或者返回包也被打上mark,www.linuxidc.com 不必再进行一次新的iptables规则匹配,只需要restore-mark即可,而对于MARK,则不能这么做,因此它是不依赖ip_conntrack的。

因此,考虑以下现象:

路由:

ip rule add $标签1 tab newip route add 192.168.188.0/24 via 192.168.40.254 table newroute del -net  192.168.188.0/24

iptables规则:

iptables -t mangle -A PREROUTING -i $内网口 -XXX -j MARK --set-mark $标签1

rp_filter配置:

sysctl -w net.ipv4.conf.$所有网卡.rp_filter=1

访问192.168.188.0/24,将发现返回包无法经过网关,为何呢?很简单,rp_filter为1,显然为严格uRPF,此时返回包的反向路由必须被查找到且和策略路由的结果一致,然而策略路由是无法被命中的,因此返回包没有命中任何iptables打标签的规则而没有被打标签,进而不命中策略路由...,如果将iptables中的MARK改为CONNMARK呢?也不行,还缺少一条:

iptables -t mangle -A PREROUTING -j CONNMARK restore-mark

才行,因此请注意,始终将上述规则放在所有规则的靠前的位置且在其后加上RETURN target的规则,可以:第一,免除很多基于mark的iptables规则查找;第二,可以避免由于uRPF而导致的奇怪问题。

3.标签策略路由和NOTRACK target如果还是出现了奇怪的问题,那么看一下是不是NOTRACK target导致的呢?我们知道raw表是所有规则的最前面的,因此如果在raw表中被NOTRACK了,那么就别指望后面的任何mark规则起作用了,所有的基于mark的策略路由也将无效,更隐蔽的是uRPF验证失败导致的包不可达将很难被发现。

4.路由cache与rp_filter在IP路由查找的时候,首先要查找路由cache,在Linux的实现中,查找路由cache的过程不涉及任何的uRPF(在ip_route_input_XXX中没有任何fib_validate_source的调用),因此如果系统中有反向包的路由cache,即使你设置了rp_filter为严格uRPF,并且还故意配置NOTRACK以及基于mark的正向包策略路由,那还是可以正常通讯的。

linux netfilter路由表,Netfilter策略路由和uRPF相关推荐

  1. 走进Linux内核之Netfilter框架

    走进Linux内核之Netfilter框架 - 掘金笔者此前对Linux内核相关模块稍有研究,实现内核级通信加密.视频流加密等.话不多说直接上才艺,现在带你走进Linux内核之Netfilter框架. ...

  2. iptables命令_理解 Linux 下的 Netfilter/iptables

    Netfilter/iptables 项目由 Rusty Russe 创建于1998年,并于 1999 年建立了 Netfilter Core team,并在此后负责维护此项目,同时也于2000年3月 ...

  3. linux内核协议栈 netfilter 之连接跟踪子系统的L3 L4协议栈模块初始化与自定义注册

    目录 1 L3.L4协议跟踪初始化 nf_conntrack_proto_init() 1.1 L3协议管理 1.1.1 struct nf_conntrack_l3proto 1.1.2 L3协议注 ...

  4. Linux路由应用-使用策略路由实现访问控制

    引: 一般而言,访问控制并不是路由模块完成的,而是防火墙的职责,如果你使用Linux的,这是iptables的职责.然而有时候,特别是在策略很多的情况下,使用iptables会极大降低网络性能,这是N ...

  5. linux路由介绍,Linux的路由表详细介绍

    Linux的路由表详细介绍 一 在Linux下执行route命令[root@localhost backup]# route -nKernel IP routing tableDestination ...

  6. linux路由表命令,Linux的路由表详细介绍

    Linux的路由表详细介绍 一 在Linux下执行route命令 [root@localhost backup]# route -n Kernel IP routing table Destinati ...

  7. linux netfilter路由表,linux网络相关,firewalld和netfilter,netfilter5表5链介绍,itptables语法...

    Linux网络相关: 如果没有 ifconfig 命令 那么需要安装一个包(yum install net-tools) 如果 ifconfig 命令查看不到网卡的话,那么可以使用 ifconfig ...

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

    起因: 最近在完成网关的一个相关功能时,对于网关本身通过socket发送的数据包,没有从正确的wan接口发送出去,但是在udp_sendmsg 函数里打印出来的 信息显示路由查找是正确的,但是当数据包 ...

  9. linux多路由表,linux 多网卡多路由表实现策略路由

    linux kernel 2.2 开始支持多个路由表. routing policy database (RPDB). 传统路由表,基于目标地址做路由选择.通过多个路由表,kernel支持实施策略路由 ...

  10. Linux 防火墙:Netfilter iptables

    一.Netfilter 简介 (1) Netfilter 是 Linux 内置的一种防火墙机制,我们一般也称之为数据包过滤机制,而 iptables 只是操作 netfilter 的一个命令行工具 ( ...

最新文章

  1. 如何解决用谷歌浏览器调试代码接口请求的时候,跳转网页切换网页的时候,上一个页面的接口请求记录被清除消失的问题
  2. 如何取消 登录_LSAT | 退考、缺考、取消成绩,各自的区别和流程是怎样的?
  3. lintcode 单词接龙II
  4. 官网安装Nvidia CUDA Toolkit、cuDNN报错502的备用镜像下载网址
  5. 后台长期运行进程的三种方式
  6. MySQL:备份数据库脚本报错mysqldump: Couldn‘t execute ‘SELECT COLUMN_NAME****
  7. springboot项目打jar包部署到linux中
  8. 【python--爬虫】彼岸图网高清壁纸爬虫
  9. 免费试用一年微软云服务领取教程
  10. 【报告分享】代餐行业营销洞察报告-丁香医生(附下载)
  11. 转载 Latex各种命令、符号、公式、数学符号、排版(非常详细)
  12. Build-dep linux 知乎,apt-get build-dep十分有用的命令
  13. 基于ESp8266的智能插座
  14. [原创]FPS网络游戏自动瞄准自瞄外挂漏洞分析以及实现
  15. MySQL-18全文本搜索-必知必会
  16. 一步一步学Spring Boot(二)课程发布了~~~
  17. 使用C++定义QML类型qrc:/main.qml:5:1: module “io.qt.examples.BackEnd“ is not installed
  18. html div挤下去了,网站固定导航条挤动下面的DIV_html/css_WEB-ITnose
  19. windows10 WIFI功能不能使用了、没有WIFI模块或驱动安装失败
  20. CC2640R2F BLE5.0 体系结构

热门文章

  1. 计算机网络纠错码,纠错码
  2. chmod 755 filename
  3. 风尚云网学习-vue项目的构建/打包/发布
  4. maven配置smartupload_SmartUpload文件上传组件的使用教程
  5. Slate轨道工具使用(三)—位置还原问题修复
  6. 百度AI图像处理—图像主体识别调用教程(基于Python3-附Demo)
  7. 10本Java网站开发必看书籍
  8. 交互设计[1]--设计心理学
  9. Unity 经纬度定位
  10. 推荐一款限时下载应用(听心字典)