Linux ip 命令使用详解

1次阅读

ip link 操作链路层,启用/禁用须用 up/down(非 state up),改 mac 或 mtu 前必须先 down 再 up;ip addr 管理 ip 时需带完整 cidr;ip route 设默认网关须指定 dev 和 via;所有配置默认临时,持久化需按发行版规范写入对应配置文件。

Linux ip 命令使用详解

ip link 管理网卡启停和基础属性

网卡不起来、改不了 MAC、MTU 调不生效?大概率是没按顺序操作。ip link 操作的是链路层本身,不是 IP 地址,所以它不关心你配了几个 IP,只管物理/虚拟接口的“通电”状态和硬件参数。

  • 启用/禁用必须用 sudo ip link set dev ens33 up/downupdown 是动作,不是状态值;写成 state up 会报错
  • 改 MAC 前必须先 down,否则提示 RTNETLINK answers: Device or Resource busy;改完要再 up,否则新 MAC 不生效
  • 设置 MTU 时,如果网卡已 up,部分驱动(如某些虚拟网卡)会拒绝修改,稳妥做法仍是先 down 再设再 up
  • ip -br link showip l 更适合快速扫一眼所有接口名、状态、MAC,尤其在多网卡服务器上

ip addr 添加/删除 IPv4 地址

临时加 IP 最常用,但删错一个地址可能连 ssh 都断掉——因为 ip addr flush dev eth0 会清空全部,包括你没注意的另一个业务 IP。

  • 添加地址用 sudo ip addr add 192.168.1.100/24 dev eth0,CIDR 掩码不能省,写成 192.168.1.100/255.255.255.0 会失败
  • 删除指定地址必须带完整 CIDR:sudo ip addr del 192.168.1.100/24 dev eth0,只写 IP 不带掩码会报 invalid argument
  • 同一网卡可绑定多个 IP,但内核默认不响应非主 IP 的 ARP 请求(除非开启 arp_ignore),所以其他机器 ping 不通新 IP 很正常
  • ip a show dev eth0 输出里带 scope global 的才是对外可用的地址,scope host 是本地回环用途,别误删

ip route 配置默认网关和静态路由

加了默认路由却上不了网?常见原因是没指定出接口,或者系统已有更高优先级路由覆盖了你的配置。

  • 设默认网关必须带 devviasudo ip route add default via 192.168.1.1 dev eth0;漏掉 dev 可能导致路由走错网卡
  • 查看当前 IPv4 路由表用 ip route show,加 -n(不解析域名)更快;注意看第一条是否为 default via ...,且没有重复或冲突条目
  • 删除默认路由用 sudo ip route del default,不是 del default via ...;后者语法错误,会提示 Invalid argument
  • 静态路由若指向本地子网(如 ip route add 10.0.0.0/8 via 192.168.1.100),而 192.168.1.100 不在本机任何接口上,这条路由永远不会命中

永久生效 vs 临时配置的区别在哪

所有 ip 命令默认都是内存级操作,重启即丢。想持久化,不能靠 alias 或 rc.local,得进发行版规定的网络配置路径。

  • centos/RHEL 8+ 用 /etc/sysconfig/network-scripts/ifcfg-ens33,改 IPADDRNETMASKgateway,然后 sudo systemctl restart NetworkManagernmcli connection reload
  • ubuntu/debian 22.04+ 默认用 Netplan,配置在 /etc/netplan/*.yaml,改完必须 sudo netplan apply,直接 systemctl restart systemd-networkd 不生效
  • 手动写 ip 命令到 /etc/rc.local 在多数新系统中已被禁用,systemd 默认不执行它
  • 测试时建议先用临时命令验证通路,再写配置文件;否则配置写错 + 重启 = 失联

真正麻烦的不是命令记不住,而是不同发行版对“永久”的定义完全不同——CentOS 认为 ifcfg 是权威,Ubuntu 认为 Netplan 才算数,而容器或 network Namespace 里连这些文件都没有。动手前先确认自己在哪种环境里。

text=ZqhQzanResources