Linux Wlan无线网络开发之DHCP预留功能 实操demo

前言(也是实践内容基础框架展示)

前面简单讲解了类似于Auth这种大类,会涉及到应用层、内核、驱动层 整个基础框架的需求,而此次的实践实操则只涉及或者我们只讨论应用层部分:

实践内容

  • 将指定mac的设备分配192.168.1.88 ip地址进行网络访问

步骤解析为如下:

  1. udhcp源码移植并使用
  2. udhcp源码流程解析
  3. DHCP预留功能开发与验证

DHCP预留(或者静态IP分配、IP-MAC绑定等等)

  • 这指的是在路由器上的一种配置,将某个特定的IP地址固定地、永久地分配给网络中的某一个特定设备
如何去判定应该分配给哪一个设备呢?
  • 通过其MAC地址识别(从别名IP-MAC绑定亦可看出)

手把手实操

udhcp源码移植并使用

  1. 源码下载:wget https://udhcp.busybox.net/source/udhcp-0.9.8.tar.gz

    并解压 tar -zxvf udhcp-0.9.8.tar.
  2. 编译:
    文件创建:build.sh
    修改执行权限:chmod +x build.sh
    执行命令:./build.sh
  3. 生成文件
  4. 关闭系统不必要的网络服务
    停止冲突服务(不需要linuxwlanmanager来管理wifi了)
    sudo systemctl disable NetworkManager
    sudo systemctl disable dnsmasq
  5. 创建udhcpd.conf文件:sudo vim /etc/udhcpd.conf
  6. 创建租约文件:使用 touch /var/lib/misc/udhcpd.leases 创建租约文件(持久化记录所有分配)

    设置正确的权限
  7. 启动hostapd进程(在这里就不在赘述以前的文章了)
    sudo hostapd /etc/hostapd/hostapd.conf -B
  8. 启动udhcpd进程
    /usr/sbin/udhcpd /etc/udhcpd.conf -f
  9. 无线连接测试:拿到的地址是192.168.1.2

udhcp源码流程解析

  1. 流程罗列:
    tcpdump 抓包的四个流程:
  2. 流程交互重点(核心字段在DHCP交互四步中的体现)

    对如上参数进行解释
  3. 代码流程

    需要明确的message 参数:
  4. 代码解析:
    接收到DHCPDISCOVER后发送OFFER包给客户端:

    处理 DHCPREQUEST 报文逻辑

    注释解释

清楚了如何使用udhcpd和理解了代码逻辑才能进行需求开发,所以前面内容不可或缺

DHCP预留功能开发与验证

开发逻辑梳理

1)需要创建存储DHCP预留的信息内存

2)需要创建用于纠错分配ip的哈希表(比如分配到了在DHCP预留中的ip,此时需要重新分配新的ip)

3)对于匹配到DHCP预留的设备进行预留功能设置

  1. 存储DHCP预留的信息静态内存(写死为设备8a4c11918cd9分配192.168.1.88)
  2. 创建用于纠错分配ip的哈希表
    哈希表定义:


    哈希表初始化:

    哈希表插入:
  3. DHCP预留的设备进行预留功能设置

    通过指针返回需要分配后的ip,分配后进行发送
  4. 在ACK中进行ip分配校验:

    对于
    1)预留分配ip和client请求ip一致性校验
    2)对非预留设备请求到预留ip的错误处理

结果验证

连接结果

日志结果

验证成功

相关推荐
用户0328472220703 小时前
如何搭建本地yum源(上)
运维
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务