• Linux:169.254.0.0/24路由的来龙去脉


            在Linux中,发现每次系统启动时,都会将(169.254.0.0/16)路由启动并将其添加到路由表中。但是并不知道这条路由具有什么功能和它到底来自于哪里?

            要想搞清楚路由(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文件,配置以下内容

    1. NETWORKING=YES
    2. HOSTNAME=localhost.localdomain
    3. NOZEROCONF=yes

     169.254.0.0/16的应用

    在calico中就使用了这个地址169.254.0.0/16

    1. default via 169.254.1.1 dev eth0
    2. 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,集成了常用的网络命令,作为网络故障排除容器使用。

    删除link-local(169.254.0.0) 路由表项

            当系统配置为使用动态地址,而找不到DHCP服务器时,系统会为本机设置一个169.254.X.X的地址。这个路由表项是有zeroconf 协议Daemon 程序添加的,我们一般是用不到的。
            只是注释掉/etc/networks 里面的link-local 项是无法去掉该路由表项的,/etc/networks 与/etc/hosts文件的作用差不多,是用来关联网络号(数字格式)和网络名(字符格式)的,注释掉该条目后,只是169.254.0.0无法解析为网络名link-local了.

    删除

            可以用以下命令来删除zeroconf 相关的程序包

    sudo apt-get remove avahi-autoipd –purge

    下次启动机器后这条路由就不会自动出现了.

    CentOS删除 link-local

    关于zeroconf的作用看APIPA(自动专用IP寻址)

    1、如果需要全局关闭

    1. sed -i ‘$a NOZEROCONF=yes' /etc/sysconfig/network
    2. /etc/init.d/network restart

     2、需要单个网卡关闭

    1. sed -i '$a NOZEROCONF=yes' /etc/sysconfig/network-scripts/ifcfg-网卡编号
    2. /etc/init.d/network restart

  • 相关阅读:
    优维低代码实践:片段
    人工神经网络算法的应用,人工神经网络是算法吗
    5G边缘计算网关 是什么?
    Elasticsearch深入理解(六) —— 如何处理并发冲突
    B49 - 基于STM32单片机的心率血氧检测与远程定位报警装置
    事务回滚异常
    【Shell篇<Ⅲ>】——shell函数、字符串的处理
    工作流编排引擎-Temporal
    Python利用torch.max函数计算一批特征图中每个通道的最大值
    【深度学习】优化器详解
  • 原文地址:https://blog.csdn.net/hhd1988/article/details/126244401