Linux中169.254.0.0/24的路由来自哪里
在Linux中,发现每次系统启动时,都会将(169.254.0.0/16)路由启动并将其添加到路由表中。但是并不知道这条路由具有什么功能和它到底来自于哪里?
[root@master01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.2 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
要想搞清楚路由(169.254.0.0/16)究竟来自哪里并且它的作用是什么?首先需要搞明白两个概念
zeroconf
“zeroconf”或“Zero Configuration Networking” 是一种无需额外配置即可自动创建IP地址网络的技术。也被称为 “Automatic Private IP Addressing”(APIPA)。
zeroconf规范的提出者是Apple公司,其目的是让非专业用户也可以便捷的连接各种网络设备,例如计算机,打印机等。整个搭建网络的过程都是自动实现。如果没有“zeroconf”,用户必须手动,或者利用对应的服务(例如DHCP、DNS)对网络进行配置。这些过程对非技术用户和新用户们来说是很一件难的事情。
zeroconf的出现是问了解决三个问题:
- 为网络设备自动分配可用IP地址
- 解析计算机主机名
- 自动发现网络服务(如打印机等)
zeroconf的地址选用
对于Link-local address,IPv4使用的特殊保留地址169.254.0.0/16,在RFC3927中所描述。作用是当DHCP客户端在超时和重试后扔找不到对应的DHCP服务器,它将随机从该网络(`169.254.0.0/16`)中获取地址。这样可以与无法获取DHCP地址的主机进行通信。
如何禁用zeroconf
要在系统引导期间禁用zeroconf路由,需要编辑/etc/sysconfig/network文件,配置以下内容
NETWORKING=YES
HOSTNAME=localhost.localdomain
NOZEROCONF=yes
169.254.0.0/16的应用
在calico中就使用了这个地址169.254.0.0/16
default via 169.254.1.1 dev eth0
169.254.1.1 dev eth0 scope link
这个IP地址169.254.1.1是默认的网关,但是整个网络中中没有一张网卡是这个地址。那么为何是这个地址?
如一个网络中设备D1 (192.168.0.2/24) 与设备D2 (192.168.1.2/24),D1和D2在相互通信时,D1先发送了ARP广播,请求D2的mac地址,但是由于两个设备处于不同网,也就是说D1的ARP请求会被R1拦截到,然后R1会封装自己的mac地址为目的地址发送一个ARP回应数据报给R1(善意的欺骗),然后R1就会代替D1去访问D2。
在Kubernetes Calico网络中,当一个数据包的目的地址不是本网络时,会先发起ARP广播,网关设置即169.254.1.1收到会将自己的mac地址返回给发送端,后续的请求由这个veth对进行完成,使用代理arp做了arp欺骗。这样做抑制了arp广播攻击,并且通过代理arp也可以进行跨网络的访问。
在容器内可以使用ethtool -S 来查看对端。这里使用的容器为sealloong/netbox,集成了常用的网络命令,作为网络故障排除容器使用。

实验:查找calico网络中169.254.1.1的应用
当从netbox02(10.244.140.69/32) ping netbox01(10.244.241.74/32)发现ARP包被抑制在容器内部,相应的mac地址为eth0的对端

而后根据路由交有tun0隧道进行IPIP封装,tun0为其隧道,隧道解包后发往对应的设备,而calico网络中会生成路由到对应的workload之上。


reference
wiki_zero-configuration-network
Linux中169.254.0.0/24的路由来自哪里的更多相关文章
- 在Linux中安装ASPNET.Core3.0运行时
# 以下示例适用于x64位runtime v3.0.0 mkdir /runtimes cd /runtimes wget https://download.visualstudio.microsof ...
- Linux中的do{...} while(0)
摘抄自: <<Linux设备驱动开发详解(第二版)>> 在 Linux 内核中,经常会看到do{} while(0)这样的语句,许多人开始都会疑惑,认为do{} while(0 ...
- LINUX中ORACLE 11.2.0.1 升级到11.2.0.4
11.2.0.4补丁号13390677,共7个文件,分别是 其中1&2是db,3是grid,4是client,5是gateways,6是example,7是deinstall 上传安装介质并解 ...
- linux中shell变量$#,$@,$*,$?,$$,$!,$_,$0,$1,$2的含义解释
变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) ...
- linux中shell变量$#,$@,$0,$1,$2的含义
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...
- linux中shell变量$#,$@,$0,$1,$2的含义解释
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...
- linux中shell变量$#,$@,$0,$1,$2的含义解释
linux中shell变量$#,$@,$0,$1,$2的含义解释 linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID ...
- Linux中Zabbix4.0的搭建
Zabbix简介 Zabbix是一个高度集成的企业级开源网络监控解决方案,与Cacti.nagios类似,提供分布式监控以及集中的web管理界面.zabbix具备常见商业监控软件所具备的功能,例如主机 ...
- Linux中shell变量$0,$?等含义
linux中shell变量$#,$@,$0,$1,$2的基本含义: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...
随机推荐
- 3,turicreate入门 - 优化回归模型,使得预测更准确
turicreate入门系列文章目录 1,turicreate入门 - jupyter & turicreate安装 2,turicreate入门 - 一个简单的回归模型 3,turicrea ...
- SpringBoot-13 Dubbo实战
SpringBoot-13 Dubbo实战 前提: 已经准备好Dubbo-admin和Zookeeper 前置准备 1.创建项目 显示创建一个Empty Project,创建两个Module---&g ...
- 使用 EPPlus 封装的 excel 表格导入功能 (.net core c#)
使用 EPPlus 封装的 excel 表格导入功能 前言 最近做系统的时候有很多 excel导入 的功能,以前我前后端都做的时候是在前端解析,然后再做个批量插入的接口 我觉着这样挺好的,后端部分可以 ...
- [.net] 关于Exception的几点思考和在项目中的使用(一)
本文链接 https://www.cnblogs.com/hubaijia/p/about-exceptions-1.html 关于exception的基本语法和作用,这里不再赘述,下面记录一下我在项 ...
- Redis解读(1):Redis安装启动及常见数据类型
Redis 简介 Redis 是我们在互联网应用中使用最广泛的一个 NoSQL 数据库,基于 C 开发的键值对存储数据库. Redis 这个名字是 Remote Dictionary Service ...
- 【pytest系列】- assert断言的使用
unittest断言方式是用过框架自己实现的,即self.assertEqual()等,当我们使用pytest框架后,这种断言方式是不可用的,因为测试类不会再继承unittest.TestCase类, ...
- NLP入门学习中关于分词库HanLP导入使用教程
大家好,时隔多年再次打开我的博客园写下自己的经验和学习总结,开园三年多,文章数少得可怜,一方面自己技术水平局限,另一方面是自己确实想放弃写博客.由于毕业工作的原因,经常性的加班以及仅剩下少的可怜的休息 ...
- Spring-@PostConstruct注解
@PostConstruct注解 @PostConstruct注解好多人以为是Spring提供的.其实是Java自己的注解. Java中该注解的说明:@PostConstruct该注解被用来修饰一个非 ...
- Python表达式进阶——列表表达式
x = 0 y = x*2 if x >= 0 else x print(y) # [表达式for变量in列表] l1 = [] l2 = [i for i in range(100) if i ...
- C#中普通缓存的使用
缓存的概念及优缺点在这里就不多做介绍,当然缓存包含多种有普通缓存.客户端缓存.DNS缓存.反向代理缓存以及分布式缓存等等.今天主要聊一聊C#通过编码来实现普通的缓存.话不多说直接上代码. 一.首先,新 ...