内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。更多视频教程www.fgedu.net.cn
本文档风哥主要介绍Linux系统无IP地址或无法获取DHCP地址的故障排查方法,包括DHCP工作原理、常见故障原因分析、诊断工具使用,以及生产环境中的实战案例,适合系统管理员在网络故障排查时参考。
Part01-基础概念与理论知识
1.1 DHCP工作原理
DHCP(Dynamic Host Configuration Protocol)动态主机配置协议是一种网络协议,用于自动分配IP地址和其他网络配置参数。了解DHCP工作原理对于故障排查至关重要。
1. DHCP Discover(发现)
– 客户端广播寻找DHCP服务器
– 源地址:0.0.0.0
– 目的地址:255.255.255.255
2. DHCP Offer(提供)
– DHCP服务器响应并提供IP地址
– 包含:IP地址、子网掩码、网关、DNS等
3. DHCP Request(请求)
– 客户端广播请求使用该IP地址
– 确认接受DHCP服务器提供的配置
4. DHCP Acknowledge(确认)
– DHCP服务器确认分配
– 客户端开始使用IP地址
# DHCP租约过程
– 租约时间:IP地址的有效期
– T1(50%):客户端尝试续租
– T2(87.5%):客户端尝试重新绑定
– 租约到期:IP地址被回收
1.2 无法获取IP的常见原因
无法获取IP地址的原因多种多样,需要系统性地排查:
- 客户端问题:网卡未启用、驱动问题、配置错误
- 网络问题:网线未连接、交换机端口故障、VLAN配置错误
- DHCP服务器问题:服务未运行、地址池耗尽、配置错误
- 网络策略问题:防火墙阻断、DHCP Snooping、端口安全
1.3 故障排查流程
系统性的故障排查流程可以提高排查效率:
步骤1: 检查物理连接
├─ 网线是否连接
├─ 网卡指示灯状态
└─ 交换机端口状态
步骤2: 检查网卡状态
├─ 网卡是否启用
├─ 驱动是否加载
└─ 是否有冲突
步骤3: 检查网络配置
├─ 配置文件是否正确
├─ NetworkManager状态
└─ 是否配置为DHCP模式
步骤4: 检查DHCP客户端
├─ dhclient进程状态
├─ DHCP请求日志
└─ 租约文件状态
步骤5: 检查网络连通性
├─ 能否ping通网关
├─ 能否访问DHCP服务器
└─ 是否有防火墙阻断
步骤6: 检查DHCP服务器
├─ 服务是否运行
├─ 地址池是否耗尽
└─ 配置是否正确
Part02-生产环境规划与建议
# DHCP故障诊断工具
## 网络接口工具
1. ip link – 查看网卡状态
2. ip addr – 查看IP地址配置
3. ifconfig – 传统网络配置工具
4. ethtool – 网卡详细信息
## DHCP客户端工具
1. dhclient – DHCP客户端
2. dhclient-script – DHCP配置脚本
3. dhcrelay – DHCP中继代理
## 网络诊断工具
1. ping – 测试连通性
2. tcpdump – 抓包分析
3. nmap – 端口扫描
4. nc – 网络测试
## 日志查看工具
1. journalctl – systemd日志
2. tail/grep – 日志过滤
3. /var/log/messages – 系统日志
2.2 排查策略设计
制定合理的排查策略可以提高效率:
## 1. 分层排查
– 物理层:检查网线、网卡、交换机
– 数据链路层:检查MAC地址、VLAN
– 网络层:检查IP地址、路由
– 应用层:检查DHCP服务
## 2. 由简到繁
– 先检查配置文件
– 再检查服务状态
– 最后检查网络设备
## 3. 对比排查
– 对比正常主机配置
– 对比历史配置
– 对比不同环境
## 4. 抓包分析
– 抓取DHCP数据包
– 分析DORA过程
– 定位故障环节
2.3 预防措施
预防措施可以减少故障发生:
## 1. 配置备份
– 定期备份网络配置文件
– 记录关键配置参数
– 建立配置变更记录
## 2. 监控告警
– 监控DHCP服务器状态
– 监控地址池使用率
– 设置告警阈值
## 3. 冗余设计
– 部署多台DHCP服务器
– 配置DHCP故障转移
– 保留静态IP地址
## 4. 文档管理
– 记录网络拓扑
– 记录IP地址分配
– 记录故障处理过程
Part03-生产环境项目实施方案
3.1 网络接口状态检查
3.1.1 查看网卡状态
$ ip link show
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
# 查看指定网卡状态
$ ip link show ens33
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
# 状态说明
# UP – 网卡已启用
# DOWN – 网卡已禁用
# LOWER_UP – 物理连接正常
# UNKNOWN – 状态未知(如回环接口)
# 启用网卡
$ ip link set ens33 up
# 禁用网卡
$ ip link set ens33 down
3.1.2 查看IP地址配置
$ ip addr show
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic ens33
valid_lft 86345sec preferred_lft 86345sec
# 查看指定网卡IP地址
$ ip addr show ens33
# 如果没有IP地址,输出类似:
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
# 注意:没有inet行,表示没有IP地址
# 查看网卡详细信息
$ ethtool ens33
Settings for ens33:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: off (auto)
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
3.2 DHCP服务状态检查
3.2.1 检查DHCP客户端进程
$ ps aux | grep dhclient
root 1234 0.0 0.1 12345 6789 ? Ss 10:00 0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf /var/lib/NetworkManager/dhclient-5fb06bd0-0bb0-7ffb-45f1-d6edd65f9e4a-ens33.lease -cf /var/lib/NetworkManager/dhclient-ens33.conf ens33
# 如果没有dhclient进程,表示DHCP客户端未运行
# 查看DHCP租约文件
$ cat /var/lib/NetworkManager/dhclient-ens33.lease
lease {
interface “ens33”;
fixed-address 192.168.1.100;
option subnet-mask 255.255.255.0;
option routers 192.168.1.1;
option dhcp-lease-time 86400;
option dhcp-message-type 5;
option domain-name-servers 192.168.1.1,8.8.8.8;
option dhcp-server-identifier 192.168.1.1;
renew 4 2026/04/06 18:30:25;
rebind 5 2026/04/07 06:30:25;
expire 5 2026/04/07 09:30:25;
}
# 查看DHCP租约时间
$ leasequery ens33
Interface: ens33
IP Address: 192.168.1.100
Lease Time: 86400 seconds
Renewal Time: 43200 seconds
Rebinding Time: 75600 seconds
3.2.2 手动请求DHCP地址
$ sudo dhclient -r ens33
Killed old client process
# 请求新的IP地址
$ sudo dhclient -v ens33
Internet Systems Consortium DHCP Client 4.4.2b1
Copyright 2004-2019 Internet Systems Consortium.
All righ更多学习教程公众号风哥教程itpux_comts reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/ens33/00:0c:29:12:34:56
Sending on LPF/ens33/00:0c:29:12:34:56
Sending on Socket/fallback
DHCPDISCOVER on ens33 to 255.255.255.255 port 67 interval 6 (xid=0x12345678)
DHCPOFFER of 192.168.1.100 from 192.168.1.1
DHCPREQUEST for 192.168.1.100 on ens33 to 255.255.255.255 port 67 (xid=0x12345678)
DHCPACK of 192.168.1.100 from 192.168.1.1 (xid=0x12345678)
bound to 192.168.1.100 — renewal in 41234 seconds.
# 如果长时间没有响应,表示DHCP服务器不可达或配置错误
# 查看DHCP请求过程
$ sudo tcpdump -i ens33 port 67 or port 68 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
10:30:25.123456 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:29:12:34:56, length 300
10:30:25.234567 IP 192.168.1.1.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 300
3.3 手动配置IP地址
3.3.1 临时配置IP地址
$ sudo ip addr add 192.168.1.200/24 dev ens33
# 验证配置
$ ip addr show ens33
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.200/24 scope global ens33
valid_lft forever preferred_lft forever
# 添加默认网关
$ sudo ip route add default via 192.168.1.1
# 验证路由
$ ip route show
default via 192.168.1.1 dev ens33
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.200
# 测试连通性
$ ping -c 3 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.523 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.456 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.489 ms
# 删除IP地址
$ sudo ip addr del 192.168.1.200/24 dev ens33
3.3.2 永久配置IP地址
$ sudo nmcli connection modify ens33 IPv4.method manual IPv4.addresses 192.168.1.200/24 IPv4.gateway 192.168.1.1 IPv4.dns “192.168.1.1,8.8.8.8”
# 重新激活连接
$ sudo nmcli connection up ens33
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
# 验证配置
$ nmcli connection show ens33
connection.id: ens33
connection.type: 802-3-ethernet
connection.autoconnect: yes
IPv4.method: manual
IPv4.addresses: 192.168.1.200/24
IPv4.gateway: 192.168.1.1
IPv4.dns: 学习交流加群风哥微信: itpux-com 192.168.1.1,8.8.8.8
# 使用配置文件方式
$ sudo cat > /etc/sysconfig/network-scripts/ifcfg-ens33 << EOF
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.1.200
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1
DNS2=8.8.8.8
EOF
# 重启网络服务
$ sudo systemctl restart NetworkManager
Part04-生产案例与实战讲解
4.1 案例1:网卡未启用导致无IP
某服务器重启后无法获取IP地址,排查发现网卡未启用。
$ ip addr show ens33
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
# 注意:state DOWN,没有inet行
# 排查步骤
## 1. 检查网卡配置
$ nmcli device status
DEVICE TYPE STATE CONNECTION
ens33 ethernet unavailable —
lo loopback unmanaged —
## 2. 检查配置文件
$ cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=ens33
DEVICE=ens33
ONBOOT=no # 问题:ONBOOT=no,系统启动时不会启用网卡
## 3. 解决方案
# 修改配置文件
$ sudo sed -i ‘s/ONBOOT=no/ONBOOT=yes/’ /etc/sysconfig/network-scripts/ifcfg-ens33
# 或使用nmcli
$ sudo nmcli connection modify ens33 connection.autoconnect yes
# 启用网卡
$ sudo nmcli connection up ens33
## 4. 验证结果
$ ip addr show ens33
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic ens33
valid_lft 86345sec preferred_lft 86345sec
# 成功获取IP地址
4.2 案例2:DHCP服务器故障
多台服务器同时无法获取IP地址,排查发现DHCP服务器故障。
$ sudo dhclient -v ens33
Internet Systems Consortium DHCP Client 4.4.2b1
Listening on LPF/ens33/00:0c:29:12:34:56
Sending on LPF/ens33/00:0c:29:12:34:56
Sending on Socket/fallback
DHCPDISCOVER on ens33 to 255.255.255.255 port 67 interval 3 (xid=0x12345678)
DHCPDISCOVER on ens33 to 255.255.255.255 port 67 interval 7 (xid=0x12345678)
DHCPDISCOVER on ens33 to 255.255.255.255 port 67 interval 15 (xid=0x12345678)
# 长时间无响应
# 排查步骤
## 1. 抓包分析
$ sudo tcpdump -i ens33 port 67 or port 68 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
10:30:25.123456 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:29:12:34:56
# 只有请求,没有响应
## 2. 检查网络连通性
$ ping -c 3 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
From 192.168.1.100 icmp_seq=1 Destination Host Unreachable
# 无法ping通网关
## 3. 检查交换机配置
# 登录交换机查看DHCP Snooping配置
# 发现DHCP Snooping阻止了DHCP响应
## 4. 解决方案
# 临时方案:手动配置静态IP
$ sudo ip addr add 192.168.1.200/24 dev ens33
$ sudo ip route add default via 192.168.1.1
# 永久方案:修复DHCP服务器
# 在交换机上配置DHCP信任端口
# 或修复DHCP服务器服务
## 5. 验证结果
$ ip addr show ens33
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.200/24 scope global ens33
valid_lft forever preferred_lft forever
4.3 案例3:网络配置文件错误
服务器无法获取IP地址,排查发现网络配置文件错误。
$ systemctl status NetworkManager
● NetworkManager.service – Network Manager
Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2026-04-06 10:00:00 CST; 30min ago
Main PID: 1234 (NetworkManager)
Tasks: 4 (limit: 4915)
Memory: 12.3M
CGroup: /system.slice/NetworkManager.service
└─1234 /usr/sbin/NetworkManager –no-daemon
$ ip addr show ens33
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
# 没有IP地址
# 排查步骤
## 1. 检查NetworkManager日志
$ journalctl -u NetworkManager -n 50
Apr 06 10:00:25 server1 NetworkManager[1234]:
Apr 06 10:00:25 server1 NetworkManager[1234]:
## 2. 检查配置文件
$ cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.1.200 # 错误:BOOTPROTO=dhcp时不应有静态IP配置
NETMASK=255.255.255.0 # 错误:BOOTPROTO=dhcp时不应有子网掩码
## 3. 解决方案
# 修改配置文件,移除静态IP配置
$ sudo cat > /etc/sysconfig/network-scripts/ifcfg-ens33 << EOF
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=ens33
DEVICE=ens33
ONBOOT=yes
EOF
# 或使用nmcli
$ sudo nmcli connection modify ens33 IPv4.method auto
$ sudo nmcli connection modify ens33 IPv4.addresses "" IPv4.gateway "" IPv4.dns ""
## 4. 重新激活连接
$ sudo nmcli connection up ens33
Connection successfully activated
## 5. 验证结果
$ ip addr show ens33
2: ens33:
link/ether 00:0c:29:12:34:56 brd ff:ff:ff:学习交流加群风哥QQ113257174ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic ens33
valid_lft 86345sec preferred_lft 86345sec
Part05-风哥经验总结与分享
5.1 故障排查经验总结
在生产环境中进行DHCP故障排查,需要遵循以下原则:
## 1. 排查原则
– 由简到繁:先检查配置,再检查服务
– 分层排查:物理层→数据链路层→网络层→应用层
– 对比排查:对比正常主机配置
– 抓包分析:使用tcpdump分析DHCP过程
## 2. 常见误区
– 不要只看配置文件:也要检查服务状态
– 不要忽视物理连接:网线、端口都可能出问题
– 不要忘记防火墙:可能阻断DHCP数据包
– 不要忽略日志:日志包含重要诊断信息
## 3. 快速定位
– 无IP地址:检查网卡状态、DHCP客户端
– 有IP但无法通信:检查网关、路由、防火墙
– DHCP请求超时:检查DHCP服务器、网络策略
– IP地址冲突:检查网络中是否有重复IP
5.2 快速排查检查清单
## 物理层检查
– [ ] 网线是否连接
– [ ] 网卡指示灯状态
– [ ] 交换机端口状态
– [ ] 网卡是否启用
## 配置检查
– [ ] 配置文件是否正确
– [ ] BOOTPROTO是否为dhcp
– [ ] ONBOOT是否为yes
– [ ] 是否有冲突配置
## 服务检查
– [ ] NetworkManager是否运行
– [ ] dhclient进程是否存在
– [ ] DHCP租约文件是否存在
– [ ] 是否有错误日志
## 网络检查
– [ ] 能否ping通网关
– [ ] 能否访问DHCP服务器
– [ ] 是否有防火墙阻断
– [ ] 是否有VLAN隔离
## 抓包分析
– [ ] 是否发送DHCP Discover
– [ ] 是否收到DHCP Offer
– [ ] 是否发送DHCP Request
– [ ] 是否收到DHCP Ack
5.3 常用工具推荐
根据不同的排查场景,推荐以下工具:
## 网络接口工具
1. ip link/addr – 查看网卡状态和IP配置
2. ethtool – 查看网卡详细信息
3. nmcli – NetworkManager命令行工具
## DHCP客户端工具
1. dhclient – DHCP客户端
2. dhclient-script – DHCP配置脚本
3. nmtui – NetworkManager文本界面
## 网络诊断工具
1. ping – 测试连通性
2. tcpdump – 抓包分析
3. nmap – 端口扫描
4. traceroute – 路由追踪
## 日志查看工具
1. journalctl – systemd日志
2. tail/grep – 日志过滤
3. less – 日志查看
## 配置管理工具
1. nmcli – NetworkManager配置
2. nmtui – NetworkManager文本界面
3. vi/nano – 配置文件编辑
风哥提示:
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
