1. 上手前的思路整理:CentOS 7 的网络到底是怎么管起来的
搞 Linux 运维的人,基本都绕不开 CentOS 7。虽然现在新一代的系统层出不穷,但 CentOS 7 在企业服务器、老旧生产环境、各类实验平台里依然占有相当大的比例。很多刚接触它的人,第一次被卡住往往不是在装系统,而是装完之后发现上不了网。明明网线插着、IP 配了,ping 网关通,ping 外网不通,或者更奇怪——重启一下机器,网络就“消失”了。
这篇文章,咱们就把 CentOS 7 的上网设置流程从头到尾捋一遍。不绕弯子,直接聊怎么配静态 IP、怎么处理 DNS、怎么让配置在重启后依然生效,以及那些你早晚会遇到的网络故障排查套路。我尽量用实际运维中的说法来讲,而不是照着官方手册念。
先说个最核心的概念:CentOS 7 里负责网络的有两套体系——传统的network服务和新一代的NetworkManager。很多人配置网络失败,根源就是这两者没搞清楚。NetworkManager是动态管理网络的守护进程,它会在系统启动时检测网卡、自动连接网络,也会管理你手动敲的命令。而/etc/sysconfig/network-scripts/下的 ifcfg 文件,则是两套体系都要读取的配置文件。
所以配置 CentOS 7 网络,本质上就三件事:搞清楚网卡叫什么名字、写对 ifcfg 配置文件、然后让配置真正生效。只要这三点不犯迷糊,剩下的事情都很直接。
2. 配置前的准备工作:先弄清楚你的网卡叫什么
2.1 查看网卡信息的几条命令
不管是配静态 IP 还是 DHCP,第一步永远是确认系统看到的网卡名称。CentOS 7 默认采用一致的网络设备命名规则,网卡名一般是ens33、ens160、eth0这种格式,不会像旧版那样千篇一律都用eth0。我用得最多的查看命令是:
ip addr或者用传统的:
ifconfig -aifconfig在最小化安装的 CentOS 7 里可能没装,得先yum install net-tools。所以更推荐直接用ip addr,输出信息更完整,能看到 MAC 地址、IPv4、IPv6 状态。
另外还有一条命令适合确认系统给网卡起的名称:
dmesg | grep eth这条能看到内核在驱动加载阶段对网卡的识别信息。如果系统里有多个网卡,ip addr会全部列出来,注意区分哪个是真实的物理网卡、哪个是虚拟接口(比如virbr0是虚拟化默认网桥),别配错了。
2.2 记住一条原则:网卡配置文件与网卡名严格对应
/etc/sysconfig/network-scripts/目录下,每个网卡对应一个ifcfg-网卡名文件。比如网卡叫ens33,配置文件就是ifcfg-ens33。这个文件名必须和网卡名完全一致,否则 NetworkManager 可能识别不到设备,或者出现“设备未托管”的报错。
先看一眼这个目录下的内容:
ls /etc/sysconfig/network-scripts/正常会看到ifcfg-lo(回环接口)和至少一个ifcfg-ensxxx(物理网卡)。如果你新加的网卡没有对应的配置文件,最简单的方式是直接用模板新建一个,内容我们下一节细讲。
3. 核心配置实操:从 DHCP 到静态 IP 一步步来
3.1 最省事的方案:用 DHCP 自动获取地址
如果你是装在虚拟机里,或者公司内网有 DHCP 服务器,那最简单的上网方式就是让网卡自动获取 IP。编辑对应的配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-ens33正常情况下,DHCP 的配置长这样:
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=dhcp DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx DEVICE=ens33 ONBOOT=yes这里最关键的三个字段是:
BOOTPROTO=dhcp:告诉系统用 DHCP 协议拿地址。ONBOOT=yes:开机自动启用这块网卡。如果这里写成no,重启后网卡不会自动拉起,百分之百上不了网。DEVICE=ens33:设备名。
改成 DHCP 后,重启网络服务或者重载配置就能生效。
3.2 推荐做法:配置静态 IP 的完整步骤
实际工作中,服务器和虚拟机更常用静态 IP,尤其是运维场景,IP 变了就意味着你的自动化脚本、SSH 连接记录全得跟着改。静态 IP 的配置信息也不复杂,完整示例如下:
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=none DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx DEVICE=ens33 ONBOOT=yes IPADDR=192.168.1.100 PREFIX=24 GATEWAY=192.168.1.1 DNS1=223.5.5.5 DNS2=114.114.114.114注意BOOTPROTO=none,这表示不通过 DHCP 分配。IPADDR是你要设置的固定地址,PREFIX是子网掩码的简写方式,24等同于255.255.255.0。这里我用的是 PREFIX 写法,比老的NETMASK=255.255.255.0更直观。
GATEWAY 是网关地址,必须和你的实际网络环境一致。虚拟机的话,网关通常是对应虚拟网卡的网关地址(比如 VMware NAT 模式一般填192.168.x.2)。DNS1、DNS2 是国内常用的公共 DNS,配置好后,域名解析就不会出问题。
这里有个常见的坑,我必须专门提醒:如果你的网关填错了,或者和 IP 不在同一个网段,那就会出现“局域网能通、外网不通”的诡异现象。判断方法很简单,ping一下网关,通但不代表能上外网,还需要检查路由和 DNS。
3.3 让配置生效的三种方式,以及各自的使用场景
改完配置文件,接下来是让新配置生效,这是新手最分不清的部分。我列一下三种常用方式和使用场景。
第一种,重启 NetworkManager 服务:
systemctl restart NetworkManager这种方式会重新读取配置,断网时间短,但对依赖 NetworkManager 管理的服务可能会有短暂影响。建议在 SSH 远程操作时慎用,因为你可能把自己断出去。
第二种,重启 network 服务:
systemctl restart network这是传统的重启网络方式。CentOS 7 里 network 服务默认存在,但如果你之前关闭了 NetworkManager,这里要注意两者是否冲突。一般情况下,重启 network 服务后 ifcfg 文件会被重新加载。
第三种,使用nmcli工具重载连接:
nmcli connection reload nmcli connection up ens33这是我最推荐的方式。nmcli connection reload会重新读取配置文件,nmcli connection up ens33会针对该连接重新激活。比起整个重启网络服务,这种方式更精细,风险更小。特别是你有多块网卡、想要只调整其中一块时,用 nmcli 是最稳妥的。
提示:如果你所在的场景是全新安装的最小化 CentOS 7,可能默认没装 net-tools,但 nmcli 是 NetworkManager 自带的,肯定会存在。所以优先学 nmcli 操作没问题。
3.4 验证配置是否生效的检查清单
配置完别急着关终端,做一轮验证:
ip addr show ens33 ip route show cat /etc/resolv.conf ping -c 4 192.168.1.1 ping -c 4 223.5.5.5 nslookup www.baidu.com这六条命令分别检查:网卡 IP 地址是否生效、路由表是否有默认路由、DNS 是否写入、网关是否可通、外网是否可通、域名解析是否正常。哪个环节挂了,都能从这几条输出里找到线索。
4. 从失败案例中提炼的排查技巧:上不了网时别慌
4.1 重启后网卡没启动:检查 ONBOOT 和 NetworkManager 状态
这是 CentOS 7 里最常见的网络问题之一。你配置的时候好好的,一重启系统,网络就没了。打开ifcfg-ens33看一眼,八成是ONBOOT=no。这种低级失误,其实很多人犯过,因为系统默认模板有时候会把 ONBOOT 设置成 no,或者某些定制镜像会自动改掉。
解决办法就是把ONBOOT=yes写得明明白白,然后重载配置。
另一个导致开机网卡不启动的原因是 NetworkManager 服务被禁用。有些人习惯把 NetworkManager 停掉,改用 network 服务,但如果停得不彻底,反而会出现启动时没有服务去拉起网卡。检查服务状态:
systemctl status NetworkManager systemctl is-enabled NetworkManager正常情况下 NetworkManager 应该是 enabled 状态。如果被禁用了,执行:
systemctl enable NetworkManager systemctl start NetworkManager4.2 虚拟机克隆后网卡起不来:UUID 和 MAC 冲突
用虚拟机做实验的同学,肯定遇到过这种情况:克隆了一个虚拟机,开机后网络接口起不来,报错信息类似Device ens33 not found或者connection activation failed。
原因在于克隆会生成新的 MAC 地址,但 ifcfg 文件里的 UUID 和 MAC 地址绑定信息还是旧的。解决办法有两条:
一是直接编辑 ifcfg 文件,注释或删除MACADDR相关的行,并生成一个新的 UUID(用uuidgen命令生成后填进去)。二是干脆把 ifcfg 文件删掉,用 nmcli 重新创建连接:
nmcli connection delete ens33 nmcli connection add type ethernet con-name ens33 ifname ens33 nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns "223.5.5.5 114.114.114.114" nmcli connection up ens33这种方式比手改文件更靠谱,因为你把之前可能存在的隐藏配置问题全部清掉了,重新生成一套干净配置。
4.3 能 ping 通 IP 但上不了网:DNS 和路由的排查顺序
这个故障现象特别典型:你能ping 223.5.5.5,但ping www.baidu.com提示未知主机。这就是 DNS 解析问题。检查/etc/resolv.conf:
cat /etc/resolv.conf如果里面的 nameserver 是空的,或者指向了一个不通的地址,那就是 DNS 没配好。在 ifcfg 文件里加上 DNS1,然后重载,或者临时改/etc/resolv.conf测试:
echo "nameserver 223.5.5.5" > /etc/resolv.conf还有一个情况:你可以 ping 通网关,但 ping 不通 223.5.5.5,那就说明默认路由缺失或错误。用ip route show查看,正常情况下应有一行default via 网关地址 dev 网卡名。如果只有这一行说明路由没问题,没有这一行的话就需要检查 GATEWAY 配置是否被正确读取。
注意:如果你改完网卡配置发现所有网络都断了,先不要慌着重启网络服务,很有可能是 GATEWAY 写错或者 DNS 指向了一个不可达的地址。这种时候,直接登录物理控制台改配置恢复是最快的。
4.4 多个网卡导致的路由冲突
有双网卡的机器,特别是既配了内网网卡又配了外网网卡,容易出现路由冲突。比如内网网卡设置了 GATEWAY,外网网卡也设置了 GATEWAY,系统可能不知道默认路由走哪边,导致外网时通时不通。
解决办法是指定默认路由走外网网卡,在对应的 ifcfg 文件里设置:
DEFROUTE=yes同时在内网网卡的 ifcfg 文件里设置:
DEFROUTE=no然后重载网络。这才能在多网卡环境下保持默认路由的确定性。
5. 进阶指南:用 nmcli 让配置更高效
5.1 nmcli 快速配置网络的全流程
很多时候命令行直接敲比改文件更省事。比如想给网卡 ens33 配一个静态地址、网关和 DNS,我可以一口气用 nmcli 完成:
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 223.5.5.5 nmcli connection up ens33注意ipv4.method manual表示静态配置,如果你要改回 DHCP,可以用ipv4.method auto。我用 nmcli 写过无数次网络配置,它最大的好处是不会像手改文件那样漏掉字段。nmcli 会自动处理好配置与网络服务之间的同步,改完后直接up就能生效。
nmcli 有一点需要记住:connection modify修改的是持久化配置,重载后依然保留。不要担心它只是临时改一下。
5.2 顺手巩固几个 network 相关的 systemctl 操作
除了 NetworkManager,network服务也值得掌握。这两个服务可以并存,但建议你不要同时用两种工具去管理同一个连接。我个人的习惯是:生产环境用 NetworkManager + nmcli,因为维护方便;一些特殊的实验环境或者精简场景,用 network 服务手动管理。
查看网络服务状态:
systemctl status network启动和停止:
systemctl start network systemctl stop network5.3 完全手动配置的场景与做法
如果你拿到一个彻底没有任何网络工具的容器或者极简系统,可能连nmcli都不存在。这时候就需要完全依靠 ifcfg 文件和ip命令。
手动方式分两层:第一层是临时生效,直接用ip addr add添加 IP,ip route add default via加网关,这种方式重启即失效,仅用来临时调试。第二层才是正路,写 ifcfg 文件,然后重启网络服务。
这种极简场景下,ifcfg 文件内容就是前面讲过的那些字段。唯一要注意的是,极简系统一般不会装 NetworkManager,所以systemctl restart network是主要的生效手段。
6. 实战总结:配置过程的踩坑记录
我把这些年配置 CentOS 7 网络时踩过的坑做成了一个速查表,整理如下。它不止能帮你排查,也能当作配置前的检查清单用。
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 重启后无法上网 | ONBOOT=no 或者 NetworkManager 未启用 | 修改 ONBOOT=yes,systemctl enable NetworkManager |
| 克隆虚拟机后网卡消失 | UUID 或 MAC 绑定冲突 | 删除原连接,用 nmcli 重新创建 |
| 能 ping 通网关但上不了外网 | DNS 配置缺失错误 | 在 ifcfg 中配置 DNS1/DNS2,重载网络 |
| 能 ping 通外网 IP 但域名解析失败 | resolv.conf 被清空或指向错误 nameserver | 检查 DNS 配置,临时写入 nameserver 测试 |
| 配置静态 IP 后网络全断 | GATEWAY 写错或掩码不对 | 在物理控制台修改,确认网关与 IP 同网段 |
| 系统提示设备未托管 | NetworkManager 与 network 服务冲突 | 统一使用 NetworkManager 或 network 之一管理网卡 |
| 多网卡时外网不通 | 默认路由指向了内网网卡 | 将外网网卡 DEFROUTE=yes,内网 DEFROUTE=no |
这张表基本覆盖了个人电脑、虚拟机、物理服务器三种环境下最常见的网络配置问题。
7. 我个人在长期操作中沉淀的三个体会
最后说几点不太容易从文档里学到的经验。
第一,nmcli connection modify改的是连接的持久化配置,它确实很方便,但改完之后一定要记得执行nmcli connection up 连接名。很多人只执行 modify,忘了 up,然后来问我为什么没生效。配置文件更新和网络激活之间,还有一个必须手动触发的步骤。
第二,ifcfg 文件里的UUID字段不要小看。同一个系统如果存在重复 UUID,哪怕设备名不同,NetworkManager 也可能把连接状态搞乱。如果你复制了一份 ifcfg 文件来给第二个网卡用,记得删掉 UUID 或者重新生成一个。
第三,改网络配置有风险,尤其是远程维护机器时。强烈建议你在执行网络重启之前,先把防火墙规则放行 SSH 端口,或者确保自己可以通过物理控制台访问机器。我接过不止一次因为远程重启网络把自己关在门外的求助,那种感觉,经历过的人都知道有多痛苦。
配置 CentOS 7 的网络说到底不是一个高门槛的事情,它更考验的是对 Linux 下网络管理结构的理解和对细节的把握。把这篇文章里的内容吸收好,以后在无数台 CentOS 7 上配置网络你都会有底气。