DHCP_Config

DHCP简介

DHCP介绍

动态主机配置协议(DHCP)是一种用于简化主机IP配置管理的协议标准。通过采用DHCP标准,可以使用DHCP服务器为网络上所有启用了DHCP的客户端分配、配置、跟踪和更改(必要时)所有TCP/IP设置。此外,DHCP还可以确保不使用重复地址、重新分配未使用的地址,并且可以自动为主机连接的子网分配适当的IP地址。
针对不同的需求,DHCP服务器有三种机制分配IP地址:
l          自动分配,DHCP服务器给首次连接到网络的某些客户端分配固定IP地址,该地址由用户长期使用;
l          动态分配,DHCP服务器给客户端分配有时间限制的IP地址,使用期限到期后,客户端需要重新申请地址,客户端也可以主动释放该地址。绝大多数客户端主机得到的是这种动态分配的地址;
l          手动分配,由网络管理员为客户端指定固定的IP地址。
三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。HiPER支持后面两种机制。

DHCP的工作原理

DHCP基本工作流程
上图为DHCP工作的基本流程,下面将分别介绍DHCP请求IP地址、续租地址及释放地址这三个业务的过程。
1.         DHCP请求IP地址的过程
l          发现阶段,即DHCP客户端寻找DHCP服务器的阶段。客户端以广播方式发送DHCPDISCOVER包,只有DHCP服务器才会响应。
l          提供阶段,即DHCP服务器提供IP地址的阶段。DHCP服务器接收到客户端的DHCPDISCOVER报文后,从IP地址池中选择一个尚未分配的IP地址分配给客户端,向该客户端发送包含租借的IP地址和其他配置信息的DHCPOFFER包。
l          选择阶段,即DHCP客户端选择IP地址的阶段。如果有多台DHCP服务器向该客户端发送DHCPOFFER包,客户端从中随机挑选,然后以广播形式向各DHCP服务器回应DHCPREQUEST包,宣告使用它挑中的DHCP服务器提供的地址,并正式请求该DHCP服务器分配地址。其它所有发送DHCPOFFER包的DHCP服务器接收到该数据包后,将释放已经OFFER(预分配)给客户端的IP地址。
    如果发送给DHCP客户端的DHCPOFFER包中包含无效的配置参数,客户端会向服务器发送DHCPCLINE包拒绝接受已经分配的配置信息。
l          确认阶段,即DHCP服务器确认所提供IP地址的阶段。当DHCP服务器收到DHCP客户端回答的DHCPREQUEST包后,便向客户端发送包含它所提供的IP地址及其他配置信息的DHCPACK确认包。然后,DHCP客户端将接收并使用IP地址及其他TCP/IP配置参数。
2.         DHCP客户端续租IP地址的过程
l          DHCP服务器分配给客户端的动态IP地址通常有一定的租借期限,期满后服务器会收回该IP地址。如果DHCP客户端希望继续使用该地址,需要更新IP租约。实际使用中,在IP地址租约期限达到一半时,DHCP客户端会自动向DHCP服务器发送DHCPREQUEST包,以完成IP租约的更新。如果此IP地址有效,则DHCP服务器回应DHCPACK包,通知DHCP客户端已经获得新IP租约。
如果DHCP客户端续租地址时发送的DHCPREQUEST包中的IP地址与DHCP服务器当前分配给它的IP地址(仍在租期内)不一致,DHCP服务器将发送DHCPNAK消息给DHCP客户端。
3.         DHCP客户端释放IP地址的过程
l          DHCP客户端已从DHCP服务器获得地址,并在租期内正常使用,如果该DHCP客户端不想再使用该地址,则需主动向DHCP服务器发送DHCPRELEASE包,以释放该地址,同时将其IP地址设为0.0.0.0。

DHCP数据包的类型

DHCP协议采用CLIENT-SERVER方式进行交互,其数据包格式共有8种,具体含义如下表所示:
格式
中文解释
含义
DHCPDISCOVER
发现包
此为Cilent开始DHCP过程的第一个报文
DHCPOFFER
提供包
此为Server对DHCPDISCOVER包的响应
DHCPREQUEST
请求包
此为Client开始DHCP过程中对Server的DHCPOFFER包的回应,或是Client续租IP地址时发出的数据包
DHCPDECLINE
拒绝包
当Client发现Server分配给它的IP地址无法使用,如IP地址冲突时,将发出此数据包,通知Server拒绝使用这个IP地址
DHCPACK
确认包
Server对Client的DHCPREQUEST包的确认响应包,Client收到此数据包后,才真正获得了IP地址和相关的配置信息
DHCPNAK
否认包
Server对Client的DHCPREQUEST包的拒绝响应包,Client收到此数据包后,一般会重新开始新的DHCP过程。
DHCPRELEASE
释放包
Client主动释放Server分配给它的IP地址的数据包,当Server收到它后,就可以回收这个IP地址,从而可将该地址分配给其他的Client。
DHCPINFORM
信息包
Client已经获得了IP地址,发送此报文,只是为了从Server处获得其他的一些网络配置信息,如route ip、DNS IP等,此数据包的应用非常少见。
DHCP数据包的类型
from netmiko import ConnectHandler from netmiko.exceptions import NetmikoAuthenticationException, NetmikoTimeoutException import time import logging # ===================== 配置参数 ===================== SWITCH = { 'device_type': 'hp_comware', # H3C设备类型 'ip': '192.168.1.1', # 交换机IP地址 'username': 'admin', # SSH用户名 'password': 'admin123', # SSH密码 'port': 22, # SSH端口 'secret': '', # Enable密码(若无则留空) 'timeout': 120, # 连接超时时间 } # VLAN配置 VLAN_CONFIG = { 'vlan_id': 230, 'vlan_ip': '192.168.230.1', 'subnet_mask': '255.255.255.0' } # DHCP配置 DHCP_POOL = { 'name': 'vlan230_pool', 'network': '192.168.230.0', 'mask': '255.255.255.0', 'gateway': '192.168.230.1', 'dns': '114.114.114.114', 'range_start': '192.168.230.50', 'range_end': '192.168.230.200' } # 接口配置 INTERFACE_CONFIG = { 'trunk_ports': ['GigabitEthernet1/0/1', 'GigabitEthernet1/0/2'], 'mirror_source': 'GigabitEthernet1/0/3', 'mirror_dest': 'GigabitEthernet1/0/10' } # TACACS配置 TACACS_CONFIG = { 'scheme_name': 'TACACS_GROUP', 'server_ip': '10.10.10.100', 'key': 'TacacsSecretKey123!', 'vty_range': '0 4' } # ===================== 配置函数 ===================== def configure_ssh(conn): """配置SSH服务并关闭不安全协议""" commands = [ 'public-key local create rsa', # 生成RSA密钥 'ssh server enable', # 启用SSH服务 'ssh user admin service-type all authentication-type password', 'undo telnet server enable', # 关闭Telnet 'undo ftp server', # 关闭FTP 'undo sftp server enable' # 关闭SFTP ] output = conn.send_config_set(commands) logging.info(f"SSH配置完成:\n{output}") def configure_console(conn): """配置Console口参数""" commands = [ 'user-interface con 0', 'idle-timeout 15 0', # 15分钟超时 'authentication-mode password' # 密码认证模式 ] output = conn.send_config_set(commands) logging.info(f"Console配置完成:\n{output}") def configure_tacacs(conn, tacacs_config): """配置TACACS认证""" commands = [ f'tacacs scheme {tacacs_config["scheme_name"]}', f'primary authentication server-address {tacacs_config["server_ip"]}', f'primary authorization server-address {tacacs_config["server_ip"]}', f'key authentication cipher {tacacs_config["key"]}', f'user-interface vty {tacacs_config["vty_range"]}', 'authentication-mode scheme' # 应用TACACS认证 ] output = conn.send_config_set(commands) logging.info(f"TACACS配置完成:\n{output}") def configure_vlan(conn, vlan_config): """创建VLAN并配置接口IP""" commands = [ f'vlan {vlan_config["vlan_id"]}', f'interface Vlan-interface {vlan_config["vlan_id"]}', f'ip address {vlan_config["vlan_ip"]} {vlan_config["subnet_mask"]}' ] output = conn.send_config_set(commands) logging.info(f"VLAN配置完成:\n{output}") def configure_dhcp(conn, dhcp_config): """配置DHCP地址池""" commands = [ 'dhcp enable', # 全局启用DHCP f'dhcp server ip-pool {dhcp_config["name"]}', f'network {dhcp_config["network"]} mask {dhcp_config["mask"]}', f'gateway-list {dhcp_config["gateway"]}', f'dns-list {dhcp_config["dns"]}', f'expired day 7', # 租期7天 f'forbidden-ip {dhcp_config["range_start"]} to {dhcp_config["range_end"]}' ] output = conn.send_config_set(commands) logging.info(f"DHCP配置完成:\n{output}") def configure_trunk_ports(conn, trunk_ports): """配置Trunk接口""" for port in trunk_ports: commands = [ f'interface {port}', 'port link-type trunk', 'port trunk permit vlan all', # 允许所有VLAN 'port trunk pvid vlan 1' # 默认PVID ] output = conn.send_config_set(commands) logging.info(f"接口{port} Trunk配置完成:\n{output}") def configure_port_security(conn, ports): """配置端口安全检测""" for port in ports: commands = [ f'interface {port}', 'port-security enable', # 启用端口安全 'port-security intrusion-mode disable-port' # 非法接入时禁用端口 ] output = conn.send_config_set(commands) logging.info(f"端口{port}安全配置完成:\n{output}") def configure_mirror_port(conn, source_port, dest_port): """配置端口镜像""" commands = [ 'mirroring-group 1 local', f'mirroring-group 1 mirroring-port {source_port} both', # 双向流量 f'mirroring-group 1 monitor-port {dest_port}' ] output = conn.send_config_set(commands) logging.info(f"镜像口配置完成:\n{output}") def save_configuration(conn): """保存配置到设备""" output = conn.save_config() # Netmiko内置保存方法 logging.info(f"配置已保存:\n{output}") # ===================== 主执行逻辑 ===================== def main(): # 配置日志记录 logging.basicConfig( filename='h3c_config.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) try: # 建立SSH连接 with ConnectHandler(**SWITCH) as conn: logging.info(f"成功连接到交换机 {SWITCH['ip']}") # 按顺序执行配置任务 configure_ssh(conn) configure_console(conn) configure_tacacs(conn, TACACS_CONFIG) configure_vlan(conn, VLAN_CONFIG) configure_dhcp(conn, DHCP_POOL) configure_trunk_ports(conn, INTERFACE_CONFIG['trunk_ports']) configure_port_security(conn, INTERFACE_CONFIG['trunk_ports']) configure_mirror_port(conn, INTERFACE_CONFIG['mirror_source'], INTERFACE_CONFIG['mirror_dest']) # 保存配置 save_configuration(conn) logging.info("所有配置任务完成!") print("配置成功完成!详细日志请查看 h3c_config.log") except NetmikoAuthenticationException: logging.error("认证失败:请检查用户名/密码") print("错误:认证失败,请检查凭据") except NetmikoTimeoutException: logging.error("连接超时:无法访问设备") print("错误:设备不可达或IP地址错误") except Exception as e: logging.error(f"未预期错误:{str(e)}") print(f"配置失败:{str(e)}") if __name__ == "__main__": main() 整理成文章发布。
最新发布
06-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值