代码样本

ISC dhcp-4.4.2-P1.tar.gz


代码编译

参考BLFS手册


功能初探

$ ./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服务器就使用单播来和客户端通信。

wireshark


源码分析

思维导图