socket发dhcp java,使用DHCP协议获取IP地址

默认情况下,都是由操作系统完成 IP 地址请求过程的,用户也可以手动请求 IP 地址。netwox 工具提供了编号为 171 的模块,它可以充当 DHCP 客户端向 DHCP 服务器请求 IP 地址。

【实例】模拟 DHCP 客户端从 DHCP 服务器获取 IP 地址。执行命令如下:

root@daxueba:~# netwox 171

执行命令后将完成获取 IP 地址的整个过程,并输出每个过程相关的信息。为了方便讲解,下面将信息进行拆分,然后分别讲解。

1) 发现阶段的输出信息如下:

I send a DISCOVER:

DHCP____________________________________________________________.

| op=request hops=0 xid=B8ED8552 secs=0 flags=0000 |

| client=0.0.0.0 your=0.0.0.0 |

| server=0.0.0.0 agent=0.0.0.0 |

| clienteth=00:0C:29:FD:DE:B8 |

| sname: |

| file: |

| msgtype: discover |

| clientidtype: 1 |

| clientid: 000c29fddeb8 |

| reqlist[0]: 1 (subnetmask) |

#下面为客户端要请求的列表信息

| reqlist[1]: 3 (gateways) |

| reqlist[2]: 4 (timeservers) |

| reqlist[3]: 5 (nameservers) |

| reqlist[4]: 6 (dnsservers) |

| reqlist[5]: 7 (logservers) |

| reqlist[6]: 9 (lprservers) |

| reqlist[7]: 12 (hostname) |

| reqlist[8]: 15 (domainname) |

| reqlist[9]: 28 (broadcastad) |

| reqlist[10]: 31 (performroutdisc) |

| reqlist[11]: 33 (staticroutes) |

| reqlist[12]: 40 (nisdomain) |

| reqlist[13]: 41 (nisservers) |

| reqlist[14]: 51 (ipadleasetime) |

| reqlist[15]: 58 (renewaltime) |

| reqlist[16]: 59 (rebindingtime) |

| reqlist[17]: 64 (nispdomain) |

| reqlist[18]: 65 (nispserver) |

| reqlist[19]: 69 (smtpservers) |

| reqlist[20]: 70 (pop3servers) |

| reqlist[21]: 71 (nntpservers) |

| reqlist[22]: 72 (wwwservers) |

| reqlist[23]: 74 (ircservers) |

|___________________________________________________________ |

以上输出信息中,第 1 行表示客户端发送了一个 Discover 包,用来向服务器请求租用的 IP 地址。

下面的信息为对应的报文信息。其中,xid 表示事务 ID 为 B8ED8552,client 表示客户端 IP 地址为 0.0.0.0,your 表示此时客户端还没有 IP 地址,因此也为 0.0.0.0。

2) 提供阶段的输出信息如下:

Server sent us this OFFER:

DHCP____________________________________________________________.

| op=reply hops=0 xid=B8ED8552 secs=0 flags=0000 |

| client=0.0.0.0 your=192.168.59.131 |

| server=192.168.59.254 agent=0.0.0.0 |

| clienteth=00:0C:29:FD:DE:B8 |

| sname: |

| file: |

| msgtype: offer |

| serverid: 192.168.59.254 |

| ipadleasetime: 1800 |

| subnetmask: 255.255.255.0 | #子网掩码

| gateways[0]: 192.168.59.2 | #网关

| dnsservers[0]: 192.168.59.2 | #DNS服务器地址

| domainname: 'localdomain' | #域名

| broadcastad: 192.168.59.255 | #广播地址

| renewaltime: 900 | #更新时间

| rebindingtime: 1575 | #重新连接时间

| end |

|_____________________________________________________ |

Server 192.168.59.254(00:50:56:ED:87:BC) proposes address 192.168.59.131

以上输出信息中,第 1 行表示服务器向客户端返回了提供 IP 地址租约的数据包。

下面的信息为对应的报文信息。其中,xid 表示事务 ID 为 B8ED8552,与发现阶段事务 ID 相同;your 表示服务器给客户端提供的 IP 地址为 192.168.59.131;server 表示此时服务器的 IP 地址为 192.168.59.254。

从输出信息中还可以看到服务器为客户端提供的子网掩码、网关、DNS 服务器地址等信息。输出信息的最后一行为总结信息,表示服务器 192.168.59.254 为客户端提供的 IP 地址为 192.168.59.131。

3) 选择阶段的输出信息如下:

I accept previous OFFER:

DHCP____________________________________________________________.

| op=request hops=0 xid=B8ED8552 secs=0 flags=0000 |

| client=0.0.0.0 your=0.0.0.0 |

| server=0.0.0.0 agent=0.0.0.0 |

| clienteth=00:0C:29:FD:DE:B8 |

| sname: |

| file: |

| msgtype: request |

| clientidtype: 1 |

| clientid: 000c29fddeb8 |

| requestedipad: 192.168.59.131 | #选择请求的IP地址

| serverid: 192.168.59.254 | #服务器IP地址

| reqlist[0]: 1 (subnetmask) | #下面为请求的其他信息

| reqlist[1]: 3 (gateways) |

| reqlist[2]: 4 (timeservers) |

| reqlist[3]: 5 (nameservers) |

| reqlist[4]: 6 (dnsservers) |

| reqlist[5]: 7 (logservers) |

| reqlist[6]: 9 (lprservers) |

| reqlist[7]: 12 (hostname) |

| reqlist[8]: 15 (domainname) |

| reqlist[9]: 28 (broadcastad) |

| reqlist[10]: 31 (performroutdisc) |

| reqlist[11]: 33 (staticroutes) |

| reqlist[12]: 40 (nisdomain) |

| reqlist[13]: 41 (nisservers) |

| reqlist[14]: 51 (ipadleasetime) |

| reqlist[15]: 58 (renewaltime) |

| reqlist[16]: 59 (rebindingtime) |

| reqlist[17]: 64 (nispdomain) |

| reqlist[18]: 65 (nispserver) |

| reqlist[19]: 69 (smtpservers) |

| reqlist[20]: 70 (pop3servers) |

| reqlist[21]: 71 (nntpservers) |

| reqlist[22]: 72 (wwwservers) |

| reqlist[23]: 74 (ircservers) |

|_________________________________________________ |

以上输出信息中,第 1 行表示客户端接收了服务器提供的地址租约。

下面的信息为对应的报文信息。其中,xid 表示事务 ID 为 B8ED8552;由于客户端选择了要请求的 IP 地址,但是没有真正获取到 IP 地址,

因此 client 和 your 均为 0.0.0.0;requestedipad 表示客户端选择的 IP 地址为 192.168.59.131。serverid 表示服务器的IP地址为 192.168.59.254。

4) 确认阶段的输出信息如下:

Server sent us this ACK:

DHCP____________________________________________________________.

| op=reply hops=0 xid=B8ED8552 secs=0 flags=0000 |

| client=0.0.0.0 your=192.168.59.131 |

| server=192.168.59.254 agent=0.0.0.0 |

| clienteth=00:0C:29:FD:DE:B8 |

| sname: |

| file: |

| msgtype: ack |

| serverid: 192.168.59.254 |

| ipadleasetime: 1800 |

| subnetmask: 255.255.255.0 | #客户端的子网掩码

| gateways[0]: 192.168.59.2 | #客户端的网关

| dnsservers[0]: 192.168.59.2 | #客户端的DNS服务器

| domainname: 'localdomain' |

| broadcastad: 192.168.59.255 |

| renewaltime: 900 |

| rebindingtime: 1575 |

| end |

|_________________________________________________ |

Server 192.168.59.254(00:50:56:ED:87:BC) gave address 192.168.59.131

Press q to quit.

以上输出信息中,第 1 行表示服务器确认了客户端要租约的 IP 地址信息,客户端可以使用请求的 IP 地址了。

下面的信息为对应的报文信息。其中,your 表示客户端可以租用的 IP 地址为 192.168.59.131;其他信息给出了客户端使用的子网掩码、网关、DNS 服务器地址等。输出的最后一行信息表示用户可以使用快捷键 q 退出。如果退出,则客户端将不再租用这个 IP 地址,会释放该地址。

5) 为了确认模拟客户端从服务器上是否获取到了 IP 地址,可以通过抓包进行验证,如图所示。

92bf3f6d2ec76114201aeb292baebfc2.gif

其中的 4 个数据包就是获取 IP 地址的 4 个阶段的数据包。

6) 如果使用了快捷键 q 退出,将产生释放地址的数据包。输出信息如下:

I RELEASE the address:

DHCP__________________________________________________________.

| op=request hops=0 xid=CC6236A1 secs=0 flags=0000 |

| client=192.168.59.131 your=0.0.0.0 |

| server=0.0.0.0 agent=0.0.0.0 |

| clienteth=00:0C:29:FD:DE:B8 |

| sname: |

| file: |

| msgtype: release |

| serverid: 192.168.59.254 |

| clientidtype: 1 |

| clientid: 000c29fddeb8 |

|___________________________________________________________ |

以上输出信息,第 1 行表示客户端释放了 IP 地址。

下面的信息为对应的报文信息。其中,xid 的值为 CC6236A1,这与获取 IP 地址时所产生的事务 ID 不同;client 表示客户端要释放的 IP 地址为 192.168.59.131。

7) 通过抓包捕获的释放地址数据包如图所示。

447c907db8174b6a7d7e1a75cb45a2ae.gif

8) 从 DHCP 服务器上获取 IP 地址时,为了隐藏真实的 MAC 地址,可以伪造虚假 MAC 地址。

例如,设置假 MAC 地址为 01:02:03:A1:A2:A3。执行命令如下:

root@daxueba:~# netwox 171 -e 01:02:03:a1:a2:a3

输出信息如下:

I send a DISCOVER:

DHCP____________________________________________________________.

| op=request hops=0 xid=BDC49614 secs=0 flags=0000 |

| client=0.0.0.0 your=0.0.0.0 |

| server=0.0.0.0 agent=0.0.0.0 |

| clienteth=01:02:03:A1:A2:A3 |

··· #省略其他信息

从输出信息报文中可以看到,此时客户端的 MAC 地址为假的地址01:02:03:A1:A2:A3。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值