在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
”或“Zero Configuration Networking
” 是一种无需额外配置即可自动创建IP地址网络的技术。也被称为 “Automatic Private IP Addressing
”(APIPA)。
zeroconf规范的提出者是Apple公司,其目的是让非专业用户也可以便捷的连接各种网络设备,例如计算机,打印机等。整个搭建网络的过程都是自动实现。如果没有“zeroconf
”,用户必须手动,或者利用对应的服务(例如DHCP、DNS)对网络进行配置。这些过程对非技术用户和新用户们来说是很一件难的事情。
zeroconf的出现是问了解决三个问题:
为网络设备自动分配可用IP地址
解析计算机主机名
自动发现网络服务(如打印机等)
对于Link-local address,IPv4使用的特殊保留地址169.254.0.0/16
,在RFC3927中所描述。作用是当DHCP客户端在超时和重试后扔找不到对应的DHCP服务器,它将随机从该网络(`169.254.0.0/16`)中获取地址。这样可以与无法获取DHCP地址的主机进行通信。
要在系统引导期间禁用zeroconf路由,需要编辑/etc/sysconfig/network
文件,配置以下内容
NETWORKING=YES
HOSTNAME=localhost.localdomain
NOZEROCONF=yes
在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
,集成了常用的网络命令,作为网络故障排除容器使用。
当从netbox02(10.244.140.69/32) ping netbox01(10.244.241.74/32)发现ARP包被抑制在容器内部,相应的mac地址为eth0的对端
而后根据路由交有tun0隧道进行IPIP封装,tun0为其隧道,隧道解包后发往对应的设备,而calico网络中会生成路由到对应的workload之上。
reference
手机扫一扫
移动阅读更方便
你可能感兴趣的文章