Linux 中 ip
命令的详细使用方法
ip
命令是 Linux 系统中用于网络配置和管理的强大工具,是传统 ifconfig
、route
和 netstat
等命令的现代替代品。它属于 iproute2
套件,提供了更全面和灵活的网络管理功能。本文将深入探讨 ip
命令的安装、基本语法、各子命令及其选项、常见使用场景和实际应用示例,帮助您全面掌握这一工具的使用。
目录
前言
在现代 Linux 系统中,网络配置与管理是系统管理员和开发人员日常工作的重要组成部分。传统的网络管理工具如 ifconfig
、route
、netstat
等虽然仍可使用,但它们在功能和灵活性上已逐渐被 ip
命令取代。ip
命令不仅提供了更全面的网络配置选项,还能更有效地处理复杂的网络环境。
通过掌握 ip
命令,您可以更高效地管理网络接口、配置 IP 地址、设置路由、管理邻居缓存等,提升系统管理和故障排查的能力。
安装 ip
命令
ip
命令是 iproute2
套件的一部分。大多数现代 Linux 发行版默认已安装 iproute2
。如果未安装,可以通过以下命令进行安装:
Debian/Ubuntu 系列
sudo apt update
sudo apt install iproute2
Red Hat/CentOS/Fedora 系列
sudo yum install iproute
# 或者在 Fedora 上使用 dnf
sudo dnf install iproute
Arch Linux
sudo pacman -S iproute2
检查安装
安装完成后,可以通过以下命令验证 ip
命令是否可用:
ip --version
示例输出:
ip utility, iproute2-5.10.0
ip
命令的基本语法
ip
命令的基本语法如下:
ip [ OPTIONS ] OBJECT { COMMAND | help }
- OPTIONS:全局选项,如
-h
显示帮助,-V
显示版本信息。 - OBJECT:操作对象,如
link
(网络接口)、addr
(IP 地址)、route
(路由)、neigh
(邻居缓存)等。 - COMMAND:具体命令,如
add
、del
、show
、set
等。
示例:
ip addr show
ip
命令的主要子命令详解
查看网络接口 (ip link
)
ip link
用于管理和查看网络接口的状态和属性。
查看所有网络接口
ip link show
简写:
ip link
示例输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
关键字段解释:
- 索引号:网络接口的索引号(如
1:
,2:
)。 - 接口名称:接口的名称(如
lo
,eth0
)。 - 状态标志:接口的状态和属性(如
UP
,DOWN
,BROADCAST
)。 - MTU:最大传输单元。
- qdisc:队列规则。
- state:接口的状态(如
UP
,DOWN
)。 - link/类型:链路层地址(如
loopback
,ether
)。 - MAC 地址:以太网地址。
- 广播地址:广播地址。
启用或禁用网络接口
启用接口:
sudo ip link set eth0 up
禁用接口:
sudo ip link set eth0 down
修改接口的 MTU
设置 MTU 为 1400:
sudo ip link set dev eth0 mtu 1400
重命名接口
将 eth0
重命名为 enp0s3
:
sudo ip link set eth0 name enp0s3
注意:某些系统使用 predictable network interface names
,建议谨慎重命名接口。
管理 IP 地址 (ip addr
)
ip addr
用于管理和查看网络接口的 IP 地址。
查看所有接口的 IP 地址
ip addr show
简写:
ip addr
示例输出:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe12:3456/64 scope link
valid_lft forever preferred_lft forever
关键字段解释:
- inet:IPv4 地址及其子网掩码。
- brd:广播地址。
- scope:地址的作用域(如
global
,link
)。 - inet6:IPv6 地址及其前缀长度。
添加 IP 地址
为 eth0
添加 IPv4 地址 192.168.1.20/24
:
sudo ip addr add 192.168.1.20/24 dev eth0
为 eth0
添加 IPv6 地址 2001:db8::1/64
:
sudo ip addr add 2001:db8::1/64 dev eth0
删除 IP 地址
删除 eth0
上的 IPv4 地址 192.168.1.20/24
:
sudo ip addr del 192.168.1.20/24 dev eth0
删除 eth0
上的 IPv6 地址 2001:db8::1/64
:
sudo ip addr del 2001:db8::1/64 dev eth0
配置别名 IP 地址
虽然 ip
命令不再使用传统的接口别名(如 eth0:1
),可以通过添加多个 IP 地址实现类似功能。
为 eth0
添加第二个 IPv4 地址 192.168.1.21/24
:
sudo ip addr add 192.168.1.21/24 dev eth0
管理路由表 (ip route
)
ip route
用于管理和查看路由表。
查看路由表
ip route show
简写:
ip route
示例输出:
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 metric 100
关键字段解释:
- default via 192.168.1.1 dev eth0:默认路由,通过网关
192.168.1.1
使用接口eth0
。 - 192.168.1.0/24 dev eth0:到达
192.168.1.0/24
子网的路由,使用接口eth0
。 - proto:路由协议(如
kernel
,dhcp
)。 - scope:路由作用域(如
link
,global
)。 - src:源地址。
- metric:路由优先级,数值越低优先级越高。
添加路由
添加到 10.0.0.0/24
子网的路由,网关为 192.168.1.1
,使用接口 eth0
:
sudo ip route add 10.0.0.0/24 via 192.168.1.1 dev eth0
添加默认路由(默认网关):
sudo ip route add default via 192.168.1.1 dev eth0
删除路由
删除到 10.0.0.0/24
子网的路由:
sudo ip route del 10.0.0.0/24 via 192.168.1.1 dev eth0
删除默认路由:
sudo ip route del default via 192.168.1.1 dev eth0
修改路由
ip route
不提供直接修改路由的命令,通常需要先删除旧路由再添加新路由。
示例:将默认路由从 192.168.1.1
改为 192.168.1.254
:
sudo ip route del default via 192.168.1.1 dev eth0
sudo ip route add default via 192.168.1.254 dev eth0
设置路由优先级
通过设置 metric
参数来调整路由优先级。
添加路由并设置较高的 metric(较低优先级):
sudo ip route add 10.0.0.0/24 via 192.168.1.1 dev eth0 metric 200
管理网络规则 (ip rule
)
ip rule
用于管理策略路由规则,基于多种条件(如源地址、目的地址、TOS 等)选择不同的路由表。
查看网络规则
ip rule show
示例输出:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
添加网络规则
基于源地址 192.168.1.10
使用自定义路由表 100
:
sudo ip rule add from 192.168.1.10/32 table 100
删除网络规则
删除基于源地址 192.168.1.10
的规则:
sudo ip rule del from 192.168.1.10/32 table 100
管理路由表
在 /etc/iproute2/rt_tables
文件中定义自定义路由表。
编辑路由表文件:
sudo nano /etc/iproute2/rt_tables
添加自定义路由表:
100 custom
配置自定义路由表中的路由:
sudo ip route add default via 10.0.0.1 dev eth0 table custom
管理邻居表 (ip neigh
)
ip neigh
用于管理 ARP(地址解析协议)缓存。
查看邻居表
ip neigh show
简写:
ip n
示例输出:
192.168.1.1 dev eth0 lladdr 52:54:00:12:34:56 REACHABLE
192.168.1.20 dev eth0 lladdr 52:54:00:65:43:21 STALE
关键字段解释:
- IP 地址:目标 IP 地址。
- dev:关联的网络接口。
- lladdr:链路层地址(MAC 地址)。
- 状态:邻居状态(如
REACHABLE
,STALE
,FAILED
)。
添加静态 ARP 条目
为 IP 地址 192.168.1.100
添加静态 MAC 地址 00:11:22:33:44:55
:
sudo ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
删除 ARP 条目
删除 IP 地址 192.168.1.100
的 ARP 条目:
sudo ip neigh del 192.168.1.100 dev eth0
修改 ARP 条目
将 IP 地址 192.168.1.100
的 MAC 地址修改为 66:77:88:99:AA:BB
:
sudo ip neigh replace 192.168.1.100 lladdr 66:77:88:99:AA:BB dev eth0 nud permanent
管理多播组 (ip maddr
)
ip maddr
用于管理网络接口的多播地址。
查看多播地址
ip maddr show
示例输出:
1: lo
inet 224.0.0.1 dev lo
inet6 ff02::1 dev lo
2: eth0
inet 224.0.0.1 dev eth0
inet6 ff02::1 dev eth0
添加多播地址
为 eth0
添加多播地址 224.0.0.2
:
sudo ip maddr add 224.0.0.2 dev eth0
删除多播地址
删除 eth0
上的多播地址 224.0.0.2
:
sudo ip maddr del 224.0.0.2 dev eth0
管理隧道 (ip tunnel
)
ip tunnel
用于创建和管理网络隧道,如 GRE、IPIP 等。
创建 GRE 隧道
创建名为 gre1
的 GRE 隧道,源 IP 为 192.168.1.1
,目的 IP 为 192.168.2.1
:
sudo ip tunnel add gre1 mode gre remote 192.168.2.1 local 192.168.1.1 ttl 255
启动隧道
sudo ip link set gre1 up
配置隧道的 IP 地址
sudo ip addr add 10.0.0.1/30 dev gre1
删除隧道
sudo ip tunnel del gre1
常见使用场景与示例
查看所有网络接口和状态
ip link show
示例输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
启用或禁用网络接口
启用接口 eth0
:
sudo ip link set eth0 up
禁用接口 eth0
:
sudo ip link set eth0 down
添加或删除 IP 地址
添加 IPv4 地址 192.168.1.20/24
到 eth0
:
sudo ip addr add 192.168.1.20/24 dev eth0
删除 IPv4 地址 192.168.1.20/24
从 eth0
:
sudo ip addr del 192.168.1.20/24 dev eth0
添加或删除路由
添加到 10.0.0.0/24
的路由,网关为 192.168.1.1
,使用 eth0
:
sudo ip route add 10.0.0.0/24 via 192.168.1.1 dev eth0
删除到 10.0.0.0/24
的路由:
sudo ip route del 10.0.0.0/24 via 192.168.1.1 dev eth0
配置默认网关
设置默认网关为 192.168.1.1
:
sudo ip route add default via 192.168.1.1 dev eth0
删除默认网关:
sudo ip route del default via 192.168.1.1 dev eth0
配置别名 IP 地址
为 eth0
添加第二个 IPv4 地址 192.168.1.21/24
:
sudo ip addr add 192.168.1.21/24 dev eth0
查看路由表和路由规则
查看路由表:
ip route show
查看网络规则:
ip rule show
管理邻居缓存
查看邻居表:
ip neigh show
添加静态 ARP 条目:
sudo ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
删除 ARP 条目:
sudo ip neigh del 192.168.1.100 dev eth0
创建和管理隧道
创建 GRE 隧道 gre1
:
sudo ip tunnel add gre1 mode gre remote 192.168.2.1 local 192.168.1.1 ttl 255
sudo ip link set gre1 up
sudo ip addr add 10.0.0.1/30 dev gre1
删除 GRE 隧道 gre1
:
sudo ip tunnel del gre1
高级用法
使用 ip
命令与 tc
进行流量控制
tc
(Traffic Control)用于配置网络流量的管理策略,通常与 ip
命令结合使用。
示例:为 eth0
配置带宽限制
清除现有队列规则:
sudo tc qdisc del dev eth0 root
添加根队列规则(HTB):
sudo tc qdisc add dev eth0 root handle 1: htb default 12
创建主类:
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
创建子类并设置带宽限制:
sudo tc class add dev eth0 parent 1:1 classid 1:12 htb rate 10mbit
添加过滤规则:
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.100 flowid 1:12
说明:
- HTB(Hierarchical Token Bucket):一种队列规则,用于管理带宽。
- rate:带宽速率限制。
- filter:匹配特定流量的规则。
配置网络命名空间
网络命名空间允许在同一主机上创建多个独立的网络环境。
创建网络命名空间 ns1
:
sudo ip netns add ns1
在命名空间中添加网络接口:
创建虚拟以太网对:
sudo ip link add veth0 type veth peer name veth1
将
veth1
移动到ns1
命名空间:sudo ip link set veth1 netns ns1
配置主机端接口
veth0
:sudo ip addr add 10.200.1.1/24 dev veth0 sudo ip link set veth0 up
配置命名空间内的接口
veth1
:sudo ip netns exec ns1 ip addr add 10.200.1.2/24 dev veth1 sudo ip netns exec ns1 ip link set veth1 up sudo ip netns exec ns1 ip link set lo up
在命名空间中添加默认路由:
sudo ip netns exec ns1 ip route add default via 10.200.1.1
验证命名空间内的网络配置:
sudo ip netns exec ns1 ip addr show
删除网络命名空间:
sudo ip netns del ns1
配置 VLAN 和桥接接口
创建 VLAN 接口
为
eth0
创建 VLAN 100:sudo ip link add link eth0 name eth0.100 type vlan id 100 sudo ip addr add 192.168.100.1/24 dev eth0.100 sudo ip link set eth0.100 up
创建桥接接口
安装桥接工具(如果未安装):
sudo apt install bridge-utils # Debian/Ubuntu sudo yum install bridge-utils # Red Hat/CentOS sudo dnf install bridge-utils # Fedora
创建桥接接口
br0
并添加eth0
到桥接中:sudo ip link add name br0 type bridge sudo ip link set dev eth0 master br0 sudo ip addr add 192.168.1.10/24 dev br0 sudo ip link set dev br0 up sudo ip link set dev eth0 up
删除桥接接口:
sudo ip link set dev eth0 nomaster
sudo ip link delete br0 type bridge
错误排查与解决
接口未显示或不可用
症状:执行 ip link show
未显示预期的网络接口,或接口状态为 DOWN
。
解决方法:
检查驱动程序:确保网络接口的驱动已正确加载。
lspci -k | grep -A 3 -i network
启用接口:
sudo ip link set eth0 up
检查硬件连接:确保物理连接正确,网线插紧,网络设备正常工作。
查看系统日志:
dmesg | grep eth0
无法添加 IP 地址
症状:执行 ip addr add
命令时报错,如 RTNETLINK answers: File exists
。
解决方法:
检查是否已存在相同的 IP 地址:
ip addr show dev eth0
删除冲突的 IP 地址:
sudo ip addr del 192.168.1.20/24 dev eth0
使用正确的子网掩码:确保 IP 地址和子网掩码匹配。
接口状态:确保接口已启用。
sudo ip link set eth0 up
路由添加失败
症状:执行 ip route add
命令时报错,如 RTNETLINK answers: Network is unreachable
。
解决方法:
检查网关是否可达:
ping -c 3 192.168.1.1
确保接口已配置 IP 地址:
ip addr show dev eth0
检查接口状态:
ip link show dev eth0
确保目标网络和网关在同一子网。
权限不足问题
症状:执行 ip
命令时提示 Operation not permitted
或类似错误。
解决方法:
使用
sudo
:许多ip
命令需要超级用户权限。sudo ip link set eth0 up
以 root 用户身份执行命令:
su - ip link set eth0 up
检查用户权限:确保当前用户具有执行网络管理操作的权限。
命令不兼容或缺失
症状:执行 ip
命令时提示 command not found
。
解决方法:
安装
iproute2
套件:sudo apt install iproute2 # Debian/Ubuntu sudo yum install iproute # Red Hat/CentOS sudo dnf install iproute # Fedora
检查 PATH 环境变量:
echo $PATH which ip
重新安装
iproute2
套件:sudo apt reinstall iproute2 # Debian/Ubuntu sudo yum reinstall iproute # Red Hat/CentOS sudo dnf reinstall iproute # Fedora
最佳实践与注意事项
使用
sudo
或 root 权限:多数ip
命令需要超级用户权限,确保在安全的前提下使用。理解网络基础:熟悉 IP 地址、子网掩码、路由表等网络基础知识,有助于更有效地使用
ip
命令。备份配置文件:在修改网络配置前,备份相关配置文件,如
/etc/network/interfaces
或/etc/netplan/*.yaml
。避免误操作:错误的网络配置可能导致远程连接中断,尤其是在管理远程服务器时,建议在本地终端执行关键操作。
使用脚本自动化配置:通过 Shell 脚本自动化常见的网络配置任务,提高效率并减少人为错误。
监控网络状态:定期检查网络接口状态和路由表,确保网络连接正常。
文档化配置变更:记录所有网络配置的更改,便于日后维护和故障排查。
结合其他工具使用:与
ping
、traceroute
、netstat
、ss
等工具结合使用,全面分析和诊断网络问题。
总结
ip
命令是 Linux 系统中网络配置和管理的核心工具,提供了比传统工具更强大和灵活的功能。通过本文的详细介绍,您应能够熟练地使用 ip
命令执行各种网络管理任务,包括查看和配置网络接口、管理 IP 地址和路由、配置网络规则、管理邻居缓存等。
关键要点:
- 全面的子命令:
ip
命令涵盖了网络接口、地址、路由、规则、邻居等多个方面。 - 灵活的选项和参数:通过组合不同的选项和参数,可以实现复杂的网络配置。
- 现代化的网络管理:相比传统工具,
ip
命令提供了更高效和可靠的网络管理方式。 - 结合其他工具:与其他网络工具结合使用,能更有效地进行网络诊断和故障排查。
通过不断实践和应用,您将能够充分发挥 ip
命令的潜力,提升 Linux 系统的网络管理能力。