暗色模式

Linux 网络配置:从 ip 命令到 netplan 静态 IP

技术教程
2026-08-15
4
0
本文要点
  • ip 命令是 Linux 网络配置的核心:ip addr 看地址、ip route 看路由、ip neigh 看邻居表
  • ip addr add/del 可临时增删 IP,不用重启服务,改完重启即失效
  • Ubuntu 用 netplan(YAML 配置文件)管理网络,改静态 IP 只需编辑 /etc/netplan/*.yaml
  • netplan generate 只做语法校验不生效;netplan apply 才应用;netplan get 查看最终生效配置
  • 云主机远程改网卡 IP 有断连风险,推荐先用 netplan try(超时自动回滚)

为什么现在用 ip 而不是 ifconfig

Linux 网络配置工具经历过一次换代:老一代的 ifconfigroutearp 来自 net-tools 包,已多年停止维护;新一代是 iproute2 包,核心命令是 ip,用一套统一的「对象 + 动作」语法覆盖地址、路由、邻居、链路等所有网络对象。

老命令新命令作用
ifconfigip addr查看/配置接口地址
route -nip route查看/配置路由表
arp -aip neigh查看/配置邻居表(ARP 缓存)
ifconfig eth0 upip link set eth0 up启停接口

ip 的通用语法是 ip [对象] [动作] [参数],对象有 addrlinkrouteneigh 等。本文在 Ubuntu 24.04 演示机上把所有查看和改动的命令都真实执行一遍,输出即所见。

查看网络接口与地址:ip addr

接口(interface)是系统的网卡或虚拟网卡,地址(address)是绑在接口上的 IP。ip addr 查看全部接口,-br(brief)只输出一行摘要,适合一眼扫完:

ip -br addr show

在演示机上(云主机,带 Docker),输出是:

lo               UNKNOWN        127.0.0.1/8 ::1/128
ens5             UP             172.28.141.96/20 metric 100 fe80::216:3eff:fe08:52ab/64
docker0          DOWN           172.17.0.1/16 fe80::2cfa:95ff:fe56:e4ad/64

用 ip -br addr 查看全部接口地址

每个接口一行,三列分别是接口名、链路状态、IPv4/IPv6 地址

  • lo:回环接口,固定 127.0.0.1/8,状态 UNKNOWN 属正常(它没有物理链路);
  • ens5:这台云主机的真实网卡,状态 UP,IPv4 是 172.28.141.96/20(DHCP 分到的内网地址),/20 是子网掩码的简写,后面还带了 fe80:: 开头的 IPv6 链路本地地址;
  • docker0:Docker 创建的虚拟网桥,地址 172.17.0.1/16,状态 DOWN 表示当前没有容器在用这个网桥(没连接网络时它的状态就是这样)。

要看某个接口的完整细节(MAC 地址、标志位、租约等),不带 -br 展开看即可:

ip addr show ens5

查看路由表:ip route

路由决定"去某个网络的数据包该走哪个接口、经哪个网关"。ip route show(可简写 ip r)查看当前路由表:

ip route show

演示机输出:

default via 172.28.143.253 dev ens5 proto dhcp src 172.28.141.96 metric 100
100.100.2.136 via 172.28.143.253 dev ens5 proto dhcp src 172.28.141.96 metric 100
100.100.2.138 via 172.28.143.253 dev ens5 proto dhcp src 172.28.141.96 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.28.128.0/20 dev ens5 proto kernel scope link src 172.28.141.96 metric 100
172.28.143.253 dev ens5 proto dhcp scope link src 172.28.141.96 metric 100

图里第一张截图的下半部分就是这张表。最关键的几行:

  • default via 172.28.143.253 dev ens5默认路由——目标不在任何其他路由内时,统一交给网关 172.28.143.253,从 ens5 出去。这台机器的互联网流量都走它;
  • 172.28.128.0/20 dev ens5:直连路由——ens5 所在子网的数据不经过网关,直接二层通信;
  • 172.17.0.0/16 dev docker0:Docker 网桥网段,linkdown 表示网桥目前没活跃。

proto dhcp 表示这些路由是 DHCP 自动下发的;proto kernel 表示是内核根据接口地址自动生成的。想验证"去某个 IP 实际走哪条路",用 ip route get,它能精确算出路径,很实用:

ip route get 8.8.8.8
8.8.8.8 via 172.28.143.253 dev ens5 src 172.28.141.96 uid 0
    cache

查看邻居表:ip neigh

邻居表就是 ARP/NDP 缓存,记录"同一二层网段里,哪个 IP 对应哪个 MAC 地址"。ip neigh show 查看:

ip neigh show
172.28.143.253 dev ens5 lladdr ee:ff:ff:ff:ff:ff REACHABLE

演示机里只有一条——网关 172.28.143.253 的 MAC 是 ee:ff:ff:ff:ff:ff,状态 REACHABLE(最近通信过,条目有效)。如果你 ping 过同网段的其他机器,它们也会出现在这里;状态 STALE 表示条目过期待刷新,FAILED 表示 ARP 查询失败(目标不可达)。排查"同一交换机下两台机器却 ping 不通"时,看邻居表往往比看路由表更能定位问题。

临时添加与删除 IP:ip addr add/del

很多时候只是临时要加个 IP(比如测试、起临时服务),不想改动持久配置。ip addr addip addr del 就是干这个的——改动立即生效、重启失效。下面在回环接口 lo 上临时加一个 10.10.10.10/24,查看后再删掉:

ip addr add 10.10.10.10/24 dev lo && ip addr show lo && ip addr del 10.10.10.10/24 dev lo

用 ip addr add/del 临时增删 IP

ip addr show lo 的输出里,inet 10.10.10.10/24 scope global lo 就是刚加上的地址(注意 scope global,而回环本身的 127.0.0.1scope host,两者作用域不同)。命令尾部执行 ip addr del 后又把它删掉,输出末尾的 OK 就是删除成功的回显。这是排查网络问题时最常用的"无副作用"操作:先 add 测试连通性,测完 del,不影响任何持久配置。

提示:同一接口加多个地址不会覆盖,而是叠加。想要"删掉接口上的某个地址",ip addr del 必须写明与 add 时一致的地址和掩码。

netplan:Ubuntu 的持久网络配置

前面 ip 命令的改动都是临时的,重启就没了。要让配置持久化,Ubuntu(18.04 起)用 netplan:它把网络配置统一写成 YAML 文件,位于 /etc/netplan/,启动时由 netplan 翻译成 systemd-networkd(或 NetworkManager)的配置。看演示机的现有配置:

ls /etc/netplan/ && cat /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    version: 2
    ethernets:
        ens5:
            dhcp4: true
            match:
                macaddress: 00:16:3e:08:52:ab

这个文件来自云厂商的 cloud-init(云主机开机时自动写入,所以 50 号段,权限 600),意思是:ens5 这个接口用 DHCP 自动获取地址(dhcp4: true),match.macaddress 用 MAC 地址锁定网卡(不依赖可能会变的接口名)。这也是为什么前面 ip addrens5 的 IP 是动态的。

改成静态 IP

网卡要改成静态 IP,只需把 dhcp4: true 改成 false,并补充地址、网关和 DNS。netplan 会按文件名顺序合并 /etc/netplan/ 下所有 yaml,所以更好的做法是新建一个编号更大的文件(如 90-static.yaml)来覆盖,而不是改 cloud-init 的文件。下面在演示机上写一个静态配置并校验:

cat /etc/netplan/90-static-demo.yaml && netplan generate && echo '=== SYNTAX_OK ===' && netplan get

netplan 静态 IP 配置与语法校验

配置内容:

network:
  version: 2
  ethernets:
    ens5:
      dhcp4: false
      addresses: [192.168.1.100/24]
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [223.5.5.5, 8.8.8.8]

逐段含义:

配置项说明
addresses: [192.168.1.100/24]静态地址,/24 掩码跟在 IP 后;要配多个就多写几项
routes: - to: default via: 192.168.1.1默认网关:去 default(0.0.0.0/0)都经 192.168.1.1
nameservers.addressesDNS 服务器,上面用了阿里 DNS 223.5.5.5 和谷歌 8.8.8.8
dhcp4: false关闭 DHCP,否则动态地址会和静态地址冲突

截图里三条命令的效果:cat 显示配置内容;netplan generate 把 YAML 翻译成底层 networkd 配置——这一步只做语法校验和渲染,不改变当前网络,输出 SYNTAX_OK 说明配置语法正确;netplan get 展示 netplan 计算出的最终生效配置——可以看到 192.168.1.100/24、默认路由 192.168.1.1、DNS 223.5.5.58.8.8.8 都已就位,dhcp4: false 也生效了。

apply 与 try:真正应用配置

netplan generate 不碰当前网络,真正应用配置的是:

netplan apply

在云主机/远程服务器上改静态 IP 是最容易把 SSH 断掉的操作——如果地址或网关写错,apply 后你立刻连不上机器了。netplan 专门提供了安全阀 netplan try:应用配置后等 120 秒,期间你按回车确认就保留,超时或拒绝就自动回滚到旧配置:

netplan try

所以远程改 IP 的推荐姿势是:先 netplan generate 验语法 → 再 netplan try 测试确认 → 最后 netplan apply 持久生效。本地服务器或物理机则可以直接 netplan apply

注意:改 IP 前确认新地址与网关同网段、网关可达。像演示机这种由 cloud-init 管理的云主机,/etc/netplan/50-cloud-init.yaml 开机会被重新生成覆盖,自定义静态配置应放在独立的高编号文件(如 90-xxx.yaml)里,并配合 match.macaddress 锁定网卡。

快速查看监听端口:ss

网络排查看完"接口有没有地址、路由对不对"后,常要确认"服务到底监听了没"。"端口占用"在新老工具里分别对应 netstatss(socket statistics,iproute2 提供,比 netstat 更快更全):

ss -tulnp

参数拆解:-t TCP、-u UDP、-l 只看 LISTEN(监听)、-n 不反解域名直接显示 IP、-p 显示占用进程。演示机输出节选:

Netid State  Recv-Q Send-Q Local Address:Port  Peer Address:Port  Process
tcp   LISTEN 0      4096       0.0.0.0:22       0.0.0.0:*     users:(("sshd",pid=703681,fd=3))
tcp   LISTEN 0      4096   127.0.0.53:53       0.0.0.0:*     users:(("systemd-resolve",...))
udp   UNCONN 0      0      127.0.0.54:53       0.0.0.0:*     users:(("systemd-resolve",...))
  • 0.0.0.0:22 的 sshd:SSH 服务监听所有网卡的 22 端口,0.0.0.0 表示不限来源 IP;
  • 127.0.0.53:53 的 systemd-resolve:本地 DNS 缓存,只监听回环,外部访问不到;
  • 172.28.141.96:68:DHCP 客户端(systemd-network)在收租约。

ss -tulnp | grep 22 可以快速确认某个端口有没有服务在听,是排查"端口不通"的第一步。

常用命令速查表

目标命令
查看全部接口地址(简洁)ip -br addr show
查看某接口详细信息ip addr show ens5
临时加 / 删 IPip addr add 10.0.0.1/24 dev ens5 / ip addr del 10.0.0.1/24 dev ens5
查看路由表ip route show
验证到某 IP 的路径ip route get 8.8.8.8
查看邻居表(ARP)ip neigh show
启停接口ip link set ens5 up / down
查看监听端口ss -tulnp
校验 netplan 语法netplan generate
应用 netplan 配置netplan apply
安全应用(可回滚)netplan try
查看 netplan 生效配置netplan get

小结

Linux 网络配置的"查"与"改"各有一块顺手的工具:查看和临时改动全用 ip 家族的 addr/route/neigh 三个对象,配合 ss 看端口,定位"没地址、没路由、没监听"三类问题;持久配置在 Ubuntu 上交给 netplan 的 YAML 文件,静态 IP 的套路是「dhcp4: false + addresses + 默认路由 + DNS」,远程机器上务必用 netplan try 保护自己不断连。先 generate 验语法、try 试应用、apply 定持久,三步下来,改 IP 这类高风险操作也能稳稳落地。

参考资料

发表评论

暂无评论,快来抢沙发吧!