乌班图下设置DHCP服务

一、关于dhcp.conf

DHCP (Dynamic Host Configuration Protocol) 动态主机配置协议
·为在同一网络的主机自动分配动态IP
·[root@book named]# /sbin/ifconfig -a eth0 | grep MULTICAST #查看内核是否支持多播
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
·为使用DHCP服务器能满足某些挑剔的DHCP客户机,应在路由表中加入一个到地址255.255.255.255的路由。
·DHCP服务器必须能将数据包送到255.255.255.255的IP地址上,但Linux本身又将该地址作为本地子网的广播地
---------------------------------------------------------------------------------------------------------
/etc/dhcpd.conf通常包括三部分:parameters、declarations 、option。
1.DHCP配置文件中的parameters(参数):表明如何执行任务,是否要执行任务,或将哪些网络配置选项发送给客户
参 数 解 释 
ddns-update-style 配置DHCP-DNS 互动更新模式。 
default-lease-time 指定确省租赁时间的长度,单位是秒。 
max-lease-time 指定最大租赁时间长度,单位是秒。 
hardware 指定网卡接口类型和MAC地址。 
server-name 通知DHCP客户服务器名称。 
get-lease-hostnames flag 检查客户端使用的IP地址。 
fixed-address ip 分配给客户端一个固定的地址。 
authritative 拒绝不正确的IP地址的要求。

2.DHCP配置文件中的declarations (声明):用来描述网络布局、提供客户的IP地址等
声 明 解 释 
shared-network 用来告知是否一些子网络分享相同网络。 
subnet 描述一个IP地址是否属于该子网。 
range 起始IP 终止IP 提供动态分配IP 的范围。 
host 主机名称 参考特别的主机。 
group 为一组参数提供声明。 
allow unknown-clients;deny unknown-client 是否动态分配IP给未知的使用者。 
allow bootp;deny bootp 是否响应激活查询。 
allow booting;deny booting 是否响应使用者查询。 
filename 开始启动文件的名称. 应用于无盘工作站。 
next-server 设置服务器从引导文件中装如主机名,应用于无盘工作站。

3. DHCP配置文件中的option(选项):用来配置DHCP可选参数,全部用option关键字作为开始
选 项 解 释 
subnet-mask 为客户端设定子网掩码。 
domain-name 为客户端指明DNS名字。 
domain-name-servers 为客户端指明DNS服务器IP地址。 
host-name 为客户端指定主机名称。 
routers 为客户端设定默认网关。 
broadcast-address 为客户端设定广播地址。 
ntp-server 为客户端设定网络时间服务器IP地址。 
time-offset 为客户端设定和格林威治时间的偏移时间,单位是秒。
注意:如果客户端使用的是视窗操作系统,不要选择"host-name"选项,即不要为其指定主机名称
Dhcpd.conf 的配置文件例子:

二、配置dhcpd.conf文件

$ sudo vi /etc/dhcp/dhcpd.conf

在文件的最后添加以下内容:

subnet 222.205.197.0 netmask 255.255.255.0 {
range 222.205.197.10 222.205.197.90;
range 222.205.197.100 222.205.197.200;
option routers 222.205.197.1;
option broadcast-address 222.205.197.255;
option lease-time 360000; #1 DAY

三、验证

配置完成之后重启DHCP服务:

$ sudo service isc-dhcp-server restart

查看dhcp是否正常运行:

$ sudo netstat -uap
当显示dhcpd的program name时表示dhcp服务安装配置启动成功

使用终端接入同二层,dhcp获取地址,看能否获取到分配的IP。

[问题专题]DHCP option 60功能实现值修改,已解决_option60-CSDN博客

此问题堪称从业多年来困扰最大,方向全无的终极问题之一

问题来源

如上截图来源华为hilink平台适配调试文档。

新做的hilink linux网关,需要通过DHCP dicover包,上报option 60信息,信息内容就是一段字符串,例如huawei:hilink:gateway

 

DHCP包发送

  1. 我遇到这个问题,以为是在用户层代码,通过DHCP接口发送discover包,其中增加option60段,内容填充huawei:hilink:gateway即可,这个思想是错误的,方向性错误。应该是修改系统dhcp设置即可。

  2. 大部分人,包括我自己只知道dhcp是获取ip的,但是对dhcp的整个过程不是太了解,所以改变字段更是无从下手。

  3. 这个DHCP包是通过linux系统设置,具体步骤我是这样尝试的,但是失败了

    1. buildroot中增加dhcp client设置

    2. 升级网关系统,在etc/dhcp/下面有个dhclient.conf文件

    3. 在dhclient.conf文件中增加send vendor-class-identifier "huawei:hilink:gateway";(其中vendor-class-identifier就是60(3C)的字段标识。)

    4. 如下方法只能在dhcp的request包中增加了vendor-class-identifier(60)字段,但是值不是我设置的,而是系统默认的,所以修改此文件并未得到执行。

    5. 我再ubuntu电脑按照此方法修改,dhcp的request的包中是"huawei:hilink:gateway"

  4. 为什么要在discover增加字段,我在request中修改呢,因为找不到discover的位置,而且不会改这个conf文件

  5. 附上conf文件内容

 
  1.  
     
  2.  
    [root@sraum-gateway:/etc/dhcp]# ls
  3.  
    dhclient.conf
  4.  
    [root@sraum-gateway:/etc/dhcp]# cat dhclient.conf
  5.  
    # Configuration file for /sbin/dhclient, which is included in Debian's
  6.  
    # dhcp3-client package.
  7.  
    #
  8.  
    # This is a sample configuration file for dhclient. See dhclient.conf's
  9.  
    # man page for more information about the syntax of this file
  10.  
    # and a more comprehensive list of the parameters understood by
  11.  
    # dhclient.
  12.  
    #
  13.  
    # Normally, if the DHCP server provides reasonable information and does
  14.  
    # not leave anything out (like the domain name, for example), then
  15.  
    # few changes must be made to this file, if any.
  16.  
    #
  17.  
     
  18.  
    #send host-name "andare.fugue.com";
  19.  
    #send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
  20.  
    #send dhcp-lease-time 3600;
  21.  
    #supersede domain-name "fugue.com home.vix.com";
  22.  
    #prepend domain-name-servers 127.0.0.1;
  23.  
    request subnet-mask, broadcast-address, time-offset, routers,
  24.  
    domain-name, domain-name-servers, host-name,
  25.  
    netbios-name-servers, netbios-scope;
  26.  
    #require subnet-mask, domain-name-servers;
  27.  
    #timeout 60;
  28.  
    send vendor-class-identifier "huawei:hilink:gateway";
  29.  
    #retry 60;
  30.  
    #reboot 10;
  31.  
    #select-timeout 5;
  32.  
    #initial-interval 2;
  33.  
    #script "/etc/dhcp3/dhclient-script";
  34.  
    #media "-link0 -link1 -link2", "link0 link1";
  35.  
    #reject 192.33.137.209;
  36.  
     
  37.  
    #alias {
  38.  
    # interface "eth0";
  39.  
    # fixed-address 192.5.5.213;
  40.  
    # option subnet-mask 255.255.255.255;
  41.  
    #}
  42.  
     
  43.  
    #lease {
  44.  
    # interface "eth0";
  45.  
    # fixed-address 192.33.137.200;
  46.  
    # medium "link0 link1";
  47.  
    # option host-name "andare.swiftmedia.com";
  48.  
    # option subnet-mask 255.255.255.0;
  49.  
    # option broadcast-address 192.33.137.255;
  50.  
    # option routers 192.33.137.250;
  51.  
    # option domain-name-servers 127.0.0.1;
  52.  
    # renew 2 2000/1/12 00:00:01;
  53.  
    # rebind 2 2000/1/12 00:00:01;
  54.  
    # expire 2 2000/1/12 00:00:01;
  55.  
    #}
 

 

问题分析

  • 修改文件系统,这个方向是不是也是错的?

  • 修改dhcp request,以为dicorver会自动加上option60 ,这个方向是不是也是错的?基本可以确定是错的。

  • 问题最终一定会解决,但是不知道以什么方式解决,加油吧!!!!!!!!!!!!!!!

解决问题2020年8月24号

成功的一个方向:修改dhcp源码!!!!

解决问题前先总结下dhcp有哪些开源库,因为我的linux文件系统是Buildroot构建的,buildroot又使用了busybox.

以下是buildroot中的dhcp相关的库

dhcp(ISC)

dhcpcd

dhcpdump:抓dhcp包,解析的,

dhsmasq:遇到上面的问题,有大佬让我试试这个库

 以下是Busybox中的dhcp相关的库

udhcpd:f服务端

udhcpc:客户端,就是我们需要添加和修改的,busybox默认自带,所以只要修改其源码即可

 

linux文件系统是Buildroot构建的,buildroot又使用了busybox,这里面有个天大的坑

修改udhcpc源码后,使用buildroot编译后没有效果,因为udhcpc是在busybox下面的,所以要先使用busybox编译后再使用buildroot编译,buildroot只会使用busybox的中间文件.o

 

修改点

 
  1.  
     
  2.  
    int udhcpc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  3.  
    int udhcpc_main(int argc UNUSED_PARAM, char **argv)
  4.  
    {
  5.  
    uint8_t *message;
  6.  
    const char *str_V, *str_h, *str_F, *str_r;
  7.  
    IF_FEATURE_UDHCPC_ARPING(const char *str_a = "2000";)
  8.  
    IF_FEATURE_UDHCP_PORT(char *str_P;)
  9.  
    void *clientid_mac_ptr;
  10.  
    llist_t *list_O = NULL;
  11.  
    llist_t *list_x = NULL;
  12.  
    int tryagain_timeout = 20;
  13.  
    int discover_timeout = 3;
  14.  
    int discover_retries = 3;
  15.  
    uint32_t server_addr = server_addr; /* for compiler */
  16.  
    uint32_t requested_ip = 0;
  17.  
    uint32_t xid = xid; /* for compiler */
  18.  
    int packet_num;
  19.  
    int timeout; /* must be signed */
  20.  
    unsigned already_waited_sec;
  21.  
    unsigned opt;
  22.  
    IF_FEATURE_UDHCPC_ARPING(unsigned arpping_ms;)
  23.  
    int retval;
  24.  
     
  25.  
    setup_common_bufsiz();
  26.  
     
  27.  
    /* Default options */
  28.  
    IF_FEATURE_UDHCP_PORT(SERVER_PORT = 67;)
  29.  
    IF_FEATURE_UDHCP_PORT(CLIENT_PORT = 68;)
  30.  
    client_config.interface = "eth0";
  31.  
    client_config.script = CONFIG_UDHCPC_DEFAULT_SCRIPT;
  32.  
    //修改处
  33.  
    str_V = "udhcp "BB_VER;//改成想要的值,默认是udhcp版本
  34.  
     
  35.  
    .....
  36.  
    }
 

进入busybox目录,make

进入buildroot目录,把几个用不着的DHCP去掉,make

得到文件系统就去验证吧.

 

posted @ 2024-03-25 17:43  CharyGao  阅读(215)  评论(0编辑  收藏  举报