一. 概述
DHCP - Dynamic Host Config Protocol 在 IPv4 中实现了 Client 网络属性(IP 与 Options) 的配置自动化;
DHCP 是 CS 架构,基于 UDP 67(Server监听) 和 UDP 68(Client 监听);
二.原理
2.1 基本概念
报文
:
- DHCP 报头有两种类型,Op=1 是请求, Op=2 是响应;
- 更详细的类型在 Option 53 中,包含 DISCOVER/OFFER/REQUEST/DECLINE/ACK/NAK/RELEASE/INFORM
选项
:
- 增强 DHCP 功能,支持额外信息的交互;
- 常用的扩展 - 为 Client 分配网关/DNS/启动盘路径等;
- option 43 为厂商定制选项,可用于在 WLAN 组网中,携带 AC 的地址,协助创建 CAPWAP 隧道;
- option 82 中继代理信息选项,中继处理 Client 请求后添加,用于告知 Server Client 一些信息;
2.2 工作过程
Client 三层广播 DISCOVER
:
-
报文的源地址为 0.0.0.0/接口MAC, 目的为 255.255.255.255/FFFF-FFFF-FFF
-
报文携带客户端的 MAC 地址与请求的属性信息;
-
如果 Client 非首次连接至网络,会携带原地址;
Server 三层广播/单播 OFFER
:
- Server 基于 Client 的 MAC 和收到该报文接口的 IP 地址段,从 pool 中选取合适地址分配给 Client;
- Server 选定 IP 后,可能会在网内进行重复地址探测,可能得方式有 Ping 和 ARP,无重复后发出;
- OFFER 报文是广播和单播的选择,基于 DISCOVER 报文中的 Flag 第一位,0 - unicat,1 - brocast;
Client 三层广播 REQUEST
:
- 告知该广播域下的其他 Clients,该地址已占用;
Server 三层单播 ACK
:
- Client 收到该报文后,在配置并使用该地址钱,会进行一次 ARP 探测,如果发现重复,会告知 Server;
续租
:
- 在租约过了 T1 - 50% 时,可能会单播发送 Request 报文,刷新租约;
- 在租约过了 T2 - 87.5% 时,可能会广播发送 Request 报文,刷新租约;
- 在租约到期后,发送 DISCOVER 报文,重新获取;
- 地址分配优先级: MAC静态 > DISCOVER 携带 > 空闲 IP > 超过租约的 IP > 产生过冲突的 IP;
Relay
:
- 让 DHCP 报文可以跨三层传输;
- 额外添加 Hops 属性,该属性每经过一个 Relay 加 1 ,最大 16;
- 额外添加 Giaddr 属性,告知服务器,DICOVER 报文来自哪个网段;
2.3 Feature
DHCP Snooping
:
- 将接口划分为信任端口和非信任端口,防止 DHCP 仿冒者攻击;
- 依据 DHCP Snooping 绑定表生成接口静态 MAC 表项,MAC 不再自动学习,限制静态 IP 的接入;
- 限制单位时间内上送 DHCP Server 的报文数量,防止 DHCP 泛洪攻击;
- 依据 DHCP Snooping 绑定表,检查 Request 报文和 Release 报文是否合法,防止 DHCP 仿冒攻击;
- DHCP Snooping 额外检查报文中的 CHADDR 字段与报文二层的 Src MAC 字段,防止地址耗尽攻击;
三. DHCP 配置
3.1 基础配置
# 全局使能 dhcp
] dhcp enable
# 地址池配置
] ip pool ip-pool-name
pool] gateway-list ip-address
pool] network ip-address [ mask { mask | mask-length } ]
pool] excluded-ip-address start-ip-address [ end-ip-address ]
pool] lease { day day [ hour hour [ minute minute ] ] | unlimited }
pool] static-bind ip-address ip-address mac-address mac-address [ option-template template-name | description description ]
# 接口 DHCP 配置
] interface interface-type interface-number [subinterface-number ]
接口] ip address ip-address { mask | mask-length }
接口] DHCP server gateway-list ip-address
接口] DHCP server static-bind ip-address ip-address mac-address mac-address [ description description ]
接口] DHCP server excluded-ip-address start-ip-address [ end-ip-address]
接口] DHCP server lease { day day [ hour hour [ minute minute ] ] | unlimited }
# 接口 Relay 配置 - 方式一
接口] DHCP select relay
接口] DHCP relay server-ip ip-address
# 接口 Relay 配置 - 方式二
] DHCP server group group-name
group] DHCP-server ip-address [ ip-address-index ]
接口] DHCP relay server-select group-name
接口] ip address DHCP-alloc
3.2 Feature 配置
# 全局/vlan/接口下使能 dhcp snooping
dhcp snooping enable
vlan] dhcp snooping enable [ interface interface-type interface-number ]
接口] dhcp snooping enable
# 配置 dhcp snooping 信任接口
vlan] dhcp snooping trusted [ interface interface-type interface-number ]
接口] dhcp snooping trusted
# 依据 binding 表检查报文
vlan] dhcp snooping check { arp | ip } enable [ interface interface-type interface-number ]
接口] dhcp snooping check { arp | ip } enable
# 配置静态 binding 表项
vlan] dhcp snooping bind-table static ip-address ip-address [ mac-address mac-address ] [ interface interface-type interface-number [ ce-vlan ce-vlan-id ] ]
接口] dhcp snooping bind-table static ip-address ip-address [ mac-address mac-address ] [ vlan vlan-id [ ce-vlan ce-vlan-id ] ]
# 备份 binding 表,防止重启后失效
] dhcp snooping bind-table autosave filename
# 让报文中携带更多的 Client 信息 - 配置 Option82
vlan] dhcp option82 insert/rebuild enable [ interface interface-type interface-number ]
# 配置 CHADDR 检查功能
vlan] dhcp check chaddr enable [ interface interface-type interface-number ]
接口] dhcp check chaddr enable
# 配置续约检查
vlan] dhcp snooping check dhcp-request enable [ interface interface-type interface-number ]
接口] dhcp snooping check dhcp-request enable
# 配置最大用户数限制
vlan] dhcp snooping max-user-number max-user-number [ interface interface-type interface-number ]
接口] dhcp snooping max-user-number max-user-number
# 配置 dhcp-snooping 白名单功能
] dhcp snooping packet whitelist whitelist-name
] dhcp packet-rule ruleid { source-ip source-ip-address { source-ip-mask | source-ip-mask-length } | destination-ip destination-ip-address { destination-ip-mask | destination-ip-mask-length } } * [ source-port { bootpc | bootps } ] [ destination-port { bootpc | bootps } ]
参考:
To 华为 DHCP-Snooping 配置指南