韦德国际1946:何以区分虚构网卡和物理网卡,包

作者: 韦德国际1946  发布:2019-10-02

简介

在Socket编制程序的时候,我们须求实时获取大家所急需的IP地址。比如在编制后门的时候,我们兴许须要得到有效的外网IP或内网IP;有时候大家可能需求看清大家获得的是还是不是是虚构机网卡,那时候就必要对每一张网卡上的表征实行甄别。以下作者计算了一部分常用的拍卖方法供大家仿照效法。


参考资料:1. 领取网卡消息方法
              2. 韦德国际1946:何以区分虚构网卡和物理网卡,包蕴内外网筛选。编造与物理网卡区分方法

一、什么是情理网卡和编造网卡?

图示如下:中蓝部分含有VMWare的为虚拟网卡。 
韦德国际1946 1 
常备,大家布署VMWare设想机、VMSphere设想集群、XenCenter设想集群是都会涉嫌虚构网卡。 
韦德国际1946 2

Linux下双概略网卡设置成虚构网卡

为了提供网络的高可用大家供给将多块网卡绑定设置成一块虚构的网卡对外提供劳动,那样能够免守一块网卡损坏可能堤防网线连接故障导致的接连中断。

上面在Linux下大家应用eth0与eth1来虚构成为bond0为例:------绑定的前提条件:晶片组型号同样,何况网卡应该具备本身独自的BIOS集成电路。

操作平台:OLE Linux 6.6

1、创立设想互连网接口配置文件ifcfg-bond0,并点名网卡IP:vi /etc/sysconfig/ network-scripts/ifcfg-bond0

cat /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0

BOOTPROTO=static

IPADDR=10.0.11.10

NETMASK=255.255.252.0

GATWAY=10.0.11.1

ONBOOT=yes

USERCTL=no

TYPE=Ethernet

2、分别修改ifcfg-eth0和ifcfg-eth1-----不能安装有关IP,网关,子网掩码等音信。

cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=dhcp

ONBOOT=yes

USERCTL=no

MASTER=bond0

SLAVE=yes

TYPE=Ethernet

cat /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

BOOTPROTO=dhcp

ONBOOT=yes

USERCTL=no

MASTER=bond0

SLAVE=yes

TYPE=Ethernet

3、因为设想网卡实在内核模块中贯彻的,所以需求设置有module,在/etc/modules.conf中增添如下内容,以使系统在运行时加载bonding模块,对外编造互连网接口设备为 bond0。
加盟下列两行
alias bond0 bonding
options bond0 miimon=100 mode=0 --- 0象征两块物理网卡是以载重均衡的不二等秘书技运营。

注:miimon是用来展开链路监测的。比方:miimon=100,那么系统每100ms监测三次链路连接景况,就算有一条线路短路就转入另一条路径;mode的值表示工作格局,他共有0,1,2,3种种情势,常用的为0,1二种。

mode=0表示load balancing (round-robin)为负载均衡格局,两块网卡都地处active状态。

mode=1表示fault-tolerance (active-backup)提供冗余成效,便是说默许意况下唯有一块网卡处于active,另一块做备份.

设若利用此情势则:options bond0 miimon=100 mode=1 primary=eth0---表示eth0为active状态,eth1为备用状态。

bonding只可以提供链路监测,即从主机到沟通机的链路是或不是衔接。借使只是沟通机对外的链路down掉了,而调换机本人并不曾故障,那么bonding会以为链路未有毛病而继续使用

4、在/etc/rc.local中增多如下命令。
cat /etc/rc.local

modprobe bonding miimon=100 mode=0

配备完成重启主机. 
Bringing up interface bond0 OK
Bringing up interface eth0 OK
Bringing up interface eth1 OK

本文恒久更新链接地址:

为了提供网络的高可用大家须求将多块网卡绑定设置成一块虚构的网卡对外提供劳务,那样能够幸免一块...

Linux下双物理网卡设置成设想网卡

为了提供互连网的高可用大家须求将多块网卡绑定设置成一块虚构的网卡对外提供劳务,那样可以免范一块网卡损坏可能堤防网线连接故障导致的一连中断。

下边我们利用eth0与eth1来虚构成为bond0为例:------绑定的前提条件:集成电路组型号一样,而且网卡应该具备自身独自的BIOS晶片.

操作平台:OLE Linux 6.6

1、创制设想网络接口配置文件ifcfg-bond0,并点名网卡IP:vi /etc/sysconfig/ network-scripts/ifcfg-bond0

cat /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0

BOOTPROTO=static

IPADDR=10.0.11.10

NETMASK=255.255.252.0

GATWAY=10.0.11.1

ONBOOT=yes

USERCTL=no

TYPE=Ethernet

2、分别修改ifcfg-eth0和ifcfg-eth1-----无法安装有关IP,网关,子网掩码等音信。

cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=dhcp

ONBOOT=yes

USERCTL=no

MASTER=bond0

SLAVE=yes

TYPE=Ethernet

cat /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

BOOTPROTO=dhcp

ONBOOT=yes

USERCTL=no

MASTER=bond0

SLAVE=yes

TYPE=Ethernet

3、因为设想网卡实在内核模块中贯彻的,所以供给设置有module,在/etc/modules.conf中加多如下内容,以使系统在运维时加载bonding模块,对外编造互连网接口设备为 bond0。

加盟下列两行
alias bond0 bonding
options bond0 miimon=100 mode=0 --- 0象征两块物理网卡是以载重均衡的章程运营。

注:miimon是用来张开链路监测的。比方:miimon=100,那么系统每100ms监测三遍链路连接情状,即使有一条线路短路就转入另一条路径;mode的值表示工作形式,他共有0,1,2,3四种格局,常用的为0,1二种。

mode=0表示load balancing (round-robin)为负载均衡情势,两块网卡都远在active状态。

mode=1表示fault-tolerance (active-backup)提供冗余功效,就是说私下认可情况下唯有一块网卡处于active,另一块做备份.

设若采取此格局则:options bond0 miimon=100 mode=1 primary=eth0---表示eth0为active状态,eth1为备用状态。

bonding只可以提供链路监测,即从主机到交流机的链路是或不是衔接。如若只是交换机对外的链路down掉了,而交流机本身并从未故障,那么bonding会以为链路没不寻常而一而再利用

4、在/etc/rc.local中增多如下命令。

cat /etc/rc.local

modprobe bonding miimon=100 mode=0

计划实现重启主机.
Bringing up interface bond0 OK
Bringing up interface eth0 OK
Bringing up interface eth1 OK

韦德国际1946 3

为了提供网络的高可用大家必要将多块网卡绑定设置成一块虚构的网卡对外提供服务,那样可避防备一块...

C 代码样例

二、辨别物理网卡和编造网卡的施用场景

场景一:日常安顿设想集群的时候会用到。 
意况二:通过抓包剖判数据央求来源是情理网卡发出的数据包,依旧虚拟网卡地址爆发的包时候会用到。辨识都以经过mac地址区分的。 
气象三:其他急需区分网卡的光景。

1. 头文件(包罗特征管理函数)

/////////////////////////////////////////
//
// FileName : NetInfoProc.h
// Creator : PeterZ
// Date : 2018-6-21 23:50
// Comment : 网卡信息筛选
// Editor : Visual Studio 2017
//
/////////////////////////////////////////

#pragma once

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <strsafe.h>
#include <WinSock2.h>
#include <Iphlpapi.h>
#include <cstring>

#pragma comment(lib,"Iphlpapi.lib")

using namespace std;

#define REG_ERROR -2
#define NO_PCI -1
#define IS_PCI 0


/**
 * @brief 查看字符串中是否有指定特征串
 * @param source 指向源字符串的指针
 * @param target 指向目标字符串的指针
 */
BOOL IsInString(LPCSTR source, LPCSTR target)
{
    if (source == NULL && target == NULL)
    {
        return false;
    }
    const size_t targetLength = strlen(target);
    const size_t sourceLength = strlen(source);

    if (sourceLength >= targetLength)
    {
        for (int i = 0; i < strlen(source); i  )
        {
            if (i   targetLength > sourceLength)
            {
                return false;
            }
            for (int j = 0; j < targetLength; j  )
            {
                if (*(source   i   j) != *(target   j))
                {
                    break;
                }
                if (j == targetLength - 1)
                {
                    return true;
                }
            }
        }
    }
    return false;
}

/**
 * @brief 获取注册表数据
 * @param hRoot 根键
 * @param szSubKey 子键
 * @param szValueName 数据项名
 * @param szRegInfo 数据
 */
BOOL GetRegInfo(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szValueName, LPSTR szRegInfo)
{
    HKEY hKey;
    DWORD dwType = REG_SZ;
    DWORD dwLenData = strlen(szRegInfo);
    LONG lRes = RegCreateKeyEx(hRoot, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
    if (lRes != ERROR_SUCCESS)
    {
        if (lRes == 5)
        {
            printf("Please use Administrator Privilege !n");
        }
        else
        {
            printf("Get Register Info Error! Error Code is ");
            printf("%ldn", lRes);
        }
        RegCloseKey(hKey);
        RegCloseKey(hRoot);
        return false;
    }
    RegQueryValueEx(hKey, szValueName, 0, &dwType, NULL, &dwLenData);
    lRes = RegQueryValueEx(hKey, szValueName, 0, &dwType, (LPBYTE)szRegInfo, &dwLenData);
    if (lRes != ERROR_SUCCESS)
    {
        RegCloseKey(hKey);
        RegCloseKey(hRoot);
        return false;
    }
    RegCloseKey(hKey);
    RegCloseKey(hRoot);
    return true;
}

/**
 * @brief 验证注册信息是否是PCI物理网卡(需要以管理员权限运行程序)
 * @param pIpAdapterInfo 指向网卡数据的指针
 */
int IsPCINetCard(const PIP_ADAPTER_INFO pIpAdapterInfo)
{
    //通过注册表特征去除非物理网卡
    CHAR szRegSubKey[255] = "SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\";
    CHAR szNetCardRegInfo[255] = "\0";
    StringCchCat(szRegSubKey, sizeof(szRegSubKey), pIpAdapterInfo->AdapterName);
    StringCchCat(szRegSubKey, sizeof(szRegSubKey), "\Connection");
    if (!GetRegInfo(HKEY_LOCAL_MACHINE, szRegSubKey, "PnPInstanceId", szNetCardRegInfo))
    {
        return REG_ERROR;
    }
    if (strncmp(szNetCardRegInfo, "PCI", 3) == 0) return IS_PCI;
    else return NO_PCI;

}


/**
 * @brief 验证是否是虚拟网卡
 * @param pIpAdapterInfo 指向网卡数据的指针
 */
BOOL IsVirtualNetCard(const PIP_ADAPTER_INFO pIpAdapterInfo)
{
    //去除有特征名的虚拟网卡
    if (IsInString(strlwr(pIpAdapterInfo->Description), "virtual")) return true;
    //去除有MAC的虚拟网卡 vmware
    if (pIpAdapterInfo->Address[0] == 0x00 && pIpAdapterInfo->Address[1] == 0x05 && pIpAdapterInfo->Address[2] == 0x69) return true;
    //去除有MAC的虚拟网卡 vmware
    if (pIpAdapterInfo->Address[0] == 0x00 && pIpAdapterInfo->Address[1] == 0x0C && pIpAdapterInfo->Address[2] == 0x29) return true;
    //去除有MAC的虚拟网卡 vmware
    if (pIpAdapterInfo->Address[0] == 0x00 && pIpAdapterInfo->Address[1] == 0x50 && pIpAdapterInfo->Address[2] == 0x56) return true;
    //去除有MAC的虚拟网卡 vmware
    if (pIpAdapterInfo->Address[0] == 0x00 && pIpAdapterInfo->Address[1] == 0x1C && pIpAdapterInfo->Address[2] == 0x14) return true;
    //去除有MAC的虚拟网卡 parallels
    if (pIpAdapterInfo->Address[0] == 0x00 && pIpAdapterInfo->Address[1] == 0x1C && pIpAdapterInfo->Address[2] == 0x42) return true;
    //去除有MAC的虚拟网卡 microsoft virtual pc
    if (pIpAdapterInfo->Address[0] == 0x00 && pIpAdapterInfo->Address[1] == 0x03 && pIpAdapterInfo->Address[2] == 0xFF) return true;
    //去除有MAC的虚拟网卡 virtual iron
    if (pIpAdapterInfo->Address[0] == 0x00 && pIpAdapterInfo->Address[1] == 0x0F && pIpAdapterInfo->Address[2] == 0x4B) return true;
    //去除有MAC的虚拟网卡 red hat xen , oracle vm , xen source, novell xen
    if (pIpAdapterInfo->Address[0] == 0x00 && pIpAdapterInfo->Address[1] == 0x16 && pIpAdapterInfo->Address[2] == 0x3E) return true;
    //去除有MAC的虚拟网卡 virtualbox
    if (pIpAdapterInfo->Address[0] == 0x08 && pIpAdapterInfo->Address[1] == 0x00 && pIpAdapterInfo->Address[2] == 0x27) return true;
    return false;
}


/**
 * @brief 验证是否是0.0.0.0不可用IP
 * @param pIpAdapterInfo 指向网卡数据的指针
 */
BOOL IsInvalidIp(const PIP_ADAPTER_INFO pIpAdapterInfo)
{
    IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
    do
    {
        if (!strcmp(pIpAddrString->IpAddress.String, "0.0.0.0"))
        {
            return false;
        }
        if ((pIpAddrString = pIpAddrString->Next) == NULL)
        {
            return true;
        }
    } while (pIpAddrString);
    return true;
}

/**
* @brief 验证是否是内网IP
* @param pIpAdapterInfo 指向网卡数据的指针
*/
BOOL IsIntranetIP(const PIP_ADAPTER_INFO pIpAdapterInfo)
{
    IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
    do
    {
        if (strncmp(pIpAddrString->IpAddress.String, "10", 2) == 0 || (strncmp(pIpAddrString->IpAddress.String, "172.16", 6) > 0 && strncmp(pIpAddrString->IpAddress.String, "172.31", 6) < 0) || strncmp(pIpAddrString->IpAddress.String, "192.168", 7) == 0)
        {
            return true;
        }
        if ((pIpAddrString = pIpAddrString->Next) == NULL)
        {
            return false;
        }
    } while (pIpAddrString);
    return true;
}

三、 如何区分物理网卡和设想网卡呢?

本文由韦德国际1946发布于韦德国际1946,转载请注明出处:韦德国际1946:何以区分虚构网卡和物理网卡,包

关键词: Windows-Netw

上一篇:【韦德国际1946】磁盘分配的定额
下一篇:没有了