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)