原來有一段時間在做擴充產品的VLAN個數,然后就遇到過一個問題:說這個Linux的默認配置里,會為每一個網絡接口添加一個link-local的地址,就是FE80::開頭的地址,在RFC-4291里有如下的定義:
Link-Local unicast 1111111010 FE80::/10 2.5.6
而這個配置是網絡接口級別的一個配置,可用使用ip命令來做修改,如:ip link set dev X addrgenmode none。如果設置為none,就是不要自動產生link-local地址。其他模式:
支持的模式:eui64 |none |stable_secret |random
eui64: use a Modified EUI-64 format interface identifier
none: disable automatic address generation
stable_secret: generate the interface identifier based on preset /proc/sys/net/ipv6/conf/{default,DEV}/stable_secret
random: like stable_secret, but auto-generate a new random secret if none is set
另一個產生問題的必要條件是,Linux系統會默認為每一條link-local地址,創建一個路由記錄到這個地址。如下:
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth1 proto kernel metric 256 pref medium
fe80::/64 dev eth1.61 proto kernel metric 256 pref medium
這時候如果要在虛擬機上添加4096個VLAN接口的話,就會有4096個link-local地址,也會生成4096個相關的路有記錄,然后就會導致Linux內核里的一系列的問題,尤其是在netlink的處理上,是一個不小的負擔。
為了解決這個問題,還想著不行就把這個local-link的IP地址刪掉,不讓它自動生成,就不會存在這個路由記錄。就不會有著netlink的負擔。當時感覺感動太大,沒敢這么改,如果當時這么改,肯定會遇到很多問題。
最近看IPv6的ND的時候發現,這個link-local的地址還有其他作用,也就是如果刪掉會有副作用。比如ND協議,源地址選擇協議等等,里面都有提到這個地址的用途。現在想想還有些后怕,幸虧沒有刪掉這個地址。
最后是通過一個netlink的優化選項解決的路由太多的問題。設置netlink的socket選項:
https://mzhan017.blog.csdn.net/article/details/120567610
if (setsockopt(nl_socket, SOL_NETLINK, NETLINK_DUMP_STRICT_CHK, &optval, sizeof(optval)) < 0) {