本文要点
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 网络配置工具经历过一次换代:老一代的 ifconfig、route、arp 来自 net-tools 包,已多年停止维护;新一代是 iproute2 包,核心命令是 ip,用一套统一的「对象 + 动作」语法覆盖地址、路由、邻居、链路等所有网络对象。
| 老命令 | 新命令 | 作用 |
|---|---|---|
ifconfig | ip addr | 查看/配置接口地址 |
route -n | ip route | 查看/配置路由表 |
arp -a | ip neigh | 查看/配置邻居表(ARP 缓存) |
ifconfig eth0 up | ip link set eth0 up | 启停接口 |
ip 的通用语法是 ip [对象] [动作] [参数],对象有 addr、link、route、neigh 等。本文在 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
每个接口一行,三列分别是接口名、链路状态、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.88.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 show172.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 add 和 ip 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 show lo 的输出里,inet 10.10.10.10/24 scope global lo 就是刚加上的地址(注意 scope global,而回环本身的 127.0.0.1 是 scope 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 addr 里 ens5 的 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
配置内容:
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.addresses | DNS 服务器,上面用了阿里 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.5 和 8.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
网络排查看完"接口有没有地址、路由对不对"后,常要确认"服务到底监听了没"。"端口占用"在新老工具里分别对应 netstat 和 ss(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 |
| 临时加 / 删 IP | ip 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 这类高风险操作也能稳稳落地。
评论 (0)
暂无评论,快来抢沙发吧!