Linux 路由三大件

对于 Linux 网络,好奇心强的同学一定思考过两个问题:

 

  • 当我们发出一个包的时候,Linux 是如何决策该从哪个网卡(假设有多个网卡)、哪个下一跳发出这个包,用什么 IP 作为 source......
  • 当 Linux 收到一个包时,又是如何决定往哪里送的,是发送给本地程序、其他虚拟接口,还是转发到其他机器......

今天,我们就来分析这两个问题的核心所在:路由。

我们学习计算机网络的时候,一般都会了解到基于目的地址(cidr)的路由(ip route),但是在 Linux 2.0 之后,RPDB (Routing Policy DataBase)诞生了,引入了更丰富的路由策略(ip rule)。除此以外,我们还可以通过 iptables 来操纵数据包,作为路由策略实施的依据,间接地影响路由过程。

至此,我们就认识了 Linux 路由的三大件。那么,三大件分别是什么原理,又是是如何交互的呢?且看下文分析。

注:虽然 Linux 提出了 nftables 来替换 iptables,但 iptables 仍然是事实上的标准

RPDB

首先我们来看看 RPDB,RPDB 由两部分组成,一个是 rule 列表,一个是 routing table 列表。

rule

ip rule 命令可以展示所有的 rule,每个 rule 由 selector(依据什么特征选择包) 和对应 action(对包做什么) 组成。

selector 主要有几种类型:

  • 出/入接口的 index,如 eth0、eth1
  • fwmark: 包携带的标记
  • Tunnel id
  • src/dst addr/port
  • type of service
  • priority
  • ......

action 主要由几种类型:

  • 传递给特定的 route
  • 跳转到其它的 rule
  • Drop/reject 这个包
  • ......

routing table

routing table 最开始只有一个,RPDB 后引入了多个(可以通过 cat /etc/iproute2/rt_tables 查看),默认有三个:

  • local,dst 为本地或者广播地址的路由
  • main,默认的路由
  • default,一般为空,为后处理预留空间

ip route 命令默认展示的是 main table,ip route show table local 形式可以展示其它 table。

routing table 里面每个 route 代表了 dst 为某个/些/类地址 的数据包应该 通过哪个渠道 转发。route 由几部分组成:

  • types
    • unicast,单播,最常见
    • unreachable,丢包并返回 ICMP 消息
    • blackhole, 默默丢包
    • ......
  • socpe,目标地址的范围: cat /etc/iproute2/rt_scopes,默认有三个
    • link,只在本设备有效,通常是直连
    • host,只在本机有效
    • global,全局有效,可传播,是默认值
    • ......
  • proto,路由由谁创建和维护: /etc/iproute2/rt_protos,默认有三个
    • kernel,内核创建,长期有效
    • boot,临时的
    • static,手动创建,override 动态路由(由路由协议维护entry)
    • ......
  • preference,优先级,一般都是数字越小,优先级越高
  • dev,通过的设备名字,如 eth0
  • nexthop,下一跳
  • src,设置发出包的 src ip
  • ......

RPDB 运行逻辑

参考 fib_lookup 函数:如果你没有动过 RPDB,那么直接用 mian table 进行路由查找(fib_table_lookup)了;如果动过,则通过 __fib_lookup/fib_rules_lookup 进行 rule 匹配,匹配逻辑为:

  • 无论是出还是入方向的每个包,都会遍历所有 rule,按照 priority,由 0 开始
  • 第一个匹配的 rule 会执行 action
  • 如果 action 是 lookup route table,则用对应 table 进行路由查找(fib_table_lookup),如果查找失败,则继续执行下一个 rule
  • 如果没有任何 rule 匹配,则报错

路由查找逻辑为:

  • 最长前缀匹配(也是被认为最精准的)的 route 被选中
  • 如果有多个匹配,则 preference、tos/dscp、自然顺序都会被进行考虑,最后仅剩一个匹配
  • 如果没有匹配,则返回 rule 匹配,继续检查下一个 rule

iptables

iptables 主要用于包过滤、修改和 NAT。再次拿出下面这张神图,来阐释它五大表和五大链,及其生效顺序和范围:

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

三大件的交互过程

了解了各自原理之后,我们当然想知道它们是怎么交互的。上面那张图实际上已经阐释了他们之间的交互,不过下面这张图能看得更清晰:

原图:http://www.adminsehow.com/2011/09/iptables-packet-traverse-map/

实践

这是一个完全没动过的环境:

我们现在来设计一个需求:源端口为 30300 的包,默默丢弃;源端口为 30301 的包,丢弃并报错;源端口为 30302 的包,用新的 route table 转发。
先看看实施前的结果,用 http://taobao.com 来测试

nc -zv taobao.com 443 -p 30300
Connection to taobao.com (59.82.122.115) 443 port [tcp/https] succeeded!
nc -zv taobao.com 443 -p 30301
Connection to taobao.com (106.11.226.158) 443 port [tcp/https] succeeded!
nc -zv taobao.com 443 -p 30302
Connection to taobao.com (106.11.226.158) 443 port [tcp/https] succeeded!

虽然实现这个需求有很多方式,但是我这里为了演示三大件的交互而选择了下面的这种方式:

首先需要标记这三种类型的包,由于是本地发包,我们采用 mangle output

iptables -A OUTPUT -t mangle -o enp0s1 -p tcp --sport 30300 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -o enp0s1 -p tcp --sport 30301 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -o enp0s1 -p tcp --sport 30302 -j MARK --set-mark 3

iptables -t mangle -L 展示,iptables -t mangle -F 清理。

然后增加相应的 route table

echo 2 custom >> /etc/iproute2/rt_tables
ip route add default via 192.168.64.1 dev enp0s1 src 192.168.64.4 table custom

以及 rule

ip rule add from all fwmark 1 blackhole
ip rule add from all fwmark 2 prohibited
ip rule add from all fwmark 3 table custom

结果发现 30302 依然能通,但是 30300 和 30301 都超时了,没看出来返回的错误。
采用 traceroute 的 tcp 模式作为测试工具则能够看出一些差别。

ip rule add from all fwmark 2 unreachable 对应结果也确实符合期望

traceroute -T --sport=30301 --port=443 tabao.com
traceroute to tabao.com (128.14.151.194), 30 hops max, 60 byte packets
send: Network is unreachable

原文作者:九零后程序员

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/91861.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pywinauto结合selenium实现文件上传

简介 PC端-Windows上的元素识别可用viewWizard工具 PC端-Windows上的元素操作可用pywinauto库 浏览器上网页的元素识别可用selenium 安装 pip installer pywinauto 使用须知 pywinauto官方文档 确定app的可访问技术 1、win32 API(backend“win32”) 一般是MFC、VB6、VCL…

小程序-uni-app:hbuildx uni-app 安装 uni-icons 及使用

一、官方文档找到uni-icons uni-app官网 二、下载插件 三、点击“打开HBuildX” 四、选择要安装的项目 五、勾选要安装的插件 六、安装后&#xff0c;项目插件目录 根目录uni_modules目录下增加uni-icons、uni-scss 七、引入组件&#xff0c;使用组件 <uni-icons type&qu…

【声波】声波在硼酸、硫酸镁 (MgSO4) 和纯水中的吸收研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

POST请求负载form-data表单数据需要同步修改header的Content-type

需要读公司的一个接口&#xff0c;显示负载是“表单数据” 一开始没注意类型&#xff0c;按照公司其他接口的情况用了json&#xff0c;结果返回的数据时间阶段没有体现dct的要求&#xff0c;脚本如下&#xff08;错误示范&#xff09; from requests import post from json im…

docker学习

配置数据卷容器 1、创建启动c3数据卷容器&#xff0c;使用-v参数&#xff0c;设置数据卷 docker run -it --namec3 -v /volume centos:7 /bin/bash 2、创建启动c1 c2容器&#xff0c;使用--volumes-from 参数设置数据卷 docker run -it --namec1 --volumes-from c3 centos:7 /…

超声波一体气象站的介绍

超声波一体气象站集风速、风向、温湿度、噪声采集、PM2.5和 PM10、CO2、大气压力、光照于一体&#xff0c;采用标准 ModBus-RTU 通信协议&#xff0c;RS485信号输出方式&#xff0c;通信距离可达 2000 米&#xff0c;数据能够通过 485 通信的方式上传至客户的监控软件或 PLC 组…

JVM——分代收集理论和垃圾回收算法

一、分代收集理论 1、三个假说 弱分代假说&#xff1a;绝大多数对象都是朝生夕灭的。 强分代假说&#xff1a;熬过越多次垃圾收集过程的对象越难以消亡。 这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则&#xff1a;收集器应该将Java堆划分出不同的区域&…

OPENCV C++(十二)模板匹配

正常模板匹配函数 matchTemplate(img, templatee, resultMat, 0);//模板匹配 这里0代表的是方法&#xff0c;一般默认为0就ok img是输入图像 templatee是模板 resultmat是输出 1、cv::TM_SQDIFF&#xff1a;该方法使用平方差进行匹配&#xff0c;因此最佳的匹配结果在结果为…

《Java-SE-第三十八章》之注解

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…

【vue3+xlxs+xlsx-style-vite】vue3项目中使用xlsx插件实现Excel表格的导出和解析,已实现

在vue3项目中使用xlsx插件实现Excel表格的导出和解析 1、xlsx插件包官方 xlsx插件包官方 2、FileReader官方文档&#xff1a;FileReader官方文档 安装xlsx和xlsx-style-vite、file-saver npm install xlsx npm install xlsx-style-vite npm install file-saverpackage.json中查…

以商业大数据技术助力数据合规流通体系建立,合合信息参编《数据经纪从业人员评价规范》团标

经国务院批准&#xff0c;由北京市人民政府、国家发展和改革委员会、工业和信息化部、商务部、国家互联网信息办公室、中国科学技术协会共同主办的2023 全球数字经济大会于近期隆重召开。由数交数据经纪&#xff08;深圳&#xff09;有限公司为主要发起单位&#xff0c;合合信息…

【openwrt学习笔记】dnsmasq源码阅读

目录 一、DHCP(Dynamic Host Configuration Protocol)1.1 前置知识1.2 参考链接1.3 IP地址分配代码分析rfc2131.cdhcp-common.cdhcp.c 1.4 几个小问题1.4.1 连续IP模式&#xff08;sequential_ip&#xff09;1.4.2 重新连接使用IP地址1.4.3 续约租期1.4.4 不同的MAC地址分配到相…

3. 爬取自己CSDN博客列表(自动方式)(分页查询)(网站反爬虫策略,需要在代码中添加合适的请求头User-Agent,否则response返回空)

文章目录 步骤打开谷歌浏览器输入网址按F12进入调试界面点击网络&#xff0c;清除历史消息按F5刷新页面找到接口&#xff08;community/home-api/v1/get-business-list&#xff09;接口解读 撰写代码获取博客列表先明确返回信息格式json字段解读 Apipost测试接口编写python代码…

对应分析介绍及SPSS案例分析

在开展统计分析的过程中&#xff0c;分类变量&#xff08;定序和定类变量&#xff09;是我们研究的一个重点。通常我们分析分类变量间关系时&#xff0c;最常用的分析方法是卡方检验&#xff0c;其次是逻辑回归和对数线性模型等。 如果类别变量的分类较少&#xff0c;我们可以…

Clickhouse基于文件复制写入

背景 目前clickhouse社区对于数据的写入主要基于文件本地表、分布式表方式为主&#xff0c;但缺乏大批量快速写入场景下的数据写入方式&#xff0c;本文提供了一种基于clickhouse local 客户端工具分布式处理hdfs数据表文件&#xff0c;并将clickhouse以文件复制的方式完成写入…

selenium.webdriver Python爬虫教程

文章目录 selenium安装和使用 selenium安装和使用 pip install selenium 下载对应的浏览器驱动 实例化浏览器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制浏览器

浪潮信息赵帅:多元算力时代 开源开放的OpenBMC成为服务器管理优先解

“多元算力时代下&#xff0c;大规模的异构服务器设备面临多种处理器架构、多种设备协议、不同管理芯片兼容的系统化设计挑战&#xff0c;管理固件也迎来新的变革。开源开放的OpenBMC&#xff0c;以创新的分层解耦软件架构&#xff0c;兼容不同处理器架构、算力平台和管理芯片&…

JS导出复杂多级表头的Excel

使用方式 1、安装依赖 npm install xlsx-js-style2、复制代码文件exportExcel.js至工程 https://github.com/EnthuDai/export-excel-in-one-line 3、在引入excel.js后调用 Excel.export(columns, dataSource, 导出文件名)4、代码demo 5、效果 页面excel 适用范围 对于使…

视频汇聚平台EasyCVR视频监控播放平台WebRTC流地址无法播放的问题解决方案

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

excel入门

上下左右移动 enter:换行&#xff0c;向下移动 shiftenter:向上移动 tab:向右移动 shifttab:向左移动 合并居中操作 开始-》合并居中 CtrlM 内容过长盖过了下一个单元格内容 双击列与列之间线 同时修改多行或者多列宽度或者高度 修改单行高度宽度 选中某一行拉取指定高…