dhcp中继与源码(dhrelay)分析
代码样本
代码编译
功能初探
$ ./dhcrelay -h
Usage: dhcrelay [-d] [-q] [-a] [-D] [-A <length>] [-c <hops>]
[-p <port> | -rp <relay-port>]
[-pf <pid-file>] [--no-pid]
[-m append|replace|forward|discard]
[-i interface0 [ ... -i interfaceN]
[-iu interface0 [ ... -iu interfaceN]
[-id interface0 [ ... -id interfaceN]
[-U interface]
server0 [ ... serverN]
dhcrelay {--version|--help|-h}
参数 | 说明 |
---|---|
-4 | 作为DHCPv4/BOOTP中继代理(默认模式) |
-6 | 作为DHCPv6中继代理 |
-d | 不以守护进程方式运行 |
-q | 安静模式(不输出信息) |
-a | 在将请求转发到服务器之前为每个请求附加一个代理选项字段 |
-D | |
-A | 指定发送到DHCP服务器的最大数据包长度 |
-c | 最大中继跳跃(对应dhcp协议中的hops字段)次数(默认值10) |
-p | 监听和发送端口。DHCPv4/BOOTP默认端口是67,DHCPv6默认端口是547 |
-rp | 中继端口 |
-pf | pid-file文件路径 |
–no-pid | 关闭写pid文件 |
-m | 中继模式 追加/替换/继续/放弃 (dhcp协议中giaddr字段相关) |
-i | 定义 UP|DOWN 接口 api:request_v4_interface |
-iu | 定义 UP(上行连接dhcp服务器的接口名称) 接口 |
-id | 定义 DOWN(接受下游dhcp客户端或中继请求接口名称) 接口 |
-U | RFC-3527 |
$ sudo ./dhcrelay -d 192.168.18.1
Requesting: eth0 as upstream: Y downstream: Y
Internet Systems Consortium DHCP Relay Agent 4.4.2-P1
Copyright 2004-2021 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth0/68:f7:28:26:56:b0
Sending on LPF/eth0/68:f7:28:26:56:b0
Sending on Socket/fallback
Forwarded BOOTREQUEST for f4:4d:30:ff:e3:d5 to 192.168.18.1
Forwarded BOOTREQUEST for c0:3f:d5:f4:6e:89 to 192.168.18.1
Forwarded BOOTREQUEST for c0:3f:d5:f4:6e:89 to 192.168.18.1
基础知识
1. OMAPI protocol
Object Mapping Application Protocol Interface
在代码中看到这个协议,很陌生所以简单查了一下。 它是ISC设备用来远程控制DHCP服务器状态,包括远程关闭服务器等功能的协议。
因不是本此重点,先跳过以后有机会研究一下。
2. BIND9
BIND(Berkeley Internet Name Domain)版本9 DNS开源
3. DHCP(Dynamic Host Configuration Protocol) 动态主机配置协议(应用层协议)
采用的是UDP广播方式实现
255.255.255.255
一般称为受限广播地址,受限广播地址一般只存在于同一个广播域下,即同一VLAN下。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。
序号 | 过程 | 方向 | 端口 | 协议 | 说明 |
---|---|---|---|---|---|
1 | Discover | C -> S | 68 -> 67 | UDP 0.0.0.0 -> 255.255.255.255 | 客户端以广播方式发送Discover报文 |
2 | Offer | S -> C | 67 -> 68 | UDP 192.168.0.1 -> 255.255.255.255 | 所以收到Discover报文的服务端都会给出响应,发送Offer报文 |
3 | Request | C -> S | 68 -> 67 | UDP 0.0.0.0 -> 255.255.255.255 | 初始化与续约 |
4 | Ack | S -> C | 67 -> 68 | UDP 192.168.0.1 -> 255.255.255.255 | 服务器对客户端的Request报文的确认响应报文 |
5 | Nak | S -> C | 67 -> 68 | UDP 192.168.0.1 -> 255.255.255.255 | 服务器对客户端的Request报文的拒绝响应报文 |
6 | Decline | C -> S | 68 -> 67 | UDP 192.168.0.??? -> 255.255.255.255 | 客户端发现IP冲突时,向服务器发送Decline报文 |
7 | Release | C -> S | 68 -> 67 | UDP 192.168.0.??? -> 255.255.255.255 | 客户端发送此报文主动释放服务器分配给它的IP地址 |
8 | ~Inform~ | C -> S | 68 -> 67 | UDP 192.168.0.??? -> 255.255.255.255 | 客户端发送此报文向服务器获取其他网络配置信息 (dhcp服务可能不支持) |
3.1 服务端向客户端的返回是采用广播还是单播
这要看客户端发送的 Discovery与Request 报文中的BROADCAST flag = 1
时服务器就使用广播来和客户端通信,BROADCAST flag = 0
服务器就使用单播来和客户端通信。