8.DHCP协议分析与实践

DHCP 协议分析与实践

1. 概述

1.1 简介

  • Dynamic Host Configuration Protocol 用于取代 RARP 和 Bootp 协议,主要用于集中管理和自动分配 IP 地址,帮助网络内的主机获取 IP 地址、子网掩码、网关和 DNS 服务器地址。
  • DHCP 用于取代 Bootp 协议,但引用了租约和续租的概念
  • 基于 UDP 协议实现,位于应用层,使用 67 (DHCP服务器) 和 68 (DHCP客户端) 端口

1.2 地址分配方式

方式说明
静态分配即手工配置 IP、网关、子网掩码和 DNS 服务器
动态分配主机向 DHCP 服务器申请 IP 地址,获取后就使用该地址
零配置当使用动态分配失败时,如果 DHCP 服务器故障,有些操作系统会使用零配置为自己
分配一个私有地址(169.254.0.0 ~ 169.254.255.255),确保自己有 IP 地址

1.3 DHCP 工作流程

在这里插入图片描述

1.4 DHCP 网络拓扑图

在这里插入图片描述

1.5 报文格式

在这里插入图片描述

  • 报文类型 : 1 表示请求报文(client to server), 2 表示响应报文(server to client)
  • 硬件地址类型 : 即网络类型,1 表示以太网
  • 硬件地址长度 : 以太网地址为 6 字节
  • 跳数 : DHCP 报文经过的中继数量,每经过一个路由器值加 1
  • 事件 ID : 用于标识一次地址请求过程,客户端请求时随机生成
  • 使用时长 : 获取到 IP 成功或续租成功到现在的时长,单位秒
  • 标志 : [0]=0 表示服务器应答通过单播发送(续租时使用),[0]=1 表示服务器应答通过广播发送(申请时使用)
  • 最终分配的 IP : 客户端最终分配到的 IP 地址,仅用于 ACK 报文中, 此时才真正分配了 IP 地址
  • 预分配的 IP : 服务器给客户端分配的 IP 地址,仅用于 Offer 和 ACK 报文中
  • 下一阶段服务器 IP 地址 : 用于 Bootp 协议中,通常是存放系统镜像服务器,仅用于 Offer 和 ACK 报文中
  • 第一个 DHCP 中继的 IP 地址 : 用于跨网段分配地址, DHCP 中继会将客户端发出 DHCP请求(广播包) 转发到另一个网段,并将自己的 IP 填入该字段,DHCP 服务器根据该字段选择相应的地址池分配 IP 地址
  • 客户端硬件地址 : 即客户端的 MAC 地址,每个报文中都存在
  • 服务器名称 : 服务器的域名,仅用于 Offer 和 ACK 报文中
  • 启动配置文件 : 用于 Bootp 协议中,客户端启动的配置文件,仅用于 Offer 报文
  • 选项 : 可选项,格式为 Code + Length + Data
struct dhcp_hdr {
    uint8_t opcode;     /* opcode */
    uint8_t htype;      /* hardware address type */
    uint8_t hlen;       /* hardware address length */                            
    uint8_t hopcount;   /* used by proxy servers */                              
    uint32_t xid;       /* transaction ID */                                     
    uint16_t secs;      /* number of seconds since trying to bootstrap */        
    uint16_t flags;     /* flags for DHCP, unused for BOOTP */                   
    uint32_t cip;       /* client's IP */                                        
    uint32_t yip;       /* your IP */                                            
    uint32_t sip;       /* server's IP */                                        
    uint32_t gip;       /* gateway IP */                                         
    uint8_t chaddr[16]; /* client hardware address, len is dhcp_hlen */          
    char sname[64];     /* server host name, null terminated string */           
    char file[128];     /* boot file name, null terminated string */             
    char opt[0];
};

2. DHCP 实践

2.1 DHCP 服务器安装

# 安装
192.168.2.3> sudo apt install -y isc-dhcp-server

# 配置
sudo sed -i 's/^INTERFACESv4=.*$/INTERFACESv4="eth0"/' /etc/default/isc-dhcp-server
sudo sed -i 's/^INTERFACESv6=.*$/INTERFACESv6="eth0"/' /etc/default/isc-dhcp-server
cat << "EOF" | sudo tee -a /etc/dhcp/dhcpd.conf
subnet 192.168.2.0 netmask 255.255.255.0 {
  range 192.168.2.130 192.168.2.140;             # 地址池
  option subnet-mask 255.255.255.0;              # 子网掩码
  option routers 192.168.2.3;                    # 默认网关
  option broadcast-address 192.168.2.255;        # 广播地址
  default-lease-time 600;                        # 默认租赁时长
  max-lease-time 7200;                           # 最大租赁时长
  option domain-name "example.org";              # DNS 域名
  option domain-name-servers 119.29.29.29, 223.5.5.5;  # DNS 服务器
}
EOF

# 重启
sudo service isc-dhcp-server restart
sudo netstat -anup | grep dhcp
udp        0      0 0.0.0.0:67              0.0.0.0:*     1476/dhcpd          
udp        0      0 0.0.0.0:28199           0.0.0.0:*     1476/dhcpd          
udp6       0      0 :::13577                :::*          1476/dhcpd  

2.2 DHCP 报文分析

# 测试
192.168.2.3> tail -f /var/lib/dhcp/dhcpd.leases   # 监听分配的 IP
192.168.2.200> sudo dhclient -d                   # 分配 IP
192.168.2.200> sudo tcpdump -nt -XX 'udp and port 67 or port 68'
IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 0:d:d:d:d:d, length 300
	0x0000:  ffff ffff ffff 000d 0d0d 0d0d 0800 4510  ..............E.
	0x0010:  0148 0000 0000 8011 3996 0000 0000 ffff  .H......9.......
	0x0020:  ffff 0044 0043 0134 5900 0101 0600 0ba8  ...D.C.4Y.......
	0x0030:  5216 0000 0000 0000 0000 0000 0000 0000  R...............
	0x0040:  0000 0000 0000 000d 0d0d 0d0d 0000 0000  ................
	0x0050:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0060:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0070:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0080:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0090:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00d0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00e0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00f0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0100:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0110:  0000 0000 0000 6382 5363 3501 0132 04c0  ......c.Sc5..2..
	0x0120:  a802 780c 0567 686f 7374 370d 011c 0203  ..x..ghost7.....
	0x0130:  0f06 770c 2c2f 1a79 2aff 0000 0000 0000  ..w.,/.y*.......
	0x0140:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0150:  0000 0000 0000                           ......
IP 192.168.2.3.67 > 192.168.2.120.68: BOOTP/DHCP, Reply, length 300
	0x0000:  000d 0d0d 0d0d 000b 0b0b 0b0b 0800 4510  ..............E.
	0x0010:  0148 0000 0000 8011 b3c9 c0a8 0203 c0a8  .H..............
	0x0020:  0278 0043 0044 0134 9af5 0201 0600 0ba8  .x.C.D.4........
	0x0030:  5216 0000 0000 0000 0000 c0a8 0278 c0a8  R............x..
	0x0040:  0203 0000 0000 000d 0d0d 0d0d 0000 0000  ................
	0x0050:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0060:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0070:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0080:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0090:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00d0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00e0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00f0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0100:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0110:  0000 0000 0000 6382 5363 3501 0236 04c0  ......c.Sc5..6..
	0x0120:  a802 0333 0400 0002 5801 04ff ffff 001c  ...3....X.......
	0x0130:  04c0 a802 ff03 04c0 a802 030f 0b65 7861  .............exa
	0x0140:  6d70 6c65 2e6f 7267 0608 771d 1d1d df05  mple.org..w.....
	0x0150:  0505 ff00 0000                           ......
IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 0:d:d:d:d:d, length 300
	0x0000:  ffff ffff ffff 000d 0d0d 0d0d 0800 4510  ..............E.
	0x0010:  0148 0000 0000 8011 3996 0000 0000 ffff  .H......9.......
	0x0020:  ffff 0044 0043 0134 a707 0101 0600 0ba8  ...D.C.4........
	0x0030:  5216 0000 0000 0000 0000 0000 0000 0000  R...............
	0x0040:  0000 0000 0000 000d 0d0d 0d0d 0000 0000  ................
	0x0050:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0060:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0070:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0080:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0090:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00d0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00e0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00f0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0100:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0110:  0000 0000 0000 6382 5363 3501 0336 04c0  ......c.Sc5..6..
	0x0120:  a802 0332 04c0 a802 780c 0567 686f 7374  ...2....x..ghost
	0x0130:  370d 011c 0203 0f06 770c 2c2f 1a79 2aff  7.......w.,/.y*.
	0x0140:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0150:  0000 0000 0000                           ......
IP 192.168.2.3.67 > 192.168.2.120.68: BOOTP/DHCP, Reply, length 300
	0x0000:  000d 0d0d 0d0d 000b 0b0b 0b0b 0800 4510  ..............E.
	0x0010:  0148 0000 0000 8011 b3c9 c0a8 0203 c0a8  .H..............
	0x0020:  0278 0043 0044 0134 97f5 0201 0600 0ba8  .x.C.D.4........
	0x0030:  5216 0000 0000 0000 0000 c0a8 0278 c0a8  R............x..
	0x0040:  0203 0000 0000 000d 0d0d 0d0d 0000 0000  ................
	0x0050:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0060:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0070:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0080:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0090:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00d0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00e0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00f0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0100:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0110:  0000 0000 0000 6382 5363 3501 0536 04c0  ......c.Sc5..6..
	0x0120:  a802 0333 0400 0002 5801 04ff ffff 001c  ...3....X.......
	0x0130:  04c0 a802 ff03 04c0 a802 030f 0b65 7861  .............exa
	0x0140:  6d70 6c65 2e6f 7267 0608 771d 1d1d df05  mple.org..w.....
	0x0150:  0505 ff00 0000                           ......
参考链接

https://tools.ietf.org/html/rfc2131

https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值