分析DHCP Log,对比出未加域的黑名单

SQL脚本如下:


USE [DHCP]
GO
/****** Object:  StoredProcedure [dbo].[usp_DHCP_Blacklist]    Script Date: 2016/8/10 15:36:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ===============================================
-- Author:		Burgess
-- Create date: 2016/4/15
-- Description:	分析DHCP Log,对比出未加域的黑名单
-- ===============================================
ALTER PROCEDURE [dbo].[usp_DHCP_Blacklist]
AS
BEGIN
	SET NOCOUNT ON;
	--声明变量
	declare @cmd varchar(2000),
			@sqlcmd varchar(2000),
			@SharePth varchar(200),
			@FileName varchar(50) ,
			@FilePath varchar(200), 
			@OutFileName varchar(100),		
			@OutFilePath varchar(300),
			@CurrentRow int,
			@BeginRow varchar(10)
			
	--设置默认值
	set language N'English'
	set @FileName = 'DhcpSrvLog-'+LEFT(DATENAME(WEEKDAY,GETDATE()),3)+'.log'
	IF LEFT(DATENAME(WEEKDAY,GETDATE()),3)='Fri'
		set @FileName='DhcpSrvLog-Sat.log'
	--set @FileName = 'DhcpSrvLog-Mon.log'
	set @SharePth = '\\dhcp-sh1\dhcp\'
	set @FilePath='D:\'
	set @OutFilePath='D:\'
	set @OutFileName='BlackList-'+CONVERT(VARCHAR(8), GETDATE(), 112)+REPLACE(CONVERT(VARCHAR, GETDATE(), 108),':','')+'.xls'
	
	SELECT @CurrentRow=COUNT(1) FROM RAWDATA WHERE GenDate=CONVERT(VARCHAR,GETDATE(),1)
	IF @CurrentRow=0
		UPDATE ROWNO SET CurrentRow=2 WHERE ID=1
	ELSE
		UPDATE ROWNO SET CurrentRow+=@CurrentRow WHERE ID=1

	SELECT @BeginRow=CurrentRow FROM ROWNO WHERE ID=1

	print 'Begin:'+CONVERT(varchar(15), GETDATE(), 114)
	--清理表RAWDATA
	TRUNCATE TABLE RAWDATA
	
	--copy file
	set @cmd='copy '+ @SharePth+@FileName+' '+@FilePath+@FileName
	EXEC master..xp_cmdshell @cmd --, no_output
	print 'Copy log file finished:'+CONVERT(varchar(15), GETDATE(), 114)
	--解析log文件,将数据存入表RAWDATA  --''D:\DhcpSrvLog-Mon.log''
	set @cmd='BULK INSERT DHCP.DBO.RAWDATA 
	FROM '''+@FilePath+ @FileName+'''
	WITH(MAXERRORS  = 0 ,
	FIELDTERMINATOR ='','',
	FIRSTROW ='+@BeginRow+',
	ROWTERMINATOR=''\n'',
	--KEEPNULLS,
	TABLOCK
	)'
	
	print @cmd
	execute (@cmd)
	print 'Parse log file finished:'+CONVERT(varchar(15), GETDATE(), 114)
	--提取各HostName的最新一笔记录
	;WITH A AS(
	SELECT ROW_NUMBER() OVER(PARTITION BY HOSTNAME ORDER BY GENTIME DESC) RID,ID,GENDATE,GENTIME,IPADDR,HOSTNAME,MACADDR FROM RAWDATA WHERE HostName IS NOT NULL 
	)
	SELECT ID,GENDATE,GENTIME,IPADDR,HOSTNAME,MACADDR INTO #DHCP FROM A WHERE RID=1

	;WITH B AS(
	SELECT ROW_NUMBER() OVER(PARTITION BY MACADDR ORDER BY GENTIME DESC) RID,ID,GENDATE,GENTIME,IPADDR,MACADDR AS HOSTNAME,MACADDR FROM RAWDATA WHERE HostName IS NULL AND MACADDR IS NOT NULL AND LEN(MACADDR)<=18
	)
	INSERT #DHCP 
	SELECT B.ID,B.GENDATE,B.GENTIME,B.IPADDR,B.HOSTNAME,B.MACADDR FROM B LEFT JOIN #DHCP D ON B.MACAddr=D.MACAddr WHERE B.RID=1 AND D.MACAddr IS NULL 
	print 'Process raw data finished: '+CONVERT(varchar(15), GETDATE(), 114)
	--将数据同步到存放所有联网的主机信息表DHCP
	MERGE INTO DHCP AS A 
	USING #DHCP AS B
	ON A.HOSTNAME=B.HOSTNAME 
	WHEN MATCHED THEN
		UPDATE SET A.ID=B.ID, A.GENDATE=B.GENDATE,A.GENTIME=B.GENTIME,A.IPADDR=B.IPADDR,A.MACADDR=B.MACADDR 
	WHEN NOT MATCHED THEN
		INSERT (ID, GenDate, GenTime, IPAddr, HostName, MACAddr) 
		VALUES(B.ID, B.GenDate, B.GenTime, B.IPAddr, B.HostName, B.MACAddr);
	print 'Synchronize data finished: '+CONVERT(varchar(15), GETDATE(), 114)
	--将黑名单导出
--	Set @sqlCmd= 'BCP "SELECT ID,GENDATE,GENTIME,IPADDR,D.HOSTNAME,D.MACADDR 
--FROM DBO.DHCP D WITH(NOLOCK) LEFT JOIN dbo.Workstations W WITH(NOLOCK) 
--ON REPLACE(D.HostName,'.abcd.com','')=W.NAME WHERE D.ID<>15 AND D.HostName<>D.MACAddr AND W.NAME IS NULL 
--AND D.HostName NOT LIKE 'android%' AND D.HostName NOT LIKE '%iphone%'
--AND D.HostName NOT LIKE '%ipad%' AND D.HostName NOT LIKE 'MiBOX%'
--AND D.HostName NOT LIKE 'vivo%'  " QueryOut '+@OutFilePath+@OutFileName+' -c -T' 
--	EXEC master..xp_cmdshell @sqlCmd --, no_output

	

END

<think>好的,我现在需要帮助用户解决在麒麟操作系统下无法自动获取IP的问题,并且需要提供DHCP故障的解决方案。首先,我得回忆一下用户之前的提问和我的回答,看看有没有相关的信息可以借鉴。 用户之前的问题是关于基于Python的个性化课程推荐系统的国内外研究现状,和现在的问题似乎关联不大。不过,用户提供了几个引用,其中提到了DHCP、IP地址冲突、Linux网络配置等内容。我需要参考这些引用,尤其是引用[1]、[2]、[3]、[4]中的相关信息。 首先,用户现在的问题是麒麟系统无法自动获取IP。根据引用[1],DHCP是基于UDP的客户机/服务器协议,分配IP有三种方式:固定、动态、自动。自动获取IP通常涉及DHCP客户端正确配置,所以需要检查麒麟系统上的DHCP客户端服务是否正常运行。 引用[2]提到了使用nmcli配置静态IP的方法,虽然用户现在需要自动获取,但可以反向思考,检查是否错误配置了静态IP,导致无法自动获取。可能需要查看网络配置文件,确认是否设置为DHCP模式。 引用[3]提到了IP地址冲突和DHCP池的问题,如果DHCP分配的IP与手动设置的设备冲突,也可能导致获取失败。需要检查网络中的IP冲突情况,以及DHCP服务器的地址池范围。 引用[4]提到了Linux系统的配置核查和高可用集群,虽然麒麟系统可能基于Linux,但具体故障可能涉及网络服务是否正常,比如NetworkManager或dhclient服务是否运行。 接下来,我需要按照逻辑步骤来组织解决方案: 1. **检查DHCP服务状态**:确认麒麟系统上的DHCP客户端服务(如NetworkManager、dhclient)是否运行正常。如果服务未启动,需要启动并设置开机自启。 2. **验证网络配置文件**:查看/etc/sysconfig/network-scripts/目录下的网卡配置文件,确保BOOTPROTO设置为dhcp,而非static或manual。如果有静态配置残留,需要更正。 3. **使用nmcli命令行工具**:参考引用[2]中的nmcli命令,但用户需要的是自动获取,所以可能需要释放当前IP并重新获取,比如使用dhclient -r释放,然后dhclient重新获取。 4. **排查IP地址冲突**:如引用[3]所述,使用arp-scan或ping检测是否有IP冲突,如果有,需要调整DHCP服务器的地址池范围,避免与静态分配的IP重叠。 5. **检查DHCP服务器状态**:用户的问题可能不在客户端,而在服务器端。需要确认路由器或DHCP服务器是否正常运行,地址池是否足够,并且麒麟系统在可分配范围内。 6. **查看日志文件**:通过journalctl或/var/log/messages检查DHCP过程中的错误信息,帮助定位问题。 7. **更新系统与驱动**:如引用[3]提到的更新固件,检查麒麟系统的网络驱动是否有更新,或者系统补丁是否安装,可能修复了相关bug。 8. **防火墙与SELinux**:确保防火墙没有阻止DHCP的UDP端口67和68,SELinux策略是否影响了网络服务。 在组织这些步骤时,需要考虑到用户可能的技术水平,提供具体的命令和操作示例,比如nmcli的具体命令,如何编辑配置文件等。同时,引用之前提到的引用内容来增强解决方案的可信度,例如引用[1]解释DHCP协议,引用[3]处理IP冲突。 最后,需要验证每个步骤的有效性,并给进一步排查的建议,比如如果上述步骤无效,可能需要更深入的网络抓包分析,或者联系网络管理员检查DHCP服务器配置。这样用户可以根据步骤逐步排查,解决问题。</think>### 麒麟操作系统自动获取IP配置方法与DHCP故障解决方案 #### 一、基础配置方法(DHCP模式) 1. **使用图形界面配置** - 打开网络设置 → 选择对应网卡(如`eth0`) → 设置IPv4为“自动(DHCP)” → 保存并重启网络服务。 - **验证命令**: ```bash ip addr show eth0 # 查看是否获取到IP(需含`dynamic`标签) ``` 2. **通过nmcli命令行配置**(适用于无图形界面场景) ```bash nmcli con mod eth0 ipv4.method auto # 设置DHCP模式 nmcli con down eth0 && nmcli con up eth0 # 重启网络连接 ``` *注:若系统使用`NetworkManager`服务,需确保其处于运行状态:`systemctl status NetworkManager`[^2]。* --- #### 二、DHCP故障排查与解决方案 ##### **场景1:无法获取IP地址(无任何IP分配)** 1. **检查DHCP客户端服务** - 麒麟系统默认使用`dhclient`作为DHCP客户端,验证其是否运行: ```bash ps aux | grep dhclient # 查看进程是否存在 ``` - 若未运行,手动触发DHCP请求: ```bash dhclient -v eth0 # 输详细日志观察交互过程 ``` 2. **排查防火墙/SELinux限制** - DHCP协议依赖UDP端口67(服务器)和68(客户端),确保防火墙放行: ```bash firewall-cmd --list-ports | grep 67 # 检查防火墙规则 ``` - 临时关闭SELinux测试: ```bash setenforce 0 # 若问题解决,需调整SELinux策略规则 ``` 3. **检查网络配置文件** - 确认`/etc/sysconfig/network-scripts/ifcfg-eth0`中参数正确: ```ini BOOTPROTO=dhcp # 关键参数 ONBOOT=yes # 确保网卡开机启动 ``` ##### **场景2:获取到错误IP或冲突IP** 1. **检测IP地址冲突**(引用[3]案例) - 使用`arp-scan`扫描局网内IP占用情况: ```bash arp-scan -I eth0 --localnet # 检查是否有重复IP ``` - 若发现冲突,联系网络管理员调整DHCP服务器地址池范围(如排除手动设置的静态IP段)。 2. **清除旧DHCP租约文件** ```bash rm -f /var/lib/dhclient/dhclient.leases # 删除旧租约 systemctl restart NetworkManager # 重启服务 ``` ##### **场景3:DHCP响应超时** 1. **抓包分析DHCP交互** - 使用`tcpdump`捕获DHCP报文: ```bash tcpdump -i eth0 port 67 or port 68 -vv # 观察DISCOVER/OFFER流程 ``` - **常见问题**: - 客户端未发送`DISCOVER`:网卡驱动异常或物理链路故障(检查网线、交换机端口)。 - 服务器未回复`OFFER`:DHCP服务未运行或网络隔离(如VLAN配置错误)。 2. **检查DHCP服务器状态** - 登录路由器/DHCP服务器,确认: - 地址池未耗尽(如`192.168.1.50-150`是否已满[^3])。 - 麒麟系统的MAC地址未被加入黑名单--- #### 三、高级调试与日志分析 1. **查看DHCP客户端日志** ```bash journalctl -u NetworkManager --since "5 minutes ago" | grep DHCP # 过滤关键错误 ``` - **典型错误**: - `DHCP request failed: No DHCP offers received`:客户端未收到服务器响应(物理层或配置问题)。 - `DHCP lease lost`:租约到期后无法续期(网络波动或服务器拒绝续约)。 2. **手动指定DHCP服务器测试** ```bash dhclient -d -v -sf /sbin/dhclient-script eth0 -H kylin-pc # 强制指定主机名 ``` *注:`-H`参数可解决某些DHCP服务器基于主机名的过滤策略。* --- #### 四、补充解决方案 - **更新网卡驱动与固件**(引用[3]建议) 使用`lspci -v`查看网卡型号,访问厂商官网下载最新驱动(如Intel网卡需更新`e1000e`驱动)。 - **切换网络管理工具** 若`NetworkManager`异常,可改用`systemd-networkd`: ```bash systemctl disable NetworkManager && systemctl enable systemd-networkd ``` --- ### 相关问题 1. 如何检测麒麟系统中的网络接口是否支持DHCP协议? 2. DHCP租约到期后系统会自动续期吗? 3. 麒麟系统中如何永久禁用IPv6以避免DHCP干扰? --- [^1]: DHCP协议通过UDP端口实现动态IP分配,需确保客户端与服务器通信正常。 [^2]: `nmcli`是NetworkManager的命令行工具,可高效管理网络配置。 [^3]: IP地址冲突是DHCP故障的常见原因,需定期检查地址池规划。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值