Linux上的物理网卡与虚拟网络设备

Linux上的物理网卡与虚拟网络设备,第1张

通过 ip link add 可以创建多种类型的虚拟网络设备,在 man ip link 中可以得知有以下类型的device:

Virtual Ethernet Port Aggregator。它是HP在虚拟化支持领域对抗Cisco的VN-Tag的技术。

解决了虚拟机之间网络通信的问题,特别是位于同一个宿主机内的虚拟机之间的网络通信问题。

VN-Tag在标准的协议头中增加了一个全新的字段,VEPA则是通过修改网卡驱动和交换机,通过发夹弯技术回注报文

TUN是Linux系统里的虚拟网络设备,它的原理和使用在 Kernel Doc 和 Wiki 做了比较清楚的说明。

TUN设备模拟网络层设备(network layer),处理三层报文,IP报文等,用于将报文注入到网络协议栈。

应用程序(app)可以从物理网卡上读写报文,经过处理后通过TUN回送,或者从TUN读取报文处理后经物理网卡送出。

创建:

创建之后,使用 ip addr 就会看见一个名为”tun-default”的虚拟网卡

可以对tun-default设置IP:

使用open/write等文件 *** 作函数从fd中进行读取 *** 作,就是在收取报文,向fd中写入数据,就是在发送报文。

TAP是Linux系统里的虚拟网络设备,它的原理和使用在 Kernel Doc 和 Wiki 做了比较清楚的说明。

不同于TUN的是,TAP设备模拟链路层设备(link layer),处理二层报文,以太网帧等。

TAP设备的创建过程和TUN类似,在ioctl设置的时候,将类型设置为IFF_TAP即可。

TAP设备与TUN设备的区别在于:

有时我们可能需要一块物理网卡绑定多个 IP 以及多个 MAC 地址,虽然绑定多个 IP 很容易,但是这些 IP 会共享物理网卡的 MAC 地址,可能无法满足我们的设计需求,所以有了 MACVLAN 设备,其工作方式如下:

MACVLAN 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡。单独使用 MACVLAN 好像毫无意义,但是配合之前介绍的 network namespace 使用,我们可以构建这样的网络:

采摘

创建一个基于eth0的名为macv1的macvlan网卡:

macvlan支持三种模式,bridge、vepa、private,在创建的时候设置“mode XXX”:

bridge模式,macvlan网卡和物理网卡直接可以互通,类似于接入到同一个bridge。

vepa模式下,两个macvlan网卡直接不能直接通信,必须通过外部的支持“发夹弯”交换机才能通信。

private模式下,macvlan发出的广播包(arp等)被丢弃,即使接入了支持“发夹弯”的交换机也不能发现其它macvlan网卡,除非手动设置mac。

MACVTAP 是对 MACVLAN的改进,把 MACVLAN 与 TAP 设备的特点综合一下,使用 MACVLAN 的方式收发数据包,但是收到的包不交给 network stack 处理,而是生成一个 /dev/tapX 文件,交给这个文件:

由于 MACVLAN 是工作在 MAC 层的,所以 MACVTAP 也只能工作在 MAC 层,不会有 MACVTUN 这样的设备。

ipvlan和macvlan的区别在于它在ip层进行流量分离而不是基于mac地址,同属于一块宿主以太网卡的所有ipvlan虚拟网卡的mac地址都是一样的。

[图片上传失败...(image-d98b6f-1597455459947)]

veth设备是成对创建的:

创建之后,执行 ip link 就可以看到新创建的veth设备:

注意veth设备前面的ID, 58: 和 59: ,一对veth设备的ID是相差1的,并且系统内全局唯一。可以通过ID找到一个veth设备的对端。

veth设备理解

Intermediate Functional Block device,连接 ifb 中做了很详细的介绍。

若系统中安装了 VMWare 或者某些 VPN 客户端软件,则会出现若干虚拟网卡。它们在形式上与物理网卡几乎没有区别。 ipconfig 将它们与本地物理网卡等同对待。 那如何在如何区分虚拟网卡还是物理网卡呢?

有些人建议使用 MAC 地址中的 "locally administread bit" 来区分。但是事实上不能100%区分,在win2000之后的系统基本是行不通的。

http://hi.baidu.com/xzq2000/blog/item/43b686d672cd762f07088b95.html

有人用GetAdaptersInfo 可以获得本机所有网卡的信息,然后通过判断是否“pci”开头来区分是否虚拟网卡。http://blog.csdn.net/aseity/archive/2007/12/11/1929948.aspx 具体代码如下:(以下代码引用别处)

bool IsLocalAdapter ( const char *pAdapterName ) const

...{

BOOL ret_value = FALSE

#define NET_CARD_KEY "System\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}"

char szDataBuf[MAX_PATH+1]

DWORD dwDataLen = MAX_PATH

DWORD dwType = REG_SZ

HKEY hNetKey = NULL

HKEY hLocalNet = NULL

if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, NET_CARD_KEY, 0, KEY_READ, &hNetKey))

return FALSE

sprintf(szDataBuf, "%s\Connection", pAdapterName)

if(ERROR_SUCCESS != RegOpenKeyEx(hNetKey ,szDataBuf ,0 ,KEY_READ, &hLocalNet))

...{

RegCloseKey(hNetKey)

return FALSE

}

if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "MediaSubType", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))

...{

goto ret

}

if (*((DWORD *)szDataBuf)!=0x01)

goto ret

dwDataLen = MAX_PATH

if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "PnpInstanceID", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))

...{

goto ret

}

if (strncmp(szDataBuf, "PCI", strlen("PCI")))

goto ret

ret_value = TRUE

ret:

RegCloseKey(hLocalNet)

RegCloseKey(hNetKey)

return ret_value!=0

}

这样方法基本可以达到目标,但是也存在不能识别所有网卡类型。

还有一种更简单,而且可以100%识别的方法,就是通过“Characteristics”这个值来确定网卡的类型是虚拟网卡还是物理网卡。

Characteristics 值在注册表

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\数字下。

在windows中,Characteristics 的取值如下,Characteristics项可以有1个或多个如下的值(多值应计算总和):

十六进制值 名字 描述

ox1 NCF_VIRTUAL 说明组件是个虚拟适配器

ox2 NCF_SOFTWARE_ENUMERATED 说明组件是一个软件模拟的适配器

ox4 NCF_PHYSICAL 说明组件是一个物理适配器

ox8 NCF_HIDDEN 说明组件不显示用户接口

ox10 NCF_NO_SERVICE 说明组件没有相关的服务(设

备驱动程序)

ox20 NCF_NOT_USER_REMOVABLE 说明不能被用户删除(例如,

通过控制面板或设备管理器)

ox40 NCF_MULTIPORT_INSTANCED_ADAPTER 说明组件有多个端口,每个端

口作为单独的设备安装。每个

端口有自己的hw_id(组件ID)

并可被单独安装,这只适合于

EISA适配器

ox80 NCF_HAS_UI 说明组件支持用户接口(例如,

Advanced Page或Customer

Properties Sheet)

ox400 NCF_FILTER 说明组件是一个过滤器

从上面可以看出来,只要用户判断“Characteristics ”的值就可以判断网卡是虚拟网卡还是物理网卡。

如果是虚拟网卡:Characteristics &NCF_VIRTUAL ==NCF_VIRTUAL

如果是物理网卡:Characteristics &NCF_PHYSICAL ==NCF_PHYSICAL

简单的说,物理网卡就是硬件,虚拟网卡是软件;详细点说,物理网卡就是安装在电脑主板上的有线或无线网卡,每块物理网卡都有不同的且唯一的物流地址(MAC地址);虚拟网卡,则是通过软件模拟网络环境,构建的虚拟网络适配器,一般是Microsoft Loopback Adapter,通过VPN技术实现虚拟网卡间的局域网通信。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8561016.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-18
下一篇 2023-04-18

发表评论

登录后才能评论

评论列表(0条)

保存