关于抢 IP

November 25, 2007 – 11:21 pm

忘记从什么时候开始,蓝田的 ip 严重不够用了,如果是晚上再开电脑的话,基本上就申请不到 ip 了,争夺非常惨烈。有时候申请不到 ip ,也很郁闷地想“抢”一个 ip 来用用,可惜我不知道方法。最近突然去图书馆借了那本《计算机网络,自顶向下方法和 Internet 特色》来看了看,大致上明白了其中的过程。

首先是 IP 申请的过程了,ZJG 这边使用的是 DHCP (Dynamic Host Configuration Protocol) 动态分配。DHCP 分配的过程大致为:

  1. DHCP server discovery 使用 IP 广播地址 255.255.255.255 发送 DHCP 发现报文。子网上的所有适配器都会收到报文,如果有一台 DHCP 服务器与子网相连,它会处理该报文;如果有一个 DHCP 中继代理与该子网相连,它会将该帧转发到具有 DHCP 服务器的网络。
  2. DHCP server offer 某个 DHCP 服务器收到发现报文后,将响应一个 DHCP 提供报文(以广播的方式),并附上推荐的 ip 地址(以及诸如子网掩码之类的其他信息)。
  3. DHCP request 有可能有多个 DHCP 服务器响应了客户的请求,客户从中挑选一个,并用一个 DCHP 请求报文对其进行响应(然而以广播的方式,这样在有多个 DHCP 服务器提供服务的时候未被选中的服务器如果保留了它为客户端所提供的那个 ip 地址的话,现在就可以安心释放掉了)。
  4. DHCP ACK 服务器用一个 DHCP ACK 报文对 DHCP 请求报文进行响应(仍然是广播方式,因为此时客户机仍然是没有 ip 的)。

更详细的过程描述可以参考这里。但是这还不足以解除我的疑惑:为什么需要分配 ip 地址呢?OK!ip 地址是在网络通讯的时候用于标识我的主机的。可是,既然是通过 DHCP 来动态分配 ip ,那表示我的 ip 地址会经常变动,别人拿到 ip 地址其实并不足以定位到主机,幸运的是,每台主机(或者确切地说,每个网络接口)都有独立、固定的物理地址,只要知道了物理地址,就能准确定位了。

为什么有了物理地址,还搞一个 ip 地址出来呢?事实上 ip 地址是在更上一层的协议上使用的,网络的这种分层结构让 ip 协议层能运行在不同的物理网络上,而不用关心下层的网络是使用什么方式定位的(物理地址或者直接点对点通讯等)。

好了,现在应该明了了,只要在申请到 ip 的时候把 ip 地址绑定到物理地址上,就一切 OK 了吧!一个很直接的猜想就是:在 DHCP 服务器那里申请到 ip 的时候,它就把那个 ip 地址和你的物理地址绑定起来,放到一个表里存储起来,以后谁想要和你通讯(当然它事先知道了你的 ip),就向 DHCP 服务器询问这个 ip 地址对应的物理地址。

但是事实上却不是这样的,设想如果是这样,万一那个 DHCP 服务器挂掉了,那岂不是整个网络的通讯就要瘫痪掉了?事实上从 ip 地址到物理地址的解析使用一种更加分布式的 ARP 协议来完成。简单地说,当需要查询某个 ip 地址对应的物理地址的时候,就对子网上的所有主机广播:“ip 地址是 XX.XX.XX.XX 的主机的物理地址是多少啊?”,某个主机发现被询问的 ip 地址正好是自己的 ip 地址,于是把自己的物理地址发送给询问的那台主机。

可是既然这样,为什么还要去向 DHCP 服务器申请 ip 呢?我自己喜欢哪个自己设一个好了,就好像取名字一样,到时候听到有人叫这个名字,我就应一声,说“我就叫这个名字”就好了。但是 ip 地址遇到重复的时候可比名字重复的问题要严重得多,为了避免这种情况发生,DHCP 介入进来帮忙管理 ip 地址的分配,这是一个大家互相配合的过程。可是现在又不一样了,或许 ip 被分配光了,DHCP 服务器不给我分配,也或许我就喜欢搞破坏,或者是看上一个 ip “靓号”,总之我现在不通过 DHCP 服务器,自己给自己分配一个 ip ,又如何呢?如果有 ip 冲突了,在别人询问 ip 的时候如果我先回答出来,说不定就抢先了。

可是情况还不是那么简单,如果每次通讯都会使用 ARP 询问的话,我还有 50% 的机会抢先,但是实际情况是,每个主机都有一个 ARP 缓存表,解析过的地址会缓存起来,通常情况下每个条目的缓存时间有 20 分钟,这样的话,原本占有 ip 的那个主机自然比我这个后介入的破坏分子有更多的优势了!

看样子在申请不到 ip 的时候抢 ip 的邪恶企图是无法实现了,不过似乎还有转机,如果能够让网关刷新 arp 表的话(通常应该是和网关通讯最多的了),比如,我这个时候 ping 网关一下,它看到这个 ip 地址现在变成我的物理地址了,于是更新一下自己的 arp 表中对应的项,为了避免原来拥有这个 ip 的主机从中捣乱,我还用一些手段让它挂掉或者网络堵掉,然后我就占有这个 ip 了。其实这就是 arp 攻击的基本原理了。

弄了半天,还是没有办法,如果真的没有 ip 了,即使能抢到 ip ,也必定会又另外一个人丢掉 ip 了,这未免太邪恶了一些,何况抢 ip 并不是说抢就能抢的。说白了还是得靠学校加强硬件设施才是最根本的解决办法,唉!学校的网络啊,好像最根本的问题又回到了人口上了,目前这网络也只有清晨的时候能顺畅一些了!

最后,还有一点其实我还不清楚,一个主机被 ping 的时候会根据收到的 ICMP 包的内容来更新自己的 arp 表吗?如果会,是直接信任 ICMP 包的内容还是再发一个 arp 请求确认一下?前者似乎太容易出错或受骗了,后者似乎又太低效了一些。不知道在哪里能否找到标准的行为描述,或者是现在流行的系统都是如何处理的。

  1. 4 Responses to “关于抢 IP”

  2. 可以用Ad hoc无线连接到室友的电脑上 :)

    By quark on Dec 1, 2007

  3. @quark是很和谐的办法啊。抢IP在绝大多数情况下确实就是拼ARP广播,大家都ARP广播,才是拼人品.

    By is on Jul 13, 2008

  4. 可以把IP和mac地址绑定,或者不停的重启网络,具体办法见http://yixbao.cn/html/diannaojishu/200808/07-151.html

    By 艺X报 on Aug 7, 2008

  5. 我看了你的方法,我觉得在本机上绑定似乎并不能直接影响别的机器(特别是网关)对你的 IP 的认识吧?

    By pluskid on Aug 7, 2008

Post a Comment