在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