dummy 網卡的作用
dummy網卡 (dummy network interface)用於在斷網的環境下,假裝網絡可以通,仍然可以通過類似 192.168.1.1 這樣的IP 訪問服務。因為斷網環境下只有本地環回地址127.0.0.1能被內核解析,因此如果想要解析 192.168.1.1 這種IP,就要將其設置為 dummy類型。
創建 dummy 網卡
比如我們這里為 169.254.20.10 和 10.96.0.10 創建dummy 類型的網卡 (這里對 IP 沒有要求,可以不是私有 IP),使用如下命令:
$ sudo ip link add nodelocaldns type dummy
$ sudo ip addr add 169.254.20.10 dev nodelocaldns
$ sudo ip addr add 10.96.0.10 dev nodelocaldns
結果如下圖所示:
創建網卡后,就可以本地 ping 通了。
$ ping 169.254.20.10
PING 215.254.2.10 (215.254.2.10) 56(84) bytes of data.
64 bytes from 215.254.2.10: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 215.254.2.10: icmp_seq=2 ttl=64 time=0.058 ms
$ ping 10.96.0.10
PING 10.96.0.10 (10.96.0.10) 56(84) bytes of data.
64 bytes from 10.96.0.10: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 10.96.0.10: icmp_seq=2 ttl=64 time=0.050 ms
刪除 dummy 網卡
$ sudo ip link delete nodelocaldns
dummy 網卡的實際應用
dummy 接口的工作方式和 loopback 接口類似,但是你可以創建任意多的 dummy 接口。它提供路由數據包的功能,但實際上又不進行轉發。dummy 接口主要有兩個用途:
- 用於主機內的程序通信
- 在擁有多個物理接口的網絡上,可以將 service 地址設置為 loopback 接口或 dummy 接口的地址,這樣 service 地址不會因為物理接口的狀態而受影響。
細心的同學可能發現了前面創建的網卡名稱是 nodelocaldns ,沒錯就是 k8s 里面的 local dns 的網卡,k8s 的 local dns 正是使用了這種分布式的 IP 的能力實現的,每台機器上面都可以有這樣一個本地的網卡。
再舉一個例子。例如,考慮筆記本電腦vlite,它目前一直與任何網絡斷開連接。vlite上的應用程序現在可能想要向同一主機上的另一個應用程序發送一些數據。在/etc/hosts中查找vlite會得到一個ip地址 191.72.1.65,因此應用程序嘗試發送到這個地址。由於本地環回接口(127.0.0.1) 是當前機器上唯一活動的接口,內核不知道 191.72.1.65 這個地址實際上就是指 vlite 它自己! 因此,內核會丟棄這個數據包,並向應用程序返回一個錯誤。這就是 dummy 網卡可以介入的地方。它通過簡單地充當另一個環回接口來解決這個困境。在vlite的情況下,只需給它一個地址191.72.1.65,並添加一個指向它的主機路由。然后,191.72.1.65的每個數據報將在本地傳遞。
參考文章
dummy網卡 - 人艱不拆_zmc - 博客園 (cnblogs.com)
The Dummy Interface (tldp.org)