Linux dhcp服务
Linux dhcp服务
文章目录
1. 基本介绍
🚀dhcp是动态主机配置协议,用于集中对用户的IP进行管理与配置。采用client/server通信模式,dhcp client向dhcp server提出配置申请,🚩dhcp server为网络上每个设备动态分配IP地址、子网掩码、默认网关、域名服务器地址等配置参数,以便于与其他IP的网络通信。
2. 基本功能
🌈为什么需要dhcp呢?想要明白此问题,就需要去了解dhcp提供什么功能?
- 准确的IP地址配置;
- 减少IP地址冲突;
- IP地址管理的自动化;
- 便于设备集中化管理;
3. 工作原理
3.1 通信协议
🍒dhcp通过udp协议通信,dhcp client提交IP申请配置时将报文发送至dhcp server的68端口,dhcp server将offer报文发送至dhcp client的67端口。
3.2 报文头格式
🍓OP:报文的操作类型。分为client请求报文(1)和server响应报文(2)。
请求报文: DHCP Discover、DHCP Request、DHCP Release、DHCP Inform和DHCP Decline。
应答报文: DHCP Offer、DHCP ACK和DHCP NAK。
🍓Htype: DHCP客户端的MAC地址类型。 MAC地址类型其实是指明网络类型 ,Htype值为1时表示为最常见的以太网MAC地址类型。
🍓Hlen: DHCP客户端的MAC地址 长度。以太网MAC地址长度为6个字节,即以太网时Hlen值为6。
🍓Hops:DHCP报文经过的DHCP中继的数目,默认为0。DHCP请求报文每经过一个DHCP中继,该字段就会增加1。没有经过DHCP中继时值为0。( 若数据包需经过router传送,每站加1,若在同一网内,为0。 )
🍓Xid:客户端通过DHCP Discover报文发起一次IP地址请求时选择的随机数,相当于请求标识。用来标识一次IP地址请求过程。在一次请求中所有报文的Xid都是一样的。
🍓Secs:DHCP客户端从获取到IP地址或者续约过程开始到现在所消耗的时间,以秒为单位。在没有获得IP地址前该字段始终为0。( DHCP客户端开始DHCP请求后所经过的时间。目前尚未使用,固定为0。)
🍓Flags:标志位,只使用第0比特位,是广播应答标识位,用来标识DHCP服务器应答报文是采用单播还是广播发送,0表示采用单播发送方式,1表示采用广播发送方式。其余位 尚未使用 。(即 从0-15bits,最左1bit为1时表示server将以广播方式传送封包给client。 )
【注意】在客户端正式分配了IP地址之前的第一次IP地址请求过程中,所有DHCP报文都是以广播方式发送的,包括客户端发送的DHCP Discover和DHCP Request报文,以及DHCP服务器发送的DHCP Offer、DHCP ACK和DHCP NAK报文。当然,如果是由DHCP中继器转的报文,则都是以单播方式发送的。另外,IP地址续约、IP地址释放的相关报文都是采用单播方式进行发送的。
🍓Ciaddr:DHCP客户端的IP地址。仅在DHCP服务器发送的ACK报文中显示,在其他报文中均显示0,因为在得到DHCP服务器确认前,DHCP客户端是还没有分配到IP地址的。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。
🍓Yiaddr:DHCP服务器分配给客户端的IP地址。仅在DHCP服务器发送的Offer和ACK报文中显示,其他报文中显示为0。
🍓Siaddr:下一个为DHCP客户端分配IP地址等信息的DHCP服务器IP地址。仅在DHCP Offer、DHCP ACK报文中显示,其他报文中显示为0。( 用于bootstrap过程中的IP地址)
🍓Giaddr:DHCP客户端发出请求报文后经过的第一个DHCP中继的IP地址。如果没有经过DHCP中继, 则显示为0。( 转发代理(网关)IP地址 )
🍓Chaddr:DHCP客户端的MAC地址。在每个报文中都会显示对应DHCP客户端的MAC地址。
🍓Sname:为DHCP客户端分配IP地址的DHCP服务器名称(DNS域名格式)。在Offer和ACK报文中显示发送报文的DHCP服务器名称,其他报文显示为0。
🍓File:DHCP服务器为DHCP客户端指定的启动配置文件名称及路径信息。仅在DHCP Offer报文中显示,其他报文中显示为空。
🍓Options: 可选项字段,长度可变,格式为"代码+长度+数据"。
3.3 通信原理
3.3.1 dhcp client/server在同网段
- dhcp client首次接入网络时,dhcp client/server消息交互流程图如下
- ①dhcp client发现阶段
🎃dhcp client寻找dhcp server(未知)阶段,所以只能以广播的形式发送dhcp discover报文,即向目标地址255.255.255.255发送报文,同网段内部的所有机器都会收到此报文,但只有dhcp server会做出响应。
- ②dhcp server提供阶段
🎃dhcp server向dhcp client提供地址阶段,同网段中所有的dhcp server都会做出响应,挑选一个尚未分配的IP地址给dhcp client,dhcp server会将IP地址信息以及其他配置封装到dhcp offer报文中发送至dhcp client。
- ③dhcp client选择阶段
🎃dhcp client选择dhcp server提供IP地址的阶段,如果阶段②有多个dhcp server发了offer报文,dhcp client只会选择第一个dhcp server提供的offer信息,然后以广播的形式发送一个dhcp request报文,告知其他dhcp server它选择了某个dhcp server提供IP地址信息。
- ④dhcp server确认阶段
🎃dhcp server确定提供IP地址阶段,当dhcp server收到dhcp request后,被dhcp client选中的dhcp server会给dhcp client发送包含IP地址以及其他配置的dhcp ack报文。而没有被选中的dhcp server则回收曾提供的IP地址。dhcp client收到dhcp server ack后会发起ARP Request请求,用于IP冲突检测。如果没有冲突就使用,如果有冲突就给dhcp server发送dhcp deline报文告诉dhcp server分配的IP地址无法使用,等待10s后再次尝试使用此地址,如果还是无法使用,给dhcp server发送dhcp release报文,告诉dhcp server放弃使用此地址。
- dhcp client重新登录阶段
🎃dhcp client拿到IP地址之后,每次重新登录网络时,不需要再发送dhcp discover报文,而是直接发送dhcp request报文给dhcp server,dhcp server收到之后,判断看之前分的IP地址还能否继续分给dhcp client使用,如果能,dhcp server给dhcp client回复dhcp ack,如果不能,dhcp server给dhcp client回复dhcp nak,dhcp client再次发起dhcp discover报文去请求新地址。
- dhcp client更新租约阶段
🎃dhcp server分配的IP地址都有租约时间,当超过租约时间,还没有更新租约,就需要收回分配dhcp client的IP地址。dhcp client在重启或租约到一半的时候发起dhcp request报文。dhcp client在关机或租约到期时,发送dhcp release报文给dhcp server释放IP地址。
🎃在租约50%的时候,dhcp client发起dhcp request请求报文,如果收到dhcp ack就更新租约,如果收到dhcp nak,再次发起dhcp discover请求报文。如果到租约进行至87.5%时,还未收到dhcp server的响应,就再次发起dhcp request请求报文,如果收到dhcp ack就更新租约,如果收到dhcp nak,再次发起dhcp discover请求报文。如果直到租约到期dhcp server都未响应,dhcp client停止使用IP地址,再次发起dhcp discover请求报文。
3.3.2 dhcp client/server在不同网段
4. udhcpc介绍
Usage: udhcpc [-fbqRB] [-a[MSEC]] [-t N] [-T SEC] [-A SEC/-n]
[-i IFACE] [-s PROG] [-p PIDFILE]
[-oC] [-r IP] [-V VENDOR] [-F NAME] [-x OPT:VAL]... [-O OPT]...
-i,--interface IFACE Interface to use (default eth0)
-s,--script PROG Run PROG at DHCP events (default /usr/share/udhcpc/default.script)
-p,--pidfile FILE Create pidfile
-B,--broadcast Request broadcast replies
-t,--retries N Send up to N discover packets (default 3)
-T,--timeout SEC Pause between packets (default 3)
-A,--tryagain SEC Wait if lease is not obtained (default 20)
-n,--now Exit if lease is not obtained
-q,--quit Exit after obtaining lease
-R,--release Release IP on exit
-f,--foreground Run in foreground
-b,--background Background if lease is not obtained
-S,--syslog Log to syslog too
-a[MSEC],--arping[=MSEC] Validate offered address with ARP ping
-r,--request IP Request this IP address
-o,--no-default-options Don't request any options (unless -O is given)
-O,--request-option OPT Request option OPT from server (cumulative)
-x OPT:VAL Include option OPT in sent packets (cumulative)
Examples of string, numeric, and hex byte opts:
-x hostname:bbox - option 12
-x lease:3600 - option 51 (lease time)
-x 0x3d:0100BEEFC0FFEE - option 61 (client id)
-F,--fqdn NAME Ask server to update DNS mapping for NAME
-V,--vendorclass VENDOR Vendor identifier (default 'udhcp VERSION')
-C,--clientid-none Don't send MAC as client identifier
Signals:
USR1 Renew lease
USR2 Release lease
5. udhcpc使用
udhcpc -i iface -s /usr/share/udhcpc/default.script **-b**
🔔-b很关键,放在后台执行,不然使用system执行会卡住执行程序
/usr/share/udhcpc/default.script脚本内容如下:
#!/bin/sh
# udhcpc script edited by Tim Riker <Tim@Rikers.org>
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
RESOLV_CONF="/etc/resolv.conf"
[ -e $RESOLV_CONF ] || touch $RESOLV_CONF
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"
case "$1" in
deconfig)
/sbin/ifconfig $interface up
/sbin/ifconfig $interface 0.0.0.0
# drop info from this interface
# resolv.conf may be a symlink to /tmp/, so take care
TMPFILE=$(mktemp)
grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
cat $TMPFILE > $RESOLV_CONF
rm -f $TMPFILE
if [ -x /usr/sbin/avahi-autoipd ]; then
/usr/sbin/avahi-autoipd -k $interface
fi
;;
leasefail|nak)
if [ -x /usr/sbin/avahi-autoipd ]; then
/usr/sbin/avahi-autoipd -wD $interface --no-chroot
fi
;;
renew|bound)
if [ -x /usr/sbin/avahi-autoipd ]; then
/usr/sbin/avahi-autoipd -k $interface
fi
/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
if [ -n "$router" ] ; then
echo "deleting routers"
while route del default gw 0.0.0.0 dev $interface 2> /dev/null; do
:
done
for i in $router ; do
route add default gw $i dev $interface
done
fi
# drop info from this interface
# resolv.conf may be a symlink to /tmp/, so take care
TMPFILE=$(mktemp)
grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
cat $TMPFILE > $RESOLV_CONF
rm -f $TMPFILE
# prefer rfc3359 domain search list (option 119) if available
if [ -n "$search" ]; then
search_list=$search
elif [ -n "$domain" ]; then
search_list=$domain
fi
[ -n "$search_list" ] &&
echo "search $search_list # $interface" >> $RESOLV_CONF
for i in $dns ; do
echo adding dns $i
echo "nameserver $i # $interface" >> $RESOLV_CONF
;;
esac
HOOK_DIR="$0.d"
for hook in "${HOOK_DIR}/"*; do
[ -f "${hook}" -a -x "${hook}" ] || continue
"${hook}" "${@}"
done
exit 0
6. udhcpd介绍
使用dnsmasq即可,不做介绍。
原文地址:https://blog.csdn.net/weixin_36051831/article/details/145200601
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!