Linux rp_filter、arp_filter、arp_ignore、arp_announce参数说明

Linux rp_filter、arp_filter、arp_ignore、arp_announce参数说明。我查看了参考资料,又去查阅了官方文档,凭着我的理解整理了以下文档。各位大神的文档写的很好,但都不喜欢断句啊,读的我这叫一个累。

参考

1.网络编程之网络丢包故障怎样定位怎样处理
2.linux参数arp_filter,arp_ignoe,arp_announce,rp_filter详解
3.Linux rp_filter和arp_filter参数浅析
4.【linux】修改arp_ignore、arp_announce、rp_filter、accept_local |内核调优
5.Linux内核参数之arp_ignore和arp_announce
6.LVS负载均衡(LVS简介、三种工作模式、十种调度算法)
7.官方文档:kernel IP Sysctl

概念

在这里插入图片描述

rp_filter

rp_filter全称reverse path filter用于控制系统是否开启对数据包源地址的校验。这是一个网卡级别的参数也就是说每张网卡可以设置不同的值。此参数有三个值0、1、2具体含义。

详见:kernel IP Sysctl
在这里插入图片描述

0:不开启源地址校验,默认值。

1:开启严格的反向路由校验。对每个进来的数据包校验其反向路由是否是最佳路由,即接收报文的网卡和响应数据的网卡是否是同一张网卡。如果反向路由不是最佳路由,则直接丢弃该数据包。

2:开启松散的反向路由校验。对每个进来的数据包校验其源地址是否可达,即反向路由是否能通过任意网卡到达,如果反向路由不通,则直接丢弃该数据包。

什么是反向路由校验
所谓反向路由校验,就是在一个网卡收到数据包后,把源地址和目标地址对调后查找路由出口,从而得到反转后路由出口。然后根据反向路由出口进行过滤。

当rp_filter的值为1时,要求反向路由的出口必须与数据包的入口网卡是同一块,否则就会丢弃数据包。
当rp_filter的值为2时,要求反向路由必须是可达的,如果反路由不可达,则会丢弃数据包。

arp_filter

arp_filter和rp_filter类似都是进行反向路由检验,不过是专门针对arp协议的。而且行为也有所不同。

详见:kernel IP Sysctl
在这里插入图片描述

当arp_filter设置为0时,如果从某张网卡上收到了一个arp请求,同时目标ip在此主机上,不论目标ip是否在接收到此arp请求的网卡上,那么主机都会进行响应,响应的mac地址为接收到此请求的网卡的mac地址(注意此mac地址不一定是目标ip所在网卡的mac地址,目标IP网卡与接收请求的网卡不是同一个)。
0是默认值,表示回应arp请求的时候不检查网卡情况

当arp_filter设置为1时,如果从某张网卡上收到了一个arp请求,同时目标ip在此主机上,且不要求目标ip一定在接收到此arp请求的网卡上(arp_ignore优先于arp_filter。不要求目标ip一定在接收到此arp请求的网卡,即不适用arp_ignore 1-2的情况),那么主机便会查询到此请求的源ip的路由是通过哪张网卡,如果是接收到此arp请求的网卡则发送arp响应,响应的mac地址为接收到此请求的网卡的mac地址。
1表示回应arp请求时会检查网卡是否和接收arp请求的网卡一致,不一致就不回应

arp_ignore

定义对目标地址为本机IP的ARP查询的不同应答模式。

在这里插入图片描述
详见:kernel IP Sysctl

整型值的范围为0-8常用的只有0 1 2,默认为0。

0(默认值)回应任何网络接口上对任何本地IP地址的arp查询请求,比如eth0=192.168.0.1/24, eth1=10.1.1.1/24,那么即使eth0收到来自10.1.1.2这样地址发起的对10.1.1.1的arp查询也会回应——而原本这个请求该是出现在eth1上也该由eth1回应的响应的mac自然是eth0的mac。
0是响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目标IP是否在接收网卡上。

1 只回应目标IP地址是来访网络接口本地地址的ARP查询请求。
比如:eth0=192.168.0.1/24, eth1=10.1.1.1/24,那么当eth0收到对192.168.0.1的查询请求时会进行回复(不论arp请求源地址是啥),而对待查询的ip为10.1.1.1的arp查询不会进行回复
1 只响应目标IP地址为接收网卡上的本地地址的arp请求。

2 只回应目标IP地址是来访网络接口本地地址,并且请求源IP必须在该网络接口的子网段内的ARP查询请求。
比如:eth0=192.168.0.1/24, eth1=10.1.1.1/24, eth0收到对192.168.0.1的查询请求源地址为 10.1.1.2(不同网段)不会回答,而会回答192.168.0.2发起的对192.168.0.1的arp查询请求
2 只响应目标IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。

3 不回应配置为scope host的的本地地址。只回应配置为scope global和scope link的本地地址

4~7 保留未使用

8 不回应所有的arp请求

IP 的SCOPE-ID的说明

// 查看man ip address手册
root@ubuntu22-25:~# man ip address
IP-ADDRESS(8)                                                              Linux                                                              IP-ADDRESS(8)

NAME
       ip-address - protocol address management

SYNOPSIS
       ip [ OPTIONS ] address  { COMMAND | help }

       ip address { add | change | replace } IFADDR dev IFNAME [ LIFETIME ] [ CONFFLAG-LIST ]

       ip address del IFADDR dev IFNAME [ mngtmpaddr ]

       ip address { save | flush } [ dev IFNAME ] [ scope SCOPE-ID ] [ metric METRIC ] [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ] [ up ]

       ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ] [ master DEVICE ] [ type TYPE ] [ vrf NAME ] [ up
               ] ]

       ip address { showdump | restore }

       IFADDR := PREFIX | ADDR peer PREFIX [ broadcast ADDR ] [ anycast ADDR ] [ label LABEL ] [ scope SCOPE-ID ]

       SCOPE-ID := [ host | link | global | NUMBER ]
       
......

       scope SCOPE_VALUE
              the scope of the area where this address is valid.  The available scopes are listed in file /etc/iproute2/rt_scopes.  Predefined scope values
              are:

                      global - the address is globally valid.

                      site - (IPv6 only, deprecated) the address is site local, i.e. it is valid inside this site.

                      link - the address is link local, i.e. it is valid only on this device.

                      host - the address is valid only inside this host.

arp_announce

arp_announce的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址。

详见:kernel IP Sysctl
在这里插入图片描述

0:默认值,允许使用任意网卡上的IP地址作为arp请求的源IP。通常就是使用数据包的源IP(注意源IP可能不是发送网卡的IP,源IP与发送网卡mac不对应)。
比如:eth0=192.168.1.1/24,eth1=10.1.1.1/24,要发送的数据包源IP=192.168.1.1,目标IP=10.1.1.200/24,那么发送arp请求会使用源IP=192.168.1.1(eth0的IP)和mac地址=eth1(10.1.1.1/24)的mac。

1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。当发送arp请求时,会先检查所有子网,查看是否存在包含目标ip的子网(同网段)。如果存在,那么使用该子网IP发送;如果不存在,使用参数2的方式发送。(我理解如果两块网卡配置同段IP,其中一块作为发送网卡的情况下,会与参数2有所区别。)

2:忽略数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。当发送arp请求时,会先检查所有子网,优先选择包含目标IP的子网所对应的IP。如果不存在包含目标IP的子网,那么会使用外发网卡或所有网卡的第一个IP。
比如:eth0=192.168.1.1/24,eth1=10.1.1.1/24,要发送的数据包源IP=192.168.1.1,目标IP=10.1.1.200/24,那么发送arp请求会使用源IP=10.1.1.1(eth1的IP)和mac地址=eth1(10.1.1.1/24)的mac。

补充:arp_ignore和arp_announce参数在DR模式下的作用

什么是DR

详见:LVS负载均衡(LVS简介、三种工作模式、十种调度算法)

配置arp_ignore为1

因为DR模式下,每个真实服务器节点都要在环回网卡上绑定虚拟服务IP。这时候,如果客户端对于虚拟服务IP的arp请求广播到了各个真实服务器节点,如果arp_ignore参数配置为0,则各个真实服务器节点都会响应该arp请求,此时客户端就无法正确获取LVS节点上正确的虚拟服务IP所在网卡的MAC地址。假如某个真实服务器节点A的网卡eth1响应了该arp请求,客户端把A节点的eth1网卡的MAC地址误认为是LVS节点的虚拟服务IP所在网卡的MAC,从而将业务请求消息直接发到了A节点的eth1网卡。这时候虽然因为A节点在环回网卡上也绑定了虚拟服务IP,所以A节点也能正常处理请求,业务暂时不会受到影响。但时此时由于客户端请求没有发到LVS的虚拟服务IP上,所以LVS的负载均衡能力没有生效。造成的后果就是,A节点一直在单节点运行,业务量过大时可能会出现性能瓶颈。

所以DR模式下要求arp_ignore参数要求配置为1。

配置arp_announce为2

每个机器或者交换机中都有一张arp表,该表用于存储对端通信节点IP地址和MAC地址的对应关系。当收到一个未知IP地址的arp请求,就会再本机的arp表中新增对端的IP和MAC记录;当收到一个已知IP地址(arp表中已有记录的地址)的arp请求,则会根据arp请求中的源MAC刷新自己的arp表。

如果arp_announce参数配置为0,则网卡在发送arp请求时,可能选择的源IP地址并不是该网卡自身的IP地址,这时候收到该arp请求的其他节点或者交换机上的arp表中记录的该网卡IP和MAC的对应关系就不正确,可能会引发一些未知的网络问题,存在安全隐患。

所以DR模式下要求arp_announce参数要求配置为2。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Pygame手册01/20】最简应用:窗口

目录 一、说明 二、pygame是什么? 2.1 为游戏开发设计 2.2 版本发展史 2.3 特点 三、pygame安装要点 四、入门知识 4.1 初始使用 4.2 要更改 pygame 窗口的外观 4.3 完整窗口程序 4.4 窗口对象接口示例 五、隐形窗口和显性窗口 六、结论 一、说明 为什…

vue_dev_tools工具下载安装打包

vue_dev_tools工具下载安装打包 一、简介二、安装方式2.1.安装图文2.2.打包工具 endl 一、简介 使用 Vue 时,在浏览器上安装 Vue Devtools Vue Devtools 是 Vue 官方发布的调试浏览器插件,可以安装在 Chrome 和 Firefox 等浏览器上,直接内嵌…

C++ STL: list使用及源码剖析

list使用 list常用函数及使用&#xff08;1&#xff09; #include <iostream> #include <list> #include <algorithm>int main() {// 创建liststd::list<int> myList {5, 2, 9, 1, 5, 6};// 打印liststd::cout << "Original list: &quo…

2024年2月份实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

Sentinel 流控-链路模式

链路模式 A B C 三个服务 A 调用 C B 调用 C C 设置流控 ->链路模式 -> 入口资源是 A A、B 服务 package com.learning.springcloud.order.controller;import com.learning.springcloud.order.service.BaseService; import org.springframework.beans.factory.annotatio…

代码随想录算法训练营29期|day51 任务以及具体安排

第九章 动态规划part08 139.单词拆分 class Solution {public boolean wordBreak(String s, List<String> wordDict) {HashSet<String> set new HashSet<>(wordDict);boolean[] valid new boolean[s.length() 1];valid[0] true;for (int i 1; i < s.…

unity的重中之重:组件

检查器&#xff08;Hierarchy&#xff09;面板中的所有东西都是组件。日后多数工作都是和组件打交道&#xff0c;包括调参、自定义脚本组件。 文章目录 12 游戏的灵魂&#xff0c;脚本组件13 玩转脚本组件14 尽职的一生&#xff0c;了解组件的生命周期15 不能插队&#xff01;…

Solidworks:油泵体设计

做一个更复杂的作业&#xff0c;油泵体设计。感觉Solidworks还是用的不熟&#xff0c;分了半天劲才做出来。 先上课本上的插图&#xff1a; 我的作业和课本差不多吧&#xff01; 再来个背面的照片&#xff1a; 课本提供了两种剖面展示的方法&#xff1a; 现在我也轻车熟路…

error An unexpected error occurred: “https://registry.npm.taobao.org

背景&#xff1a; 想使用yarn命令结果报错 问题原因&#xff1a; 原来证书到期了 http://registry.npm.taobao.org/ 把这个放到浏览器搜索的时候自动换成https://registry.npmmirror.com/ 方案&#xff1a; npm cache clean --forcenpm config set registry https://registry…

C++ new 和 malloc 的区别?

相关系列文章 C new 和 malloc 的区别&#xff1f; C内存分配策略​​​​​​​ 目录 1.引言 2.区别 2.1.申请的内存分配区域 2.2.类型安全和自动大小计算 2.3.构造函数和析构函数的调用 2.4.异常处理 2.5.配对简便性 2.6.new 的重载 2.7.关键字和操作符 3.总结 1.引…

考研高数(导数的定义)

总结&#xff1a; 导数的本质就是极限。 函数在某点可导就必连续&#xff0c;连续就有极限且等于该点的函数值。 例题1&#xff1a;&#xff08;归结原则的条件是函数可导&#xff09; 例题2&#xff1a; 例题3&#xff1a;

简单工厂模式-Simple Factory Pattern

原文地址:https://jaune162.blog/design-pattern/simple-factory-pattern/ 简介 简单工厂模式是一种非常常用的设计模式,但是并不属于GoF中的23种设计模式。简单设计模式有很多种实现方式。 本文我们就来讨论简单工厂模式的实现方式,以及如何借助Spring实现一个扩展性很好…

手撕链表OJ

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

揭秘 2024 春晚刘谦魔术——代码还原

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、魔术大概流程 二、代码实现各个步骤 2.1 partition&#xff08;对半撕牌&#xff09; 2.2 bottom&#xff08;将 n 张牌置底…

【Linux】环境变量及相关指令

一、环境变量的基本概念 其实&#xff0c;我们早就听说过环境变量&#xff0c;比如在学习 JAVA / Python 的时候&#xff0c;会在 Windows 上配置环境变量&#xff1a; 环境变量到底是什么呢&#xff1f; 环境变量&#xff08;environment variables&#xff09;一般是指在操作…

C++ //练习 7.3 修改7.1.1节(第229页)的交易处理程序,令其使用这些成员。

C Primer&#xff08;第5版&#xff09; 练习 7.3 练习 7.3 修改7.1.1节&#xff08;第229页&#xff09;的交易处理程序&#xff0c;令其使用这些成员。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************…

CCF编程能力等级认证GESP—C++2级—20231209

CCF编程能力等级认证GESP—C2级—20231209 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)小杨做题小杨的 H 字矩阵 参考答案单选题判断题编程题1编程题2 …

【Apache Superset】从概述、安装到运用,一篇掌握!

文章目录 什么是 Superset&#xff1f;Superset 的优势安装安装 Anaconda 包管理工具创建 Superset 的 Python 环境 下载 Superset 依赖更新工具安装 Superset配置 MySQL 元数据库初始化 Superset 数据库报错一报错二报错三数据库初始化完成 初始化 Superset报错一警告信息 启动…

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型&#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么&#xff0c;什么是超参数优化呢&#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…

【算法设计与分析】反转链表 ||

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表…