主动沉默局域网内其他dhcp服务器?

求一个 dhcp 服务器主动广播程序,局域网中有两个dhcp服务器A和B ,服务器A的dhcp模式为自动,服务器B的dhcp模式为强制(唯一).但由于一些原因,导致服务器A对dhcp请求的响应总是先于服务器B,所以导致不能按照正常方式工作
预想工作方式:

服务器B上线后,由服务器B接口dhcp分配,而不是服务器A继续进行dhcp分配.

服务器B使用的是 dnsmasq服务程序

  1. 我想到的方式是,让服务器B 主动向局域网内广播 自己是唯一的dhcp服务器.也就是上面提到的 dhcp 服务器主动广播程序,该程序和dnsmasq程序配合工作.如服务器B一开机,就执行 "dhcp 服务器主动广播程序" 沉默局域网内其他dhcp服务器

如果有其他方法,可以解决我的需求,那么其他方法也可以

---2025年1月20日 补充问题
服务器A其实还充当了一个交换机的功能,并且连接了服务器B,在服务器B的必经之路上,服务器A如何收到了dhcp请求,就直接自己响应了,而不是继续传递dhcp请求.所以 无法通过 dhcp服务器的dhcp response 优先级来解决.因为服务器B根本收不到dhcp请求

阅读 1.2k
1 个回答
  1. 通过DHCP选项实现控制

    • 原理:利用DHCP协议中的选项机制,服务器B可以发送特定的DHCP选项来表明自己是优先的DHCP服务器。客户端在收到多个DHCP响应时,可以根据这个选项来选择使用哪个服务器的配置。
    • 操作步骤

      • 对于使用dnsmasq的服务器B,可以通过配置文件来设置特定的DHCP选项。编辑dnsmasq的配置文件(通常是/etc/dnsmasq.conf)。
      • 添加或修改如下内容:

        dhcp - option = 60, "YourUniqueVendorClass"
        dhcp - option = 150, 192.168.1.100 # 假设服务器B的IP是192.168.1.100,150选项可指定特定服务器

        这里dhcp - option = 60设置了一个自定义的厂商类别选项,dhcp - option = 150指定了服务器B的IP地址。客户端可以配置为优先选择包含这个特定选项的DHCP响应。

  2. 调整服务器优先级

    • 原理:通过修改DHCP服务器的优先级设置,使服务器B的响应更具优先级。不同的DHCP服务器实现方式不同,对于dnsmasq服务器,可以通过调整其响应延迟等方式来实现。
    • 操作步骤

      • 在服务器A上,如果是Linux系统且使用常见的DHCP服务器软件(如isc - dhcp - server),可以在其配置文件(通常是/etc/dhcp/dhcpd.conf)中添加延迟设置:

        option dhcp - response - delay 5; # 延迟5秒响应

        这样服务器A的响应会延迟,增加服务器B先响应的机会。

  3. 编写Python广播程序

    • 原理:使用Python的scapy库来构造和发送DHCP广播包,表明服务器B是唯一的DHCP服务器。
    • 代码示例

      from scapy.all import *
      import time
      
      
      def send_dhcp_broadcast():
       # 构造DHCP发现包
       dhcp_discover = (Ether(dst="ff:ff:ff:ff:ff:ff") /
                      IP(src='0.0.0.0', dst='255.255.255.255') /
                      UDP(sport=68, dport=67) /
                      BOOTP(chaddr=RandMAC()) /
                      DHCP(options=[("message - type", "discover"),
                                    ("param_req_list", b'\x01\x03\x06\x0f\x2c\x2e\x33\x36'),
                                    ("end")]))
       while True:
         sendp(dhcp_discover, loop=0, inter=1)
         time.sleep(5)
      
      
      if __name__ == "__main__":
       send_dhcp_broadcast()
      
      
    • 说明

      • 此代码使用scapy库构造了一个DHCP发现包,并持续以一定间隔进行广播。scapy库需要提前安装,可以使用pip install scapy命令安装。
      • 你可以将此脚本设置为开机自启动,在Linux系统中,可以将其添加到/etc/rc.local文件中(确保/etc/rc.local有可执行权限),在文件末尾添加类似python /path/to/your/script.py &的命令,其中/path/to/your/script.py是脚本的实际路径。

以上几种方法都可以在一定程度上解决你遇到的问题,你可以根据实际情况选择合适的方法进行实施。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏