玩转网卡MAC地址

2009/6/24 来源:www.arpun.com 作者:小白

人们经常感叹世界上没有完美的事物, 但又忍不住努力去挑战完美极限, 因为人们知道追求完美, 取得进步的过程才真的是一种完美体验。 我们众多的网络爱好者在探讨技术方面更是如此, 这也正是我们所应鼓励的学习方式!

  正文:  

  看过赵馨发表在天极的文章《MAC地址完美攻略》, 觉得作者思路清晰, 文章结构简练, 技术观点明确, 但是对某些技术细节的描述似乎单薄了点, 容易引起误会, 技术在不断的进步, 本文从设备原理描述和网络应用的角度重新阐述了作者对MAC的认知, 和赵馨的文章中某些提法不相同, 希望起到抛砖引玉的作用。 网卡和交换机是常见的组网设备, 网卡和交换机功能的实现需要MAC支撑, 操作系统依赖网卡驱动程序和MAC打交道, 进而通过网卡和交换机等网络设备完成网络通讯, MAC在网络安全中也扮演了重要角色。

  一、网卡、MAC控制器和MAC地址

  提到MAC不得不涉及网卡的工作原理, 网卡工作在OSI参考模型的数据链路层和网络层。 这里又出现了一个概念“OSI参考模型”, 在这个模型中定义了网络通讯是分层的, 分别是物理层, 数据链路层, 网络层, 传输层, 会话层, 表示层, 应用层。 以太网数据链路层其实包含MAC(介质访问控制)子层和LLC(逻辑链路控制)子层。

   玩转网卡MAC地址

  物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等, 并向数据链路层设备提供标准接口。 数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。 以太网卡中数据链路层的芯片一般简称之为MAC控制器, 物理层的芯片简称之为PHY。 许多网卡的芯片把MAC和PHY的功能做到了一颗芯片中, 比如Intel 82559网卡的和3COM3C905网卡。 但是MAC和PHY的机制还是单独存在的, 只是外观的表现形式是一颗单芯片。 当然也有很多网卡的MAC和PHY是分开做的, 比如D-LINK的DFE-530TX等, 原文中说“MAC地址对应物理层”是不确切的。

  通常提到的MAC指狭义的MAC地址, 其实在网卡中, 一块以太网卡MAC芯片的作用不但要实现MAC子层和LLC子层的功能, 还要提供符合规范的PCI界面以实现和主机的数据交换。 以太网MAC芯片的一端接计算机PCI总线, 另外一端就接到PHY芯片上。 MAC从PCI总线收到IP数据包(或者其他网络层协议的数据包)后, 将之拆分并重新打包成最大1518Byte, 最小64Byte的帧。 这个帧里面包括了目标MAC地址、自己的源MAC地址和数据包里面的协议类型(比如IP数据包的类型用80表示)。 最后还有一个DWORD(4Byte)的CRC码。

  网卡上有一颗EEPROM芯片, 通常是一颗93C46。 里面记录了网卡芯片的供应商ID、子系统供应商ID、网卡的MAC地址、网卡的一些配置, 如SMI总线上PHY的地址, BOOTROM的容量, 是否启用BOOTROM引导系统等东西。

  认识一下它们

  

玩转网卡MAC地址

  

MAC和PHY集成在一颗芯片的以太网卡

  ①RJ-45接口②Transformer(隔离变压器)③PHY芯片

  ④MAC芯片⑤EEPROM⑥BOOTROM插槽

  ⑦WOL接头⑧晶振⑨电压转换芯片

  ⑩LED指示灯

  二、交换机、MAC地址表和MAC地址学习

  对于网络交换机来说, MAC地址表是其能否正确转发数据包的关键, 为此, 协议标准RFC2285和RFC2889中都对以太网交换机的MAC地址表深度和MAC地址学习速度进行专门的描述。 MAC地址表显示了主机的MAC地址与以太网交换机端口映射关系, 指出数据帧去往目的主机的方向。 当以太网交换机收到一个数据帧时, 将收到数据帧的目的MAC地址与MAC地址表进行查找匹配。 如果在MAC地址表中没有相应的匹配项, 则向除接收端口外的所有端口广播该数据帧, 有人将这种操作翻译为泛洪(Flood, 泛洪操作广播的是普通数据帧而不是广播帧)。 在我们测试过的交换机中, 有的除了能够对广播帧的转发进行限制之外, 也能对泛洪这种操作进行限制。

  而当MAC地址表中有匹配项时, 该匹配项指定的交换机端口与接收端口相同则表明该数据帧的目的主机和源主机在同一广播域中, 不通过交换机可以完成通信, 交换机将丢弃该数据帧。 否则, 交换机将把该数据帧转发到相应的端口。 交换机还将检查收到数据帧的源MAC地址, 并查找MAC地址表中与之相匹配的项。 如果没有, 交换机将记录该MAC地址和接收该数据帧的端口, 并激活一个定时器。 这个过程被称作地址学习。 这个定时器一般就是我们在配置交换机时的AgeTime选项, 一般我们都可以配置这一定时器的时间长度。 在定时器到时的时候, 该项记录将从MAC地址表中删除。 而如果接收的数据帧的源MAC地址在MAC地址表中有匹配项, 交换机将复位该地址的定时器。

  三、IP地址、MAC地址和三层交换技术

  一台计算机想要接入到网络中, 必须要有两个地址。 一个是网卡的地址, 也就是MAC地址。 在以太网中, 我们通过MAC地址来进行数据传送和数据交换。 在以太网环境中, 数据会分帧传送, 每一个数据帧都会包含自己的MAC和目的MAC地址信息; 另外一个地址是平时所说的IP地址, 定义在网络层, 每一台网络计算机都会有一个或者多个IP地址, 这是一个虚拟的数据, 并且可以随时更改。 在硬件层次上进行的数据帧交换必须有正确的接口地址。 但是, TCP/IP有自己的地址: 32 bit的IP地址。 知道主机的IP地址并不能让内核发送一帧数据给主机。 内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。 ARP的功能是在32 bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。 点对点链路不使用ARP。 当设置这些链路时(一般在引导过程进行), 必须告知内核链路每一端的IP地址。 像以太网地址这样的硬件地址并不涉及。

  IP地址和MAC地址是同时使用的, 在数据传送过程中, 一个完整的TCP/IP包需要由以太网进行数据封装, 数据分帧, 最后再通过物理层传输到目标计算机。 在以太网封装上层的TCP/IP包的时候, 它需要知道源MAC地址和目的MAC地址, 但是我们只能给出一个对方的IP地址, 这个时候就需要一个协议来支持IP到MAC的转换, 这就是ARP,Address Resolution Protocol. ARP协议是介乎于网络层和数据链路层的一个协议。 第一次传送某个目的IP地址的数据的时候, 先会发出一个ARP包, 其MAC的目标地址是广播地址, 里面说到:"谁是xxx.xxx.xxx.xxx这个IP地址的主人?"因为是广播包, 所有这个局域网的主机都收到了这个ARP请求。

  

玩转网卡MAC地址

  收到请求的主机将这个IP地址和自己的相比较, 如果不相同就不予理会, 如果相同就发出ARP响应包。 这个IP地址的主机收到这个ARP请求包后回复的ARP响应里说到:"我是这个IP地址的主人"。 这个包里面就包括了他的MAC地址。 以后的给这个IP地址的帧的目标MAC地址就被确定了。 其它的协议如IPX/SPX也有相应的协议完成这些操作。

  

玩转网卡MAC地址

  IP地址和MAC地址之间的关联关系保存在主机系统里面, 叫做ARP表, 由驱动程序和操作系统完成。 在Microsoft的系统里面可以用 arp -a 的命令查看ARP表。 收到数据帧的时候也是一样, 做完CRC以后, 如果没有CRC效验错误, 就把帧头去掉, 把数据包拿出来通过标准的借口传递给驱动和上层的协议客栈, 最终正确的达到我们的应用程序。 还有一些控制帧, 例如流控帧也需要MAC直接识别并执行相应的行为。

  三层交换机工作过程的简单概括:如果目的IP地址显示不是同一网段的, 那么A要实现和B的通讯, 在流缓存条目中没有对应MAC地址条目, 就将第一个正常数据包发送向一个缺省网关, 这个缺省网关一般在操作系统中已经设好, 对应第三层路由模块, 所以可见对于不是同一子网的数据, 最先在MAC表中放的是缺省网关的MAC地址;然后就由三层模块接收到此数据包, 查询路由表以确定到达B的路由, 将构造一个新的帧头, 其中以缺省网关的MAC地址为源MAC地址, 以主机B的MAC地址为目的MAC地址。 通过一定的识别触发机制, 确立主机A与B的MAC地址及转发端口的对应关系, 并记录进流缓存条目表, 以后的A到B的数据, 就直接交由二层交换模块完成。 这就通常所说的一次路由多次转发。

  四、真实MAC地址、注册表MAC地址和MAC地址的修改

  MAC地址固化在网卡中的BIOS中, 可以通过命令取得, 但是, 通过命令取得的MAC地址不一定是真实的MAC地址, 因为在网卡初始化过程中, 操作系统确实读取了网卡中MAC地址, 但是在以后通讯过程中使用的MAC地址却是从初始化过程结束后建立的缓冲区中读取, 而缓冲区中MAC地址可能是注册表定义的MAC地址, 而不是真实的MAC地址, 这个过程由网卡驱动程序完成。 这也是WIN操作系统的MAC地址可以被轻易修改的原因。

  WIN98/ME/2k/XP/2003用户都可以使用ipconfig/all命令获取MAC地址, XP/2003用户有更简单的方法:右键本地连接图标、选择状态然后点击支持选项卡, 这里“详细信息”中包含有MAC和其它重要网络参数。

  

玩转网卡MAC地址

  大部分的网卡都可以通过在控制面板中修改网卡属性来更改其MAC地址。 在“设备管理器中”, 右键点击需要修改MAC地址的网卡图标, 并选择“属性/高级”选项卡。 在“属性”区, 就可以看到一个称作“Network Address”或其他相类似名字的的项目, 点击它, 在右侧“值”的下方, 输入要指定的MAC地址值。 要连续输入12个十六进制数字或字母, 不要在其间输入“-”。

  

玩转网卡MAC地址

  重新启动系统后设置就会生效了。 参考上面发的图比较有明显的变化, 显然图中显示的是修改过的MAC地址。

  

玩转网卡MAC地址

  五、MAC地址的捆绑、ARP命令缺陷和MAC地址重复

  MAC地址绑定与IP地址绑定类似, MAC地址绑定也分为服务器有关MAC地址绑定、服务器无关MAC地址绑定、MAC地址静态绑定和MAC地址动态绑定。 服务器有关MAC地址绑定在政务网或园区网中的应用较多, 可将用户的使用权限和机器的MAC地址绑定起来, 限制用户只能在固定的机器上网, 保障安全, 防止帐号盗用。 由于MAC地址可以修改, 因此这个方法可以起到一定的作用, 但仍有漏洞。

  关于在WINDOWS 2000 SERVER 下用ARP -S捆绑MAC和IP的方法需要具体分析, 否则可能起不到绑定定作用。 以WINDOWS 2000server为例, WIN主机用IP+MAC的方式限制上网, 很容易被用户突破。 这里需要说明的是有3种情况:

  1、 服务器用ARP -S 做IP+MAC捆绑后, 如果用户自己改IP, 保持MAC不变, 这种情况下, ARP -S的捆绑被用户轻易突破。

  

玩转网卡MAC地址

  第一种情况的实验如上图, 服务器2000/NAT/10.41.221.2。 客户机的IP是10.41.221.6, 然后在2000的服务器上用ARP -S 做捆绑。 然后把客户机的IP改为10.41.221.7, 如图, 10.41.221.7可以上网。 轻易可以突破捆绑。

  2、 服务器用ARP -S 做IP+MAC捆绑后, 如果用户自己改MAC, 保持IP不变, 这种情况下, ARP -S的捆绑被用户轻易突破。

  

玩转网卡MAC地址

  所以上面的实验用第三方软件发包欺骗网关, 达到正常的用户IP不能上网的目的。

  3、 服务器用ARP -S 做IP+MAC捆绑后, 如果LAN中存在2台计算机的 IP和MAC完全相同(参考上面介绍的方法设置MAC地址), 这种情况下, 操作系统不会报告IP地址冲突, 也不会报告MAC地址冲突。 ARP -S的捆绑被用户轻易突破。

  为什么在WINDOWS 2000下用ARP -S 做IP+MAC捆绑会无效呢?

  高手做了详细的描述:“对于ARP表, W2K系统是通过内建的SNMP来进行管理的, 不管你的SNMP服务是否开启, 呵呵, 奇怪吧? 先我也一样很奇怪ARP这个程序是如何运行的, 因为查遍了所有MSDN的文档都没有涉及到ARP表读取, 修改的API。 万般无奈之下, 只有看ARP的汇编代码, 才发现这个秘密。 ARP -S命令也只是根据SNMP对应的OID接点的ARP表规范的ARP类型由3(动态)修改成4(静态), 但是低层的TCP/IP协议栈在收到ARP包以后修改SNMP对应的ARP表, 根本就没有检查其类型, 这也是ARP -S命令无效的原因。 ”

  六、MAC地址带来的网络安全问题

  修改IP和MAC都很容易, 这不可避免的带来了安全问题, 下面分别以的IP+MAC绑定、端口和MAC捆绑和虚拟路由器这3种情况讨论, 这里讨论的绑定可以是WIN主机也可以是路由交换设备。

  情况1、简单的IP+MAC绑定

  前面介绍了ARP -S静态ARP绑定无效的情况, 使用“ARP SERVER”按一定的时间间隔广播网段内所有主机的正确IP-MAC映射表, 可以解决这个问题。 不过ARP绑定在WIN2003下却是有效果的, 在LINUX下也有效果, 不仅如此, 个人防火墙如ZoneAlarm等也有MAC过滤功能。 在交换机上也可以做类似绑定, 增加静态ARP绑定以防止IP地址盗用(类似这样的命令arp 1.1.1.1 0001.0001.1111 ARPA)。 设置完成之后, 如果非法用户把地址改为1.1.1.1, 它发送到路由器的包正常, 但是从目标服务器2.1.1.1返回的数据包在路由器上转发的时候, 目标MAC地址将总是设为0001.0001.1111, 非法用户不能接收。

  突破方法:修改MAC地址很容易, 在Windows网络连接设置修改网卡的配置, 在“高级”页面中找到NetworkAddress设置为指定的值即可。

  情况2、端口和MAC地址捆绑认证

  如果限制了指定端口只能被特定MAC地址的机器, 用户若更改了MAC地址端口将会进入不可用状态。 交换机端口上首次连接的PC的MAC地址将会记录到交换机中, 成为唯一能够使用该端口的MAC地址。 如果该PC更换MAC地址, 默认将会使用端口置于shutdown状态, 无法与网络连通。

  突破方法:

  1、代理服务器。 用户在同一VLAN内能够对外访问的主机上安装代理服务器, 通过代理访问。

  2、巧妙运用MAC地址重复。 在要求进行端口和MAC地址认证的交换机中的一个端口下, 用户私自接一个HUB或者交换机。 再将几台PC连在这个HUB或是交换机上, 并将几台PC的IP和MAC地址设的完全一致。 结果是多台PC可以同时上网, 只需要一个人包月就行了。 先将MAC设成一样的, 再改IP。 这样, 机器发出的免费ARP包被其它同IP主机收到时, 那些主机发现MAC和自己的一样, 就会认为是自己发的了。 在windows系统下就不会弹出“IP地址冲突”提示框。 争用的情况会有丢包现象出现, 但不太会影响使用的。 至少我亲身感受是这样, 有时网页打不开, 再刷新一下就可以了。

  情况3、虚拟MAC地址挑战传统宽带认证管理

  包括MAC捆绑在内的所有宽带认证管理手段, 它们都有个共同的目的, 就是在某一时刻, 只允许一台计算机上线, 如果能虚拟一个路由器, 这个虚拟的路由器拥有唯一的MAC, 它取代物理代理服务器, 完成认证过程、同时提供网络地址转换功能, 不就可以突破MAC地址绑定解决共享上网问题了吗!HomeShare就是这样一个共享软件, 使用单网卡共享方式, 不需要设置专用的服务器。 下图是HomeShare组网网络图, 可以看出没有服务器或者路由设备。

  

玩转网卡MAC地址

  HomeShare虚拟的路由器有3个特点:

  1、和认证方式无关的特点。 网络中谁先开机谁执行登录认证, 即使认证手段改变也不影响共享上网。

  2、虚拟主机的特点。 这个主机可以设置MAC地址, 也就是说:对外无论谁先拨号, 服务商检测到的是已经注册的唯一的合法的MAC, 轻松突破服务商IP+MAC捆绑或者MAC+端口捆绑;当服务器关机后, 其它电脑将会自动成为服务器, 保证网络可以继续使用, 这样可以实现无缝切换:当服务器关机, 客户机切换到服务器的过程中, 可以保证客户机中正在进行中的游戏不会中断。 无缝切换已经在大多数游戏中测试过, 包括CS、Quake、联众世界等。

  

玩转网卡MAC地址

  3、HomeShare虚拟的路由器提供网络地址转换(NAT)功能, 实现共享上网和内部网络资源共享, 而且是通过广播来完成的, 客户机不需要复杂的设置就可以上网。 网络中所有的计算机使用自己真实的MAC地址和虚拟主机的虚拟MAC通讯, 完成数据交换。 毫无疑问, HomeShare虚拟的路由器给传统的宽带认证管理带来了安全问题。

网友评论
评论(...
全部评论