服务器联网这件事,拆开其实只有五个要素:网卡、IP 与掩码、网关、DNS、主机名。每个概念都按费曼方式讲——把入网比作「让一台机器在小区里安家落户」:网卡是房子、IP 是门牌号、网关是小区大门、DNS 是查号台、主机名是户主名;再用「删掉它会怎样」反证每一件为什么缺一不可。理解了这张图,再看 ip / nmcli / dig / ss 才知道每条命令在解决什么问题。改网络最容易把自己踢下线,操作前先读安全须知。
想象服务器是一户人家:① 网卡是小区里那套房子本身(物理上插着网线的位置,还没有门牌);② IP 地址和掩码是门牌号加上小区边界——「192.168.1.10,在 192.168.1.x 这个小区里」;③ 网关是小区大门,寄往边界之外的包裹一律先交给它;④ DNS是查号台,你只记得住「百度」,记不住它的门牌号,查号台负责把名字翻译成门牌;⑤ 主机名是户主名,方便别人称呼你这台机器。
配网络 = 让机器:有房子 → 有门牌 → 认得大门 → 记住查号台电话 → 报上户主名。五步缺一步,都会以「连不上」的形式表现出来。
后面所有命令,都只是在这五步的某一步上「看一眼」或「改一笔」。先看图,再对表,最后进案例室。
这五个比喻不是修辞,每一条都对应系统里真实的文件和参数。下表把「生活比喻 → Linux 真实概念 → 怎么亲眼看到它」对齐:
| 要素 | 生活比喻 | Linux 里对应的真实概念 | 怎么亲眼看到它 |
|---|---|---|---|
| ① 网卡 | 小区里的房子 | 物理/虚拟网络接口 ens33,设备信息在 /sys/class/net/ens33/ | ip link show;ls /sys/class/net/ |
| ② IP/掩码 | 门牌号 + 小区边界 | 接口上的 IPv4 地址与前缀长度;/24 即掩码 255.255.255.0 | ip addr show ens33 的 inet 行 |
| ③ 网关 | 小区大门 | 内核路由表中的默认路由(default via …) | ip route;ip route get 8.8.8.8 看一个包会走哪 |
| ④ DNS | 查号台 | /etc/resolv.conf 的 nameserver 行;优先查 /etc/hosts(顺序由 /etc/nsswitch.conf 决定) | cat /etc/resolv.conf;dig baidu.com 看谁在回答 |
| ⑤ 主机名 | 户主名 | 内核主机名,持久化在 /etc/hostname | hostname;hostnamectl status |
下面五张概念卡,每个概念按同一顺序讲:说人话(不用术语的一句话)→ 打个比方 → 为什么有这件(删掉它出什么事)→ 术语对照。
说人话机器上插网线的那个口,在 Linux 里也是个「文件」——/sys/class/net/ 下每个目录就是一块网卡。
打个比方小区里那套房子。房子还没上户口(没配 IP)之前,快递员根本不知道往哪送。
为什么有这件没有网卡,机器就是孤岛。命名规则:虚拟机里常见 ens33(PCI 热插拔槽位命名),老教材的 eth0 是旧命名法。
术语对照:接口(interface)、链路层(link);ip link 只看链路层状态,ip addr 连地址一起看。
说人话门牌号 + 小区范围。192.168.1.10/24 的意思是:我在 192.168.1.x 小区,编号 10。
打个比方掩码就是小区围墙:/24 围出 254 户邻居,墙内串门直接喊,墙外寄包裹走大门。
为什么有这件没有掩码,机器不知道对方是不是邻居——把外网地址也当本地喊话,永远等不到回应;把邻居当外网寄包裹,白绕大门一圈。
术语对照:PREFIX=24 与 NETMASK=255.255.255.0 是同一件事的两种写法;CIDR 记法即 /24。
说人话「不是本小区的包裹,统一交给 192.168.1.1 代发」——这就是默认网关。
打个比方小区大门。全小区只此一个对外出口,路由表就是保安的派件规则手册。
为什么有这件没有网关,机器永远只能访问同小区的邻居,外网一概不通——这正是「ping 网关通、ping 外网不通」的病因。
术语对照:默认路由 default route;ip route 的第一行就是它;一个网卡配多个网关会冲突,只认一个。
说人话你只记得住 baidu.com,机器只认得 IP——DNS 负责「报名字,报回门牌号」。
打个比方查号台 114。查号台电话没存(resolv.conf 没配 nameserver),名字问不出口,只能背门牌号。
为什么有这件没有它,浏览器、yum install、git clone 全部报「无法解析域名」——即使网关和 IP 都是对的。
术语对照:nameserver / 解析器 resolver;本机通讯录 /etc/hosts 优先级高于 DNS(见 0.2 案例 3)。
说人话机器的名字。装系统时随手起的 localhost,等你有 50 台机器时就是灾难。
打个比方户主名。快递单可以只写门牌号,但物业公告栏总得写「张三收」才好找。
为什么有这件没有它,日志里分不清谁是谁、集群节点互访靠 IP 背书、邮件服务器直接被拒收。
术语对照:hostnamectl set-hostname 一步到位(改内核 + 写 /etc/hostname);老的 hostname 临时名 重启即失效。
说人话门牌号可以自己定(静态),也可以每次找房管处领(DHCP)。
打个比方租房(DHCP):省心但合同到期可能换房;买房(静态):写进文件,开机就在。
为什么有这件服务器用 DHCP 是隐患:租约一到期 IP 一换,所有客户端全部失联。所以服务器几乎都配静态。
术语对照:BOOTPROTO=dhcp|static|none;nmcli 里对应 ipv4.method auto|manual。
概念看三遍不如现象见一遍。下面 10 个现象都能在虚拟机里亲手做出来,每个现象背后都是图 1 五要素中的一件在起作用。
门牌和大门都好,坏在大门之外。网关回应说明本机配置的 IP/掩码没毛病;到不了外网,问题在网关的上联线路或路由器本身——你的机器无能为力。
这是最经典的 DNS 故障。网络本身完全正常(IP 都通),坏的是「查号台」:resolv.conf 没有 nameserver,或 DNS 服务器不可达。
本机通讯录优先于查号台。名字解析先查 /etc/hosts(顺序由 /etc/nsswitch.conf 的 hosts: files dns 决定),查不到才去问 DNS。内网服务、临时测试的最快手段。
这个文件不是你的,是 NetworkManager 的。NM 会按连接配置里的 ipv4.dns 重新生成它。想改 DNS 要走正规入口(nmcli con mod ens33 ipv4.dns …),详见 0.3。
ONBOOT=no / autoconnect 关了。开机时 NM 不激活这条连接,自然没 IP。nmcli con mod ens33 connection.autoconnect yes 一劳永逸。
环回地址:自己找自己。lo 接口不走物理网卡,包在自己内存里转一圈就回来。测试本机服务(如 Web 是否在听)先用它,与网线无关。
租约到期,房管处收回重租。DHCP 分配的 IP 有租期,服务器 IP 漂移会让所有客户端失联——所以服务器要 ipv4.method manual 改静态。
IPv6 地址,别慌也别删。现代系统默认双栈(v4 + v6)。做实验嫌它碍事,加 -4 只看 IPv4 即可,不需要去「关掉 IPv6」。
IP 冲突。两个相同的门牌号,快递随机送错门,表现就是「一会儿通一会儿断」。arping -D(duplicate detect)在正式启用 IP 前探测地址是否已被占用。
很多服务器禁 ICMP 防扫描。ping 被拒不代表 HTTP/SSH 不通——判断「服务活没活」要用对应协议测(curl / ss -tlnp 看本机监听),ping 只证明「网络层可达」。
# 1) 在「本机通讯录」加一条假记录(名字随便起,全网不存在)
echo "1.2.3.4 test.local" >> /etc/hosts
# 2) 解析这个名字——它不在任何 DNS 服务器上
ping -c 1 test.local
# PING test.local (1.2.3.4) 56(84) bytes of data.
# └─ 命中的是 /etc/hosts,根本没问 DNS
# 3) 能不能 ping 通不重要,重要的是「名字 → IP」这一步生效了。
# 内网服务、测试环境的 host 绑定,都是这么干的。
# 4) 用完删掉,别给自己埋坑
sed -i '/test.local/d' /etc/hosts教材同时讲了「改配置文件」和「nmcli 命令」两条路,学生最容易糊涂:到底听谁的?答案是——两条路通往同一个人。看图:
把 NetworkManager 想象成物业管家:你说「给我家配门牌 192.168.1.10、查号台存 8.8.8.8」(nmcli 或 ifcfg 文件),管家去办,办完在门上贴一张便签(/etc/resolv.conf)。你直接跑去改便签,管家下次路过(重启、重连、换网络)就按自己的账本重新贴一张——便签是输出,不是输入。所以「手改 resolv.conf 一重启就丢」不是玄学,是体系设计的必然。
判断口诀:想改的东西由 NetworkManager 生成(resolv.conf、路由),就必须从入口改;想改的东西不属于它(比如 /etc/hosts),随便改。
| 手改 ifcfg 文件 | nmcli 命令 | nmtui 菜单 | |
|---|---|---|---|
| 适合谁 | 习惯读文件、写脚本批量部署 | 远程运维、自动化脚本(推荐) | 初学者、临时改一次 |
| 生效方式 | nmcli con reload + con up | nmcli con up 立即生效 | 菜单里保存即生效 |
| 风险 | 字段拼错不易发现;忘 reload 改了像没改 | 参数名长,但报错明确 | 功能面窄,复杂参数配不了 |
| 本课要求 | ☆ 理解六字段含义 | ★ 必会完整流程 | ○ 会打开会用 |
学完五要素,把它们串成一条链:你在浏览器输入一个网址,到看见页面,五件套依次登场。
故障只会断在五环之一。「ping 网关通、域名不通」直接锁定第 ④ 环,不用翻配置文件大海捞针。
IP 从静态换成 DHCP(第 ② 环),其余四环一概不动。分层让每次改动的影响面最小化。
每一环都有自己的「单测」命令:ip link / ip addr / ip route / dig / hostname——逐环打勾,配错无从遁形。
先记住这张表,后面每条命令的细节再按需展开。注意顺序:永远先「看」,再动手。
| 我要解决的问题 | 第一步看 | 动手命令 | 对应小节 |
|---|---|---|---|
| 刚拿到一台服务器,先摸清网络现状 | ip addr + ip route | hostnamectl 顺手看主机名 | 6.1 |
| 把 DHCP 改成静态 IP | nmcli con show 确认连接名 | nmcli con mod … ipv4.method manual | 6.2.2 |
| 想手改配置文件 | 先确认 RHEL 版本(7/8 用 ifcfg,9 用 keyfile) | 编辑 ifcfg 后 nmcli con reload | 6.2.1 |
| 测某台机器通不通 | ping -c4 目标 | 不通再看 ip route get 目标 | 6.3.1 |
| 域名解析对不对、是谁答的 | dig baidu.com | dig @8.8.8.8 … 换查号台对比 | 6.3.2 |
| 服务起了但别人连不上 | ss -tlnp 看是否在听 | 再查防火墙 firewall-cmd --list-all | 6.1.3 |
| 网络时通时断 | arping -D 查 IP 冲突 | 换 IP 或找出另一台机器 | 6.4 |
| 新装机器要起名 | —— | hostnamectl set-hostname server | 6.2.4 |
ip addr 记下当前 IP 和网卡名——失联后第一个动作就是改回去。nmcli 改,改完 con up 试连;万一失联,从控制台把旧 IP 改回来。ifcfg 文件手改后必须 nmcli con reload,否则「改了像没改」,还会误判成 NM 抽风。ip addr show ens33
# 2: ens33: mtu 1500 ...
# └─ UP = 网卡已启用;没有 UP 就是没有「通电」,配什么都白搭
# inet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute ens33
# └─ 这台机器的门牌号 192.168.1.10,小区范围 /24(掩码 255.255.255.0)
# inet6 fe80::20c:29ff:fe8a:1234/64 scope link
# └─ IPv6 链路本地地址,做实验用 -4 隐藏它
# valid_lft forever preferred_lft forever
# └─ 永久有效(static);若显示一串秒数,说明这是 DHCP 租来的 查看 / 配置网卡、地址、路由(取代老 ifconfig)。新系统可能没装 ifconfig,ip 永远在。
ip addr 所有网卡 + IPip -br addr 简表(一网卡一行)ip -4 addr show ens33 只看 IPv4ip link set ens33 up 启用网卡ip route get 8.8.8.8 这个包会走哪ip addr | grep inet 快速抓地址行ip -br link 只看网卡状态ip route
# default via 192.168.1.1 dev ens33 proto static metric 100
# └─ 默认路由:boundary 之外的包裹全交给 192.168.1.1(网关)
# 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.10
# └─ 本小区直连规则:去 192.168.1.x 不用出大门,直接喊
ip route get 223.5.5.5
# 223.5.5.5 via 192.168.1.1 dev ens33 src 192.168.1.10
# └─ 单包问路:去这个地址会从哪张卡、经哪个网关走——排障神器查看端口监听与连接(取代 netstat)。网络通了但「服务连不上」,第一件事就是看它。
-t TCP · -u UDP-l 只看监听(LISTEN)-n 端口显示数字(不翻译成 http 等名字)-p 显示是哪个进程在听ss -tlnp 本机所有 TCP 监听 + 进程(排障必用)ss -tlnp | grep :80 确认 Web 在听ss -ant state established 看活动连接数ss -tlnp | grep :22
# LISTEN 0 128 0.0.0.0:22 users:(("sshd",pid=1024,...))
# └─ 监听 0.0.0.0:22 = 所有网卡上的 22 端口都接受 SSH 连接
# └─ 若显示 127.0.0.1:22 = 只有本机能连,外来的全拒绝hostname # 看当前主机名(临时变量,重启读文件)
hostnamectl status # 静态/临时/漂亮三个名字一起看
sudo hostnamectl set-hostname server.example.com
# └─ 一步到位:改内核当前值 + 写 /etc/hostname(重启仍在)
# 重新登录 shell,提示符即变成新名字RHEL 7/8 的网卡配置在 /etc/sysconfig/network-scripts/ifcfg-ens33。文件不长,但每个字段都可能让机器失联,逐个看:
| 字段 | 含义 | 常见值 | 漏写/写错会怎样 |
|---|---|---|---|
TYPE | 接口类型 | Ethernet | 一般默认即有,不用动 |
BOOTPROTO | 门牌号谁发 | dhcp / static / none | 写 static 却没给 IPADDR,开机无 IP |
NAME / DEVICE | 连接名 / 设备名 | ens33 | DEVICE 写错 = 这份配置谁也不认领 |
ONBOOT | 开机是否激活 | yes | no = 案例 05:开机永远没网 |
IPADDR + PREFIX | 门牌号 + 小区边界 | 192.168.1.10 + 24 | PREFIX 写成 NETMASK 格式(或反之)不报错但不生效 |
GATEWAY | 小区大门 | 192.168.1.1 | 多个 ifcfg 都写 GATEWAY 会互相覆盖,只留一个 |
DNS1 / DNS2 | 查号台电话 | 8.8.8.8 | 漏写 = 能 ping IP 打不开网页(案例 02) |
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.1.10
PREFIX=24
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=114.114.114.114# 第 1 步:看清楚设备名与连接名(两者可能不一样!)
nmcli device status
# DEVICE TYPE STATE CONNECTION
# ens33 ethernet connected ens33 ← CONNECTION 列才是下一步操作的对象
nmcli con show ← 连接配置列表
# 第 2 步:改配置(改的是「连接」,不是「设备」)
nmcli con mod ens33 \
ipv4.method manual \ # static 对应 manual;dhcp 对应 auto
ipv4.addresses 192.168.1.10/24 \ # 门牌号 + 小区边界,一条写完
ipv4.gateway 192.168.1.1 \ # 小区大门
ipv4.dns "8.8.8.8 114.114.114.114" \ # 多个 DNS 用引号包住,空格分隔
connection.autoconnect yes # 相当于 ONBOOT=yes
# 第 3 步:应用(重新激活连接,断开当前 TCP 也要做)
nmcli con up ens33
# 第 4 步:验证(图 1 逐环打勾)
ip -4 addr show ens33 # ② 门牌对不对
ip route | grep default # ③ 大门对不对
cat /etc/resolv.conf # ④ 查号台写进去没有
ping -c 2 192.168.1.1 # 终测:网关通不通NetworkManager 的命令行入口。语法是「对象 + 动作」:con show / con mod / con up / dev status。
nmcli device status 设备一览nmcli con show 连接列表nmcli con show ens33 单连接全部参数con mod 名字 参数 值 改配置ipv4.method auto|manual DHCP/静态con add type ethernet ifname ens33 con-name ens33 新建con up 名字 应用并激活nmtui
# ↑↓ 移动光标,回车进入:
# Edit a connection → 选 ens33 → IPv4 CONFIGURATION 改 Manual
# → Show 填 Addresses / Gateway / DNS servers
# → [x] Automatically connect → OK → Back → Quit
# 改完菜单里 Activate a connection 重新激活(相当于 con up)sudo hostnamectl set-hostname server
# └─ 同时改内核当前值与 /etc/hostname,重启不丢
# 退出重连 shell,提示符 [root@server ~]# 即见新名字
# 老方法 hostname 临时名 只对当前会话生效,重启失效——少用ping -c 4 192.168.1.1
# PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
# └─ 发 56 字节数据,加上 IP/ICMP 头共 84 字节
# 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.453 ms
# └─第几个包 └─存活跳数 └─往返耗时
# time 局域网应 <1ms,跨网几十 ms;丢包看最后的统计行
# --- 192.168.1.1 ping statistics ---
# 4 packets transmitted, 4 received, 0% packet loss, time 3005ms
# └─ 丢包率才是「通不通」的关键指标测网络层可达性。不加参数会一直 ping,脚本里必须带 -c。
-c 4 只发 4 个包(必养成的习惯)-W 2 等回应最多 2 秒-i 0.2 缩短发包间隔(需 root)time 往返延迟ttl=64 每过一个路由器减 1,可粗判对方系统100% packet loss 全丢 = 不通(或被禁 ping)dig baidu.com
;; QUESTION SECTION ← 你问的问题
;baidu.com. IN A ← 问:baidu.com 的 IPv4(A)记录?
;; ANSWER SECTION ← 查号台给的答案
baidu.com. 600 IN A 110.242.68.66
└─600 秒内可以缓存(TTL)
;; Query time: 12 msec ← 这次解析花了多久
;; SERVER: 8.8.8.8#53(8.8.8.8) ← 这次是谁回答的(重要!)向 DNS 服务器查询域名。dig 输出全、可指定服务器;nslookup 简单直观。
dig baidu.com 查 A 记录全流程dig baidu.com +short 只要 IPdig @223.5.5.5 baidu.com 指定查号台dig -x 8.8.8.8 反向解析(IP→名)dig baidu.com MX 查邮件记录nslookup baidu.com 交互式简版dig @223.5.5.5 baidu.com +short 与 dig @8.8.8.8 baidu.com +short 各跑一次——同一个名字不同查号台可能给出不同答案(CDN 就是这样工作的)。理解「解析答案取决于问谁」,后面项目9 学 DNS 服务时就会轻松很多。traceroute 223.5.5.5
# 1 192.168.1.1 (192.168.1.1) 0.5 ms ← 第一跳永远是网关(大门)
# 2 100.64.0.1 3.2 ms ← 运营商接入网
# 3 * * * … ← 某路由器不回应,不代表断
# … ← 每行一跳,ttl 逐跳加一| 现象 | 定位命令 | 原因与处理 |
|---|---|---|
| 改了 ifcfg 文件,网络毫无变化 | nmcli con show | NetworkManager 没重读文件。执行 nmcli con reload && nmcli con up ens33。以后手改文件必跟这两条。 |
| 能 ping 通 IP,域名全解析不了 | cat /etc/resolv.conf | DNS 没配或被覆盖。用入口改:nmcli con mod ens33 ipv4.dns 8.8.8.8 后 con up(见 0.3 图 2)。 |
| ping 网关都不通 | ip addr → ip link | 先看有没有 UP 和 inet:没 UP → ip link set ens33 up;没 IP → 配置没生效;都有 → 查网线/VMware 网络模式(NAT/桥接)。 |
nmcli 报 NetworkManager is not running | systemctl status NetworkManager | 总管没上班。systemctl enable --now NetworkManager 启动并设开机自启。 |
| 改 nmcli 时 SSH 突然断开 | 控制台登录 → ip addr | 大概率改了 IP/网关导致路由变化。从虚拟机/云控制台登录,nmcli con mod 改回原 IP 再 con up。预防见 0.6。 |
| DHCP 拿到 169.254.x.x | ip -4 addr | 169.254 开头是「自动私有地址」:房管处(DHCP 服务器)联系不上。查 DHCP 服务、网线、VMware 网络服务。 |
ip addr 有门牌吗 → ip route 有大门吗 → ping 网关大门活吗 → ping 223.5.5.5外部通吗 → dig baidu.com查号台通吗 → ss -tlnp服务在听吗。六问答完,问题必被锁定在某环。ip addr 看清本机 IP 与网卡名;用 ip route 找出默认网关;再对比 ip -br addr 的简表输出。ping -c4 网关 → ping -c4 223.5.5.5 → dig baidu.com → ss -tlnp,每一测写一句「它在验证图 1 的哪一要素」。nmcli 把网卡临时改成静态 IP 192.168.1.20/24 并 con up 生效(练完改回 DHCP:把 ipv4.method 改回 auto 再 con up)。全程截图记录四步。t.local 绑一个地址,用 ping -c1 t.local 验证解析命中 hosts,随后删除记录。思考:什么场景该用 hosts、什么场景必须用 DNS?dig @223.5.5.5 baidu.com +short 和 dig @8.8.8.8 baidu.com +short,记录两者答案是否一致,并用一句解释「为什么可能不同」。ipv4.gateway 改成错误地址并 con up,观察「四测」哪几测挂掉、哪几测还活着,然后用正确网关恢复。网络配置错一点就『连不上』;改前先拍快照,且确认有控制台(vSphere/虚拟机窗口)能兜底登录。