Linux IP 地址与网络配置完全指南:iproute2、Netplan、ifcfg、systemd-networkd、DNS、静态路由全方法 + 排障
Linux 配 IP 至少有 6 种方法,每个发行版默认工具还不一样——CentOS 上你改 ifcfg-eth0 到 Ubuntu 24.04 上压根就没这目录;有 NetworkManager 用 nmcli;没桌面的服务器经常跑 systemd-networkd;老工程师还会跟你说「别 ifconfig 了,用 ip addr」。本文把常见发行版、常见配置后端、临时/永久、IPv4/IPv6、DNS 解析、默认网关、多条静态路由、Bond/VLAN 统统对应起来写,每种方法都给完整可复制的文件模板和验证命令,最后一张「发行版→配置方法」对照表、加上 12 条高频坑的排障决策树,看完以后你在任何一台陌生 Linux 上 ssh 进去都能知道「到底该改哪个文件」。
Linux IP 地址与网络配置完全指南
一. 6 种方案一张表:新机器先挑对工具
一句话:先看你的发行版用的是哪套「网络管理后端」,再选对命令/文件,别在 Ubuntu Server 上
nmcli connection show找不到任何连接就骂娘,人家默认跑的是 systemd-networkd。
| 方案 / 工具 | 配置落在哪 | 常见发行版 | 临时/永久 | 推荐度 |
|---|---|---|---|---|
iproute2(ip 命令) | 内存(重启丢) | 所有现代 Linux(Busybox 也自带) | ✅ 临时 | ⭐⭐⭐⭐⭐ 必会基础 |
| NetworkManager(nmcli / nmtui) | /etc/NetworkManager/system-connections/*.nmconnection | RHEL/CentOS 桌面、Fedora、Ubuntu Desktop、Rocky/Alma 桌面版 | 永久 | ⭐⭐⭐⭐⭐ 桌面/工作站首选 |
| Netplan | /etc/netplan/*.yaml → render 给 NetworkManager 或 networkd | Ubuntu 18.04 ~ 24.04 全部、Pop!_OS | 永久 | ⭐⭐⭐⭐ Ubuntu 必用 |
| systemd-networkd | /etc/systemd/network/*.network | Ubuntu Server、无 NM 的 Debian/RHEL、容器化 OS | 永久 | ⭐⭐⭐⭐ 纯系统化服务器 |
| ifcfg-*(红帽老派) | /etc/sysconfig/network-scripts/ifcfg-<IF> + /etc/sysconfig/network-scripts/route-<IF> | RHEL 7/CentOS 7、RHEL 8 兼容、Alma/Rocky 8 兼容 | 永久 | ⭐⭐ 老环境兼容(RHEL9+ 已移到 NM keyfile) |
| /etc/network/interfaces | 就这个文件本身 | Debian 9 以前、Ubuntu 16.04 以前 | 永久 | ⭐ 古董,只在老系统里见 |
新机器 5 秒定方案的决策流程
# ① 先看 NetworkManager 有没有起来
systemctl is-active NetworkManager
# active → 用 nmcli(或 nmtui)
# ② 再看 systemd-networkd
systemctl is-active systemd-networkd
# active → 用 *.network 文件,或者如果是 Ubuntu 直接看 /etc/netplan/
# ③ Ubuntu 上
ls /etc/netplan/*.yaml # 有文件 → Netplan 模式,renderer 定后端
# ④ CentOS/RHEL 7 老机器
ls /etc/sysconfig/network-scripts/ifcfg-* # 有 → 走 ifcfg-*
# ⑤ 啥都没有 → 临时 ip 命令先救命,按生产要求再部署二. 基础概念扫盲
网卡名(接口名)到底怎么来的
现在主流发行版不再是 eth0/eth1 这种顺序命名,物理网卡用 systemd 可预测网络接口名规则(前缀 en/wl/ww),而虚拟/逻辑接口名由内核或管理员命名:
| 前缀 | 含义 | 示例 |
|---|---|---|
en | Ethernet 有线网卡(可预测命名) | ens33(PCI-E 槽位)、eno1(板载 1 号口)、enp0s3(PCI 总线 0/槽 3) |
wl | WLAN 无线(可预测命名) | wlp2s0 |
ww | WWAN 4G/5G 移动网络(可预测命名) | wwp0s20u2i3 |
bond | 绑定(逻辑接口,管理员创建) | bond0 |
br | 网桥(逻辑接口,管理员创建) | br0 |
vlan | VLAN 子接口(逻辑接口,两种写法都行) | eth0.10、vlan10 |
先查网卡名,后面所有命令里 <IF> 就是这个:
ip link show
# 1: lo: <LOOPBACK,UP,LOWER_UP> ...
# 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> state UP ...
# 3: enp0s8: <BROADCAST,MULTICAST> state DOWN ...
# 更漂亮:颜色 + 详情(需要装)
nmcli device statusIP / CIDR / 广播 / 网关 的最小必须知道
192.168.1.100/24→ IP 是192.168.1.100,掩码 255.255.255.0(24 个 1)- 网段(网络地址):192.168.1.0
- 广播:192.168.1.255
- 默认网关:同一网段里能出公网的路由器 IP,通常是
.1或.254
没默认网关 = 局域网可以通,外网 ping 不通。
三. iproute2(ip 命令)—— 临时配置,所有发行版通吃
这是所有人必须会的一套。临时改,重启/重启网络服务就失效,适合临时测试、脚本里批量改网卡、或修复远程 ssh 连不上把网卡搞挂了的紧急救援。
2.1 查信息(最常用的 4 条)
# ① 看所有网卡 + 状态 + MAC
ip link show
# 简写 ip l
# ② 看所有 IP(inet IPv4 / inet6 IPv6)
ip addr show
# 简写 ip a
# 只看某个网卡
ip a show ens33
# ③ 看路由表(最关键——你连不上外网先看这个)
ip route show
# 简写 ip r
# 输出 1:default via 192.168.1.1 dev ens33 proto dhcp src 192.168.1.100 metric 100
# ↑ 这一行就是默认网关
# 输出 2:192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.100
# ↑ 直连网段路由(自动由内核生成,scope link 就是"直连,不用下一跳")
# ④ 看邻居(ARP 表,你 ping 过谁)
ip neigh show2.2 起/停网卡
# 先 DOWN,再 UP,别搞错顺序
ip link set ens33 down
ip link set ens33 up
# 注意:
# - 如果走 NetworkManager/systemd-networkd,这里 ip link 只改当时状态,
# 配置本身还在数据库里,下一次 ifup 还会被管理器覆盖
# - 远程 ssh 连接到某网卡上时,DOWN 那个网卡 = 立刻断网自己下线自己!
# 生产一定要要么写 atd 定时回滚,要么双网卡或有 console2.3 加/删 IP
# 加 IP(加主 IP/次 IP 都用这个,现代 Linux 不区分主从)
ip addr add 192.168.1.100/24 dev ens33
# IPv6
ip -6 addr add 2001:db8::100/64 dev ens33
# 删 IP
ip addr del 192.168.1.100/24 dev ens33
# 清掉此网卡所有 IP
ip addr flush dev ens33
# 老写法 ifconfig(不推荐,很多发行版已经不带 net-tools 包了)
ifconfig ens33 192.168.1.100 netmask 255.255.255.0 up2.4 加/删 静态路由 + 默认网关
# 默认网关
ip route add default via 192.168.1.1 dev ens33
# 改默认网关(先删旧的,再加新的,或者 replace 一步)
ip route replace default via 192.168.1.254 dev ens33
ip route del default via 192.168.1.1
# 去特定网段走指定下一跳
ip route add 10.10.0.0/16 via 192.168.1.2 dev ens33
# 去特定网段走"直连"(下一跳就是接口自己,L2 同网段)
ip route add 172.16.8.0/24 dev ens38
# 删静态路由
ip route del 10.10.0.0/16 via 192.168.1.2
# 查某条包会怎么选路出
ip route get 8.8.8.8
# 输出:8.8.8.8 via 192.168.1.1 dev ens33 src 192.168.1.100 uid 1000
# ↑ 告诉你走哪个网卡、用哪个源 IP,排错神器2.5 DNS 临时
# 最直给:直接写 /etc/resolv.conf
# 注意:如果你跑了 NetworkManager/systemd-resolved,重启就会被覆盖
echo 'nameserver 223.5.5.5' > /etc/resolv.conf
echo 'nameserver 119.29.29.29' >> /etc/resolv.conf
echo 'search example.local' >> /etc/resolv.conf⚠️
/etc/resolv.conf现在基本都是”被别的程序管理”的文件,ls -l /etc/resolv.conf看一下是不是一个符号链接。如果是,你手动改它,就像在别人的草稿纸上写字,人家一保存你就没了。详见第四节。
四. 六大后端 永久 配置方案
每次改完配置都要:重启网络服务 → 验证 ip a + ip r + ping。
3.1 NetworkManager:nmcli(RHEL/Fedora/Ubuntu Desktop)
nmcli connection show 先看有哪些”连接配置”。概念:连接 connection ≠ 物理网卡 device。 一台物理机一块网卡(dev ens33)可以有多个 connection(家/公司/移动),但同一时刻只能 active 一个。
① 新建一个静态 IP 连接
nmcli connection add \
type ethernet ifname ens33 con-name 公司-静态 \
ipv4.method manual \
ipv4.addresses "192.168.1.100/24" \
ipv4.gateway "192.168.1.1" \
ipv4.dns "223.5.5.5,119.29.29.29" \
ipv4.dns-search "example.local" \
connection.autoconnect yes
# 让它立即生效
nmcli connection up 公司-静态② 改已有连接(一般是装系统时默认的”Wired connection 1”)
# 连接名可能带空格,用引号
CON='Wired connection 1'
nmcli connection modify "$CON" \
ipv4.method manual \
ipv4.addresses "192.168.1.100/24" \
+ipv4.addresses "10.0.0.5/24" \
ipv4.gateway "192.168.1.1" \
ipv4.dns "223.5.5.5,119.29.29.29" \
+ipv4.dns "1.1.1.1" \
ipv4.dns-search "example.local,corp.example"
# 注:+ipv4.addresses / +ipv4.dns 的 + 表示追加(次 IP / 追加 DNS),不写 + 则覆盖原值
# 让它重新加载
nmcli connection up "$CON"DHCP 改回动态只需要 1 行:
nmcli connection modify "$CON" ipv4.method auto ipv4.addresses "" ipv4.gateway ""
nmcli connection up "$CON"③ 加静态路由
# +ipv4.routes "网段/掩码 下一跳 可选metric"
nmcli connection modify "$CON" +ipv4.routes "10.10.0.0/16 192.168.1.2 100"
nmcli connection up "$CON"④ VLAN 子接口
nmcli connection add type vlan ifname ens33.10 dev ens33 id 10 \
con-name vlan-ens33-10 \
ipv4.method manual ipv4.addresses "10.0.10.1/24"
nmcli connection up vlan-ens33-10⑤ Bond 双网卡绑定(比如主备模式)
# 先建 bond(mode=active-backup 主备)
nmcli connection add type bond ifname bond0 con-name bond0 \
bond.options "mode=active-backup,miimon=100" \
ipv4.method manual ipv4.addresses "192.168.1.100/24" \
ipv4.gateway "192.168.1.1" ipv4.dns "223.5.5.5"
# 把 ens33 ens34 加进去当 slave
nmcli connection add type bond-slave ifname ens33 master bond0
nmcli connection add type bond-slave ifname ens34 master bond0
nmcli connection up bond0⑥ nmtui:图形化 TUI
ssh 进服务器懒得记命令的时候:
nmtui
# 上下箭头选:Edit a connection → Add/Edit → IPv4 CONFIGURATION <Manual>
# 最实用的是「Set system hostname」直接改 hostname 不用记命令⑦ 验证三板斧
nmcli connection show --active
nmcli device status
nmcli -f GENERAL,IP4 connection show "$CON"3.2 Netplan(Ubuntu 18.04 ~ 24.04 必用)
Netplan 不是后端,是一个中间翻译层:你写 /etc/netplan/*.yaml,它再 renderer: 给 NetworkManager(桌面)或 systemd-networkd(服务器)。写错空格缩进 = 全挂。YAML 用 2 空格缩进,绝对不能 tab。
① 先找文件 + 看 renderer
ls /etc/netplan/*.yaml
# 常见文件名:00-installer-config.yaml / 01-netcfg.yaml / 50-cloud-init.yaml
cat /etc/netplan/01-netcfg.yaml② 静态 IP 完整模板(服务器后端 networkd)
# /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd # 桌面版这里是 NetworkManager
ethernets:
ens33:
addresses:
- 192.168.1.100/24
- "2001:db8::100/64" # 双栈 IPv6 加一条就好
routes:
- to: default
via: 192.168.1.1
metric: 100
nameservers:
search: [example.local, corp.example]
addresses: [223.5.5.5, 119.29.29.29, "2400:3200::1"]③ Ubuntu Desktop:后端是 NetworkManager(注意大小写!NetworkManager 首字母大写 N 和 M,写错直接失效)
# /etc/netplan/01-network-manager-all.yaml
# ⚠️ 注意 renderer: NetworkManager(两个大写)是 Ubuntu 桌面版唯一正确的写法
# 小写 networkmanager / Networkmanager 都会导致 netplan 忽略这段
network:
version: 2
renderer: NetworkManager之后真正调 IP 用图形界面或 nmcli 就行,Netplan 只负责把控制权交给 NM。桌面版如果你还把下面的 addresses/routes 写满 YAML,系统里两套配置同时存在,Netplan 生成的 NM 连接会和你手动 nmcli connection modify 出来的冲突。桌面版推荐就保留上面这 4 行,然后 nm-connection-editor(图形)或 nmcli(命令行)改网络。
④ DHCP 模板(服务器 networkd 后端,最简单)
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: true
dhcp6: true⑤ VLAN + Bond 双网卡(主备)模板
network:
version: 2
renderer: networkd
bonds:
bond0:
interfaces: [ens33, ens34]
parameters:
mode: active-backup
primary: ens33
mii-monitor-interval: 100
addresses: [192.168.1.100/24]
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [223.5.5.5]
vlans:
bond0.10:
id: 10
link: bond0
addresses: [10.0.10.1/24]⑥ 网桥 br0(给 KVM/docker/VM 桥接用)
network:
version: 2
renderer: networkd
bridges:
br0:
interfaces: [ens33]
addresses: [192.168.1.100/24]
routes: [{to: default, via: 192.168.1.1}]
nameservers:
addresses: [223.5.5.5, 119.29.29.29]
parameters:
stp: false
forward-delay: 0⑦ 应用配置(救命参数必须记住!)
# 1) 先检查语法(必跑!语法错直接不给你 apply)
netplan generate
# 2) 真正应用(两种模式,第一次一定要用 try,远程 ssh 不后悔)
netplan try
# 上面这条会:应用 120 秒,期间如果你没回车确认,120 秒后自动回滚
# - ssh 连不上?等 120 秒自己恢复
# - ssh 正常?按回车保存,永久
# 如果你物理机在面前(不怕断开),直接
netplan apply💡 Netplan 排坑 3 条:① 2 空格不用 tab ②
addresses是数组用- 1.2.3.4/24带 CIDR ③ 改完一定要先generate再apply/try。
3.3 systemd-networkd(纯服务器化,Ubuntu Server 默认)
有时候你要在非 Ubuntu 的机器上纯手写这套,或者不装 NM。文件存在 /etc/systemd/network/,后缀 .network,命名约定一般 20-<网卡名>.network(前两位数字决定加载顺序)。
# /etc/systemd/network/20-ens33.network
[Match]
Name=ens33
# 或者按 MAC 绑,防止虚拟机迁移网卡名跳:MACAddress=00:0c:29:xx:xx:xx
[Network]
Address=192.168.1.100/24
Address=2001:db8::100/64
Gateway=192.168.1.1
DNS=223.5.5.5
DNS=119.29.29.29
Domains=example.local corp.example
# IP 转发(如果要当路由器)
# IPForward=yes
[Route]
Destination=10.10.0.0/16
Gateway=192.168.1.2
Metric=100
[DHCPv4]
# 要 DHCP 的话这里 UseRoutes=true ClientIdentifier=mac 就行DHCP 极简版:
[Match]
Name=ens33
[Network]
DHCP=yes应用:
systemctl daemon-reload
systemctl restart systemd-networkd
# 验证
networkctl status ens33
networkctl list3.4 ifcfg-*(RHEL 7 / CentOS 7 老派风格)
文件:/etc/sysconfig/network-scripts/ifcfg-<IF>
# /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static # static=固定IP,dhcp=动态,none=不用协议
NAME=ens33
DEVICE=ens33
ONBOOT=yes # 开机是否启用!忘写 yes 开机网卡不起来!
UUID=(装系统带的就保留,不带可以不写)
IPADDR=192.168.1.100
NETMASK=255.255.255.0
PREFIX=24 # PREFIX 比 NETMASK 更好,二选一写一个就行
GATEWAY=192.168.1.1
DNS1=223.5.5.5
DNS2=119.29.29.29
DOMAIN="example.local corp.example"
# 可选
IPV6INIT=yes
IPV6ADDR=2001:db8::100/64
IPV6_DEFAULTGW=2001:db8::1静态路由 文件 /etc/sysconfig/network-scripts/route-ens33:
# 每行一条:目标网段 via 下一跳
10.10.0.0/16 via 192.168.1.2
172.16.8.0/24 via 192.168.1.3DHCP 版只要 5 行:
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=ens33
DEVICE=ens33
ONBOOT=yes应用:
# CentOS 7
systemctl restart network
# 单接口(更安全)
ifdown ens33 && ifup ens333.5 /etc/network/interfaces(Debian 默认 / Ubuntu 16.04 以前)
Debian 系(含 Debian 12)默认仍走 ifupdown + networking.service;Ubuntu 18.04 以后被 Netplan 取代。文件 /etc/network/interfaces:
# 回环
auto lo
iface lo inet loopback
# 静态 IP
auto ens33
iface ens33 inet static
address 192.168.1.100/24
gateway 192.168.1.1
dns-nameservers 223.5.5.5 119.29.29.29
dns-search example.local corp.example
# 注:dns-nameservers 需 resolvconf/openresolv 包才会写入 /etc/resolv.conf;
# 没装时被静默忽略,需手动写 /etc/resolv.conf 或用 dnsmasq 钩子
# DHCP
auto ens34
iface ens34 inet dhcp
# 静态路由
up ip route add 10.10.0.0/16 via 192.168.1.2 dev ens33
down ip route del 10.10.0.0/16 via 192.168.1.2 dev ens33
# VLAN 子接口(要先装 vlan 包 + 加载 8021q 模块)
auto ens33.10
iface ens33.10 inet static
address 10.0.10.1/24
vlan-raw-device ens33应用:
systemctl restart networking
# 或者
ifdown ens33 && ifup ens33五. DNS 解析配置(三大模式全解)
先看你现在是哪种管理方式:
ls -l /etc/resolv.conf
# 可能的 4 种情况:
# ① lrwxrwxrwx -> /run/NetworkManager/resolv.conf → 归 NM 管
# ② lrwxrwxrwx -> /run/systemd/resolve/stub-resolv.conf → 归 systemd-resolved 管(最常见)
# ③ lrwxrwxrwx -> /run/systemd/resolve/resolv.conf → 同上(直连模式)
# ④ 普通文件,root:root 644 → 你自己能直接写,或云厂商 cloud-init 管4.1 NetworkManager 管 DNS → 用 nmcli 改(前面 3.1 已写)
改完自动写到 NM 的配置里,/etc/resolv.conf 由 symlink 同步。
4.2 systemd-resolved 管 DNS → 改 /etc/systemd/resolved.conf 全局 + 按网卡分
# /etc/systemd/resolved.conf
[Resolve]
DNS=223.5.5.5 119.29.29.29
FallbackDNS=1.1.1.1 8.8.8.8 2400:3200::1
Domains=example.local
# 开启 LLMNR + mDNS(局域网 .local 主机名解析)
LLMNR=yes
MulticastDNS=yes
DNSStubListener=yes
DNSSEC=nosystemctl restart systemd-resolved
# 验证
resolvectl status
resolvectl query baidu.com
# 强制刷新缓存
resolvectl flush-caches4.3 都不管,直接手工写 /etc/resolv.conf
# 先把 symlink 去掉(如果是软链),不然还会被覆盖
unlink /etc/resolv.conf
# 然后手写永久
cat > /etc/resolv.conf << 'EOF'
# 解析器
nameserver 223.5.5.5
nameserver 119.29.29.29
nameserver 1.1.1.1
# 主机名补全(ping db → 会先试 db.example.local)
search example.local corp.example
# 最多并发发 2 个解析请求,超时 3s,轮询 2 次
options timeout:2 attempts:2 rotate
EOF
chmod 644 /etc/resolv.conf
chattr +i /etc/resolv.conf # !防被别的服务偷偷覆盖(可选)
# 想改回再 chattr -i4.4 hosts 文件 / hostname
# 临时加一条映射
echo "10.0.0.254 ceph-osd1 ceph-osd1.example.local" >> /etc/hosts
# 临时改 hostname
hostname prod-web-01
# 永久改 hostname(所有 systemd 版本通用)
hostnamectl set-hostname prod-web-01
# 注:systemd ≥249 也可用属性式写法 hostnamectl hostname prod-web-01
# 或 Debian 系 /etc/hostname 单独一行
# 或 RHEL 系 /etc/sysconfig/network 里 HOSTNAME=xxx(老)六. 验证 + 排障
5.1 每次改完都跑这 7 步
# ① 网卡起来没,状态是不是 UNKNOWN 还是 UP
ip link show ens33 | head -1
# 正常应该带 <BROADCAST,MULTICAST,UP,LOWER_UP> 以及 state UP
# ② IP 上对了吗?scope global 的那个就是外网能通你的那个
ip -4 -br addr show ens33
# ens33 UP 192.168.1.100/24
# ③ 默认网关在不在?
ip route | grep default
# 没有 default 行 → 内网通、外网全不通,直接回去重写网关
# ④ DNS 能不能解析?
getent hosts baidu.com # 最标准(走 nsswitch 的 hosts 顺序)
nslookup baidu.com # 强制走 DNS(不读 /etc/hosts)
dig baidu.com +short # 更详细
# ⑤ 通不通网关?
ping -c 3 192.168.1.1
# 网关都 ping 不通 → 网线/WiFi/VMware 网卡模式/VLAN 先物理排查
# ⑥ 通不通外网 IP
ping -c 3 8.8.8.8
# ping 8.8.8.8 通但 ping baidu.com 不通 → 100% DNS 问题
# ⑦ 路由选路正确性
ip route get 1.1.1.15.2 12 个高频坑排障决策树
| 现象 | 先查什么 | 典型根因 |
|---|---|---|
网线插上但 state DOWN | ip link show + dmesg | grep eth|ens + 换线 | 物理链路/模块不支持/光模块单通/VM 没 Attach NIC |
ip a 有 IP 但 ping 不通网关 | ip r 看直连路由 + ip neigh 看 ARP + 同网段另一台 ping 你 | 子网掩码写错(比如 /32)、VLAN tag 错、交换机端口 PVID 错 |
| 网关通但 ping 8.8.8.8 不通 | ip route get 8.8.8.8 + traceroute -n 8.8.8.8 | 默认网关没写 / 防火墙 FORWARD 把你丢了 / 没 SNAT |
| ping 8.8.8.8 通 ping baidu.com 不通 | cat /etc/resolv.conf + dig + nslookup | DNS 没写对 / UDP 53 被防火墙拦 / systemd-resolved stub listener 挂了 |
| 重启后 IP 又变 DHCP 的了 | grep ONBOOT /etc/sysconfig/network-scripts/* 或 Netplan renderer / NM autoconnect | 配置文件落了但没写入对应后端(比如你改了 ifcfg- 实际机器跑的是 NM) |
| 改完 nmcli/networkctl 感觉”没生效” | ip a 再对比配置里写的 | 你改的那个 connection 没 connection up / .network 文件没 restart systemd-networkd |
| ssh 远程改完 IP 自己掉了 | 远程机房带外 IPMI/console / VMware 控制台 | 远程改 IP 必用:netplan try 或 nmcli device checkpoint 300(300 秒后自动回滚,确认正常后 nmcli device checkpoint --timeout 0 取消回滚)或 at 命令定时 nmcli con up 旧连接 |
| hostname 改了不生效 | 再 hostnamectl set-hostname xxx 或重新登陆 bash | 老 shell 缓存了 hostname;/etc/hosts 里还要写 127.0.1.1 |
/etc/resolv.conf 手动改完下次又变 | ls -l /etc/resolv.conf 看它被谁 symlink 的 | 有 manager 管着,你应该去改 NM / systemd-resolved / resolvconf 的配置 |
| 同网段两台机器互 ping 丢包 50% | ip a 看两台机器是不是 IP 一样 + arping -D -I ens33 192.168.1.100 | IP 冲突(最常见);其次 Bond 配置错主备反复跳 |
| Bond 主备模式下 standby 网卡插了也不能提高带宽 | cat /proc/net/bonding/bond0 看 mode | active-backup 只有一张发流量,要高带宽得 mode=4 LACP(802.3ad)配合交换机 |
多网卡多默认网关 ip r 看到两个 default | ip rule show / sysctl net.ipv4.conf.all.rp_filter | rp_filter=strict 导致从网卡 A 进来的包从网卡 B 出去被内核丢掉 → 策略路由或把 rp_filter 改 2 |
七. 发行版 × 配置方法速查 + 常用命令表
6.1 发行版对照表
| 发行版 | 默认网络后端 | 永久配置入口 | 应用命令 |
|---|---|---|---|
| Ubuntu 24.04 Server | systemd-networkd + Netplan | /etc/netplan/*.yaml | netplan generate && netplan try |
| Ubuntu 24.04 Desktop | NetworkManager + Netplan | /etc/netplan/*.yaml renderer NetworkManager | netplan try |
| Debian 12 | ifupdown(默认)/ NM(桌面可选) | /etc/network/interfaces 或 NM | systemctl restart networking / nmcli connection up |
| RHEL 9 / Rocky 9 / Alma 9 | NetworkManager keyfile | nmcli / /etc/NetworkManager/system-connections/*.nmconnection | nmcli connection up |
| RHEL 8 / Rocky 8 | NM(默认)+ ifcfg 兼容 | 两者都行 | nmcli connection up / nmcli c reload |
| CentOS 7 | ifcfg-* + NM(可选) | /etc/sysconfig/network-scripts/ifcfg-* | systemctl restart network |
| Alpine / 精简 Busybox | 无守护 | /etc/network/interfaces 或 setup-interfaces | /etc/init.d/networking restart |
6.2 常用命令对照
| 需求 | iproute2(通吃临时) | nmcli | systemd-networkd / networkctl |
|---|---|---|---|
| 看 IP | ip -br a | nmcli -f IP4.ADDRESS con show X | networkctl status ens33 |
| 看路由 | ip r | nmcli -f IP4.GATEWAY,IP4.ROUTES con show X | networkctl status |
| 看 DNS | cat /etc/resolv.conf | nmcli -f IP4.DNS con show X | resolvectl status |
| 起 | ip link set up ens33 | nmcli con up X | networkctl up ens33 |
| 停 | ip link set down ens33 | nmcli con down X | networkctl down ens33 |
| DHCP 重新获取 | dhclient -v ens33 | nmcli con up X 自动 renew | networkctl renew ens33(systemd ≥256;旧版用 networkctl reconfigure ens33) |
6.3 「第一次 ssh 上陌生 Linux」60 秒掌握网络全貌
把下面这条 alias 加到你的 ~/.bashrc,到哪都能跑:
alias netinfo='echo "== OS =="; . /etc/os-release; echo $PRETTY_NAME; echo "== Kernel / Hostname =="; uname -r; hostnamectl 2>/dev/null | head -1 || hostname; echo "== 网卡 =="; ip -br link show; echo "== IP =="; ip -br addr show scope global; echo "== IPv6 =="; ip -6 -br addr show scope global; echo "== 路由 =="; ip route | head -5; echo "== 默认网关 =="; ip route | grep default; echo "== DNS =="; ls -l /etc/resolv.conf; cat /etc/resolv.conf | head -6; echo "== 后端服务 =="; for s in NetworkManager systemd-networkd systemd-resolved networking; do echo -n "$s: "; systemctl is-active $s 2>/dev/null; done; echo "== Netplan? =="; ls /etc/netplan/*.yaml 2>/dev/null || echo "无";'八. 最佳实践总结
- 远程改 IP 永远用「定时回滚」技巧:
netplan try首选;NM 环境用nmcli device checkpoint 300(300 秒未确认自动回滚);都没有就echo "systemctl restart NetworkManager" | at now + 5 minutes先挂上再改。 - 一套后端到底:一台机器别让 NetworkManager 和 systemd-networkd 和 ifcfg 都同时跑,会互相抢。
- DNS 走 manager,不手写 /etc/resolv.conf:除非你
chattr +i或者真的确认没有 manager。 - 多网卡多网段一定画拓扑:画清楚默认网关走哪个网卡、其余网段走哪条静态路由,然后
ip route get <目标>验证结果。 - Bond / VLAN 配完第一件事:
cat /proc/net/bonding/bond0+ip -d link show bond0.10,别靠ifconfig。 - DHCP 环境要固定 IP:在 DHCP 服务器上按 MAC 绑静态租约(Static Reservation),比在客户机上改手动更统一维护。
- 排障顺序:物理链路 → IP/掩码 → 网关 → DNS,一步不通就别往下查了。