iproute2的ip,ss,bridge,tc命令详解,笔记250714
以下是iproute2工具集中核心命令ip、ss、bridge和tc的深度详解:
1. ip 命令(网络全能工具)
Linux网络配置的核心命令,通过子命令管理各种网络对象:
常用子命令:
| 对象(OBJECT) | 功能描述 | 常用命令示例 |
|---|---|---|
| link | 网络设备管理 | ip link showip link set eth0 up |
| address | IP地址管理 | ip addr add 192.168.1.10/24 dev eth0 |
| route | 路由表管理 | ip route add default via 192.168.1.1 |
| neigh | ARP/邻居表 | ip neigh show |
| rule | 策略路由 | ip rule add from 192.168.2.0/24 table 100 |
| tunnel | 隧道管理 | ip tunnel add gre0 mode gre local 10.1.1.1 remote 20.2.2.1 |
| maddress | 组播地址 | ip maddress show |
| monitor | 实时监控 | ip monitor all |
-
ip link(接口管理)ip link show # 显示所有接口 ip link set eth0 up # 启用接口 ip link set eth0 mtu 9000 # 修改MTU ip link add veth0 type veth peer name veth1 # 创建veth pair ip link add bond0 type bond mode 802.3ad # 创建链路聚合 -
ip address(IP地址管理)ip addr add 192.168.1.10/24 dev eth0 # 添加IP ip addr del 192.168.1.10/24 dev eth0 # 删除IP ip addr show eth0 # 显示接口IP ip addr flush eth0 # 清除所有IP配置 -
ip route(路由管理)ip route add 10.0.0.0/8 via 192.168.1.1 # 添加静态路由 ip route add default via 192.168.1.1 # 添加默认网关 ip route show table main # 查看主路由表 ip route get 8.8.8.8 # 查询到目标的路由路径 -
ip rule(策略路由)ip rule add from 192.168.2.0/24 lookup 100 # 源IP策略 ip rule add fwmark 0x1 lookup 200 # 防火墙标记策略 ip rule show # 显示所有策略规则 -
ip neigh(ARP/NDP管理)ip neigh show # 显示ARP表 ip neigh flush dev eth0 # 清除接口ARP缓存 -
ip netns(网络命名空间)ip netns add ns1 # 创建命名空间 ip netns exec ns1 ip link show # 在命名空间内执行命令
2. ss 命令 (Socket统计)
替代netstat的现代工具,实时监控套接字连接
核心功能:
ss -tuln # 查看所有监听端口(TCP/UDP)
ss -t -u -l -n # 查看所有监听端口(TCP/UDP)
ss -nt src :443 # 查看所有443端口的连接
ss -o state established '( dport = :http )' # 过滤HTTP连接
ss -s # 显示摘要统计
ss -it # 显示TCP内部信息(cwnd,rtt)
常用选项
| 选项 | 功能描述 | 示例 |
|---|---|---|
-t | TCP 套接字 | ss -t |
-u | UDP 套接字 | ss -u |
-l | 监听套接字 | ss -tl |
-a | 所有套接字 | ss -ta |
-n | 数字格式 | ss -tn |
-p | 显示进程 | ss -tp |
-s | 摘要统计 | ss -s |
-o | 计时器信息 | ss -to |
-i | TCP内部信息 | ss -ti |
用ss关闭占用端口的程序进程
# 1. 查找占用端口的tcp进程
ss -tlnp | grep ':端口号'
# 1. 查找占用端口的tcp,udp进程
ss -tulnp | grep ':端口号'
# 2. 从输出中提取PID并终止
sudo kill -9 $(ss -tlnp | awk '/:端口号/{split($6,a,"[,=]"); print a[2]}')
状态过滤:
ss -t state listening # 所有TCP监听套接字
ss -t state established # 所有已建立的TCP连接
ss -t state fin-wait-1 # 指定TCP状态
3. bridge 命令 (网桥管理)
替代brctl的现代网桥管理工具
核心操作:
# 创建网桥
ip link add name br0 type bridge
# 端口管理
ip link set eth0 master br0 # 添加端口到网桥
bridge link show # 显示网桥端口信息
# VLAN配置
bridge vlan add dev eth0 vid 100 # 添加VLAN 100
bridge vlan show # 显示VLAN配置
# MAC地址表管理
bridge fdb add 00:11:22:33:44:55 dev eth0 # 添加静态MAC
bridge fdb show # 显示MAC地址表
高级特性:
# 启用STP
ip link set dev br0 type bridge stp_state 1
# 设置网桥优先级
bridge vlan set dev br0 vid 100 priority 32768
用于管理 Linux 桥接功能,支持 VLAN、STP 等高级特性。
1. 核心子命令
| 子命令 | 功能 | 示例 |
|---|---|---|
| link | 桥接端口管理 | bridge link show |
| fdb | 转发数据库(MAC表) | bridge fdb show |
| vlan | VLAN 配置 | bridge vlan show |
| mdb | 组播数据库 | bridge mdb show |
2. VLAN 配置详解
# 查看端口VLAN配置
bridge vlan show dev eth0
# 添加VLAN
bridge vlan add vid 10 dev eth0
# 设置PVID
bridge vlan add vid 10 dev eth0 pvid
# 配置Trunk端口
bridge vlan add vid 10-20 dev eth0
# 删除VLAN
bridge vlan del vid 10 dev eth0
3. FDB (MAC地址表) 管理
# 添加静态MAC条目
bridge fdb add 00:11:22:33:44:55 dev eth0 master static
# 删除MAC条目
bridge fdb del 00:11:22:33:44:55 dev eth0
# 设置MAC老化时间
bridge link set dev eth0 ageing_time 300
4. 生成树协议(STP)配置
# 启用STP
bridge link set dev eth0 guard on
bridge link set dev br0 stp_state 1
# 设置优先级
bridge vlan set vid 10 dev eth0 priority 128
# 查看STP状态
bridge -d link show
4. tc 命令 (流量控制)
Linux QoS系统的核心工具,实现复杂流量整形
核心组件:
- qdisc (队列规则)
- class (流量类别)
- filter (流量分类器)
常用场景:
1. 简单限速(TBF令牌桶)
tc qdisc add dev eth0 root tbf \
rate 10mbit burst 32kbit latency 400ms
2. 优先级调度(HTB分层令牌桶)
# 创建HTB根队列
tc qdisc add dev eth0 root handle 1: htb default 20
# 创建父类(总带宽100Mbps)
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
# 创建子类(VOICE:30Mbps, VIDEO:50Mbps, DEFAULT:20Mbps)
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30mbit ceil 30mbit
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 50mbit ceil 50mbit
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 20mbit ceil 100mbit
# 附加公平队列(防止饿死)
tc qdisc add dev eth0 parent 1:10 sfq perturb 10
tc qdisc add dev eth0 parent 1:20 sfq perturb 10
3. 流量分类(基于源IP)
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip src 192.168.1.100 flowid 1:10
4. 网络模拟(netem)
# 添加100ms固定延迟
tc qdisc add dev eth0 root netem delay 100ms
# 添加随机丢包(10%)
tc qdisc add dev eth0 root netem loss 10%
# 添加抖动(100ms±20ms)
tc qdisc add dev eth0 root netem delay 100ms 20ms
监控命令:
tc -s qdisc show dev eth0 # 显示队列统计
tc -s class show dev eth0 # 显示类别统计
tc filter show dev eth0 # 显示过滤器
各命令对比表
| 命令 | 主要功能 | 关键特性 | 典型应用场景 |
|---|---|---|---|
ip | 全能网络配置 | 接口/路由/ARP/隧道/命名空间管理 | 基础网络配置、策略路由、容器网络 |
ss | 套接字监控与分析 | 实时连接状态、过滤能力、高性能 | 网络调试、服务监控、连接分析 |
bridge | 二层网桥管理 | VLAN支持、MAC学习、STP、VXLAN配置 | 虚拟化网络、SDN、容器网络 |
tc | 流量控制与QoS | 复杂整形、优先级调度、网络模拟 | 带宽管理、服务质量保障、网络测试 |
使用技巧:
- JSON输出:
ip -j link show | jq获取结构化数据 - 批量操作:
ip -batch < config.txt执行批量配置 - TC持久化:使用
tc-save和tc-restore保存配置 - SS过滤:组合使用
state和端口过滤精确诊断连接 - 网桥VLAN:
bridge vlan命令实现802.1Q VLAN过滤
💡 专业提示:生产环境建议通过
systemd-networkd或NetworkManager持久化配置,直接使用ip/tc命令的修改重启后会失效。
这些工具共同构成了Linux网络栈的完整控制平面,熟练掌握后可实现从基础网络配置到高级流量工程的各类需求。
ip 命令深度详解:Linux 网络管理的全能工具
ip 是 iproute2 工具集的核心命令,用于全面管理 Linux 网络栈。它通过统一的语法结构操作各种网络对象,取代了传统的 ifconfig、route、arp 等命令。
一、命令结构
ip [OPTIONS] OBJECT COMMAND [PARAMETERS]
- OBJECT:网络对象类型(
link,address,route,neigh,rule等) - COMMAND:操作类型(
show,add,del,set,flush等) - OPTIONS:
-4/-6:指定 IPv4/IPv6-s:显示统计信息-d:详细信息-j:JSON 格式输出-br:简化表格输出
二、核心对象详解
1. ip link - 网络接口管理
管理物理/虚拟网络接口(NIC)
常用命令:
# 显示所有接口
ip link show
ip -s link # 带统计信息
# 启用/禁用接口
ip link set eth0 up
ip link set wlan0 down
# 修改接口属性
ip link set eth0 mtu 9000
ip link set eth0 name wan0 # 重命名
ip link set eth0 promisc on # 混杂模式
# 创建虚拟接口
ip link add veth0 type veth peer name veth1 # 虚拟以太网对
ip link add bond0 type bond mode 802.3ad # 链路聚合
ip link add br0 type bridge # 网桥
2. ip address - IP 地址管理
管理接口的 IP 地址和协议配置
常用命令:
# 显示IP地址
ip address show
ip -4 addr # 仅IPv4
# 添加/删除IP
ip addr add 192.168.1.10/24 dev eth0
ip addr add 2001:db8::1/64 dev eth0
ip addr del 192.168.1.10/24 dev eth0
# 批量操作
ip addr flush dev eth0 # 清除所有IP
ip addr replace 10.0.0.2/24 dev eth0 # 替换现有IP
# 特殊地址
ip addr add 169.254.0.1/16 dev eth0 scope link # 链路本地地址
3. ip route - 路由表管理
管理内核路由表(IPv4/IPv6)
常用命令:
# 显示路由表
ip route show
ip -6 route # IPv6路由
# 添加/删除路由
ip route add 10.0.0.0/8 via 192.168.1.1
ip route add default via 192.168.1.1
ip route del 10.0.0.0/8
# 策略路由
ip route add 203.0.113.0/24 via 10.0.0.1 table 100
# 路由缓存
ip route get 8.8.8.8 # 查询到目标的路由路径
ip route flush cache # 刷新路由缓存
4. ip rule - 策略路由规则
基于策略的路由选择规则
常用命令:
# 显示规则
ip rule show
# 创建规则
ip rule add from 192.168.2.0/24 lookup 100
ip rule add to 10.1.0.0/16 lookup 200
ip rule add fwmark 0x1 lookup 300 # 防火墙标记
ip rule add iif eth0 lookup 400 # 入口接口
# 优先级管理
ip rule add pref 1000 from 192.168.3.0/24 lookup 500
5. ip neigh - ARP/NDP 邻居表管理
管理二层邻居缓存(ARP 表)
常用命令:
# 显示邻居表
ip neigh show
ip -s neigh # 带统计信息
# 管理静态条目
ip neigh add 192.168.1.5 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
ip neigh del 192.168.1.5 dev eth0
# 状态管理
ip neigh flush dev eth0 # 清除接口所有条目
ip neigh change 192.168.1.5 nud reachable dev eth0
三、高级功能
1. 多路由表管理
# 查看所有路由表
ip route show table all
# 向特定表添加路由
ip route add 0.0.0.0/0 via 10.0.0.1 table 100
# 配置路由表别名
echo "100 custom" >> /etc/iproute2/rt_tables
ip route show table custom
2. VRF 管理(虚拟路由转发)
# 创建VRF
ip link add vrf-blue type vrf table 10
# 关联接口
ip link set dev eth0 master vrf-blue
# 查看VRF
ip vrf show
3. 网络命名空间
# 创建命名空间
ip netns add ns1
# 在命名空间内执行命令
ip netns exec ns1 ip link show
# 移动接口到命名空间
ip link set veth1 netns ns1
4. 隧道管理
# GRE隧道
ip tunnel add gre1 mode gre remote 203.0.113.1 local 192.168.1.100 ttl 255
# VXLAN隧道
ip link add vxlan0 type vxlan id 42 dstport 4789 remote 203.0.113.2
四、实用技巧
1. 简化输出格式
ip -br link show
# 输出示例:
# lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
# eth0 UP 52:54:00:12:34:56 <BROADCAST,MULTICAST,UP,LOWER_UP>
2. JSON 格式输出
ip -j link show | jq '.[] | select(.operstate == "UP") | .ifname'
3. 批量配置
# config.txt 内容:
link set eth0 mtu 9000
address add 192.168.1.100/24 dev eth0
route add default via 192.168.1.1
# 执行配置
ip -batch -force < config.txt
4. 监控网络变化
# 实时监控链路状态
ip monitor link
# 监控路由变化
ip monitor route
5. 组合查询
# 查询到目标IP的完整路径
ip route get to 8.8.8.8 from 192.168.1.100 iif eth0
# 显示所有UP接口的IP
ip -o addr show | grep 'state UP' | awk '{print $2, $4}'
五、与 net-tools 对比表
| 功能 | net-tools | iproute2 (ip) |
|---|---|---|
| 显示接口 | ifconfig | ip link show |
| 配置IP | ifconfig eth0 192.168.1.1 | ip addr add 192.168.1.1/24 dev eth0 |
| 路由表 | route -n | ip route show |
| 添加路由 | route add -net 10.0.0.0/8 gw 192.168.1.1 | ip route add 10.0.0.0/8 via 192.168.1.1 |
| ARP表 | arp -an | ip neigh show |
| VLAN接口 | vconfig add eth0 100 | ip link add link eth0 name eth0.100 type vlan id 100 |
| 隧道接口 | iptunnel add gre1 mode gre ... | ip tunnel add gre1 mode gre ... |
专业提示:所有
ip命令修改都是临时的,持久化配置需使用:
- NetworkManager:
nmcli或nmtui- systemd-networkd:
.network文件- 发行版配置文件:
/etc/network/interfaces(Debian) 或/etc/sysconfig/network-scripts/(RHEL)
ip 命令是 Linux 网络管理的基石,掌握其用法对于系统管理员、网络工程师和 DevOps 专业人员至关重要。通过组合不同的 OBJECT 和 COMMAND,可以实现从基础配置到高级网络架构的所有操作。
ip 命令是 iproute2 工具集的核心,用于管理 Linux 内核的网络栈,功能远超陈旧的 ifconfig 和 route。它提供统一的接口配置、路由管理、邻居表(ARP)、策略路由、隧道、网络命名空间等功能。
核心优势:
- 统一强大: 单一命令管理网络各层(链路层、网络层)。
- 精细控制: 支持策略路由、多路由表、VLAN、VXLAN 等高级特性。
- 实时准确: 直接与内核网络子系统交互。
- 现代标准: 所有主流 Linux 发行版的标配网络配置工具。
基本语法:
ip [ OPTIONS ] OBJECT { COMMAND | help }
OBJECT: 指定要管理的对象类型(见下文详解)。COMMAND: 对对象执行的操作(show,add,del,set等)。help: 显示该对象的帮助信息(ip OBJECT help)。- 常用
OPTIONS:-s,-stats,-statistics: 显示详细统计信息。-d,-details: 显示更详细信息。-c,-color: 彩色输出(如果支持)。-4: 仅 IPv4。-6: 仅 IPv6。-b,-batch: 从文件或标准输入读取命令批量执行。-j,-json: JSON 格式输出(便于脚本解析)。-p,-pretty: 美化输出(常与-j结合)。
详解主要 OBJECT 及其常用 COMMAND:
1. ip link - 管理网络接口 (Link Layer - 数据链路层)
操作物理或虚拟网络接口(状态、MTU、MAC 地址、主从关系等)。
show: 显示所有或指定接口信息(默认命令)。ip link # 显示所有接口简要信息 ip link show # 同上 ip link show eth0 # 显示 eth0 详细信息 ip -s link show eth0 # 显示 eth0 详细信息及统计(收发包计数、错误等) ip -c link show # 彩色输出set: 修改接口属性。ip link set eth0 up # 启用接口 eth0 ip link set eth0 down # 禁用接口 eth0 ip link set eth0 mtu 9000 # 设置 eth0 的 MTU 为 9000 (Jumbo Frames) ip link set eth0 name wan0 # 将 eth0 重命名为 wan0 (需先 down) ip link set eth0 address aa:bb:cc:dd:ee:ff # 设置 MAC 地址 (需先 down) ip link set eth0 master br0 # 将 eth0 加入网桥/绑定 br0 (成为 Slave) ip link set eth0 nomaster # 将 eth0 从网桥/绑定中移除 ip link set eth0 promisc on # 开启混杂模式 (监听所有流量) ip link set eth0 txqueuelen 1000 # 设置发送队列长度add: 创建虚拟接口。ip link add eth0.10 link eth0 type vlan id 10 # 在 eth0 上创建 VLAN 接口 eth0.10 (ID 10) ip link add name br0 type bridge # 创建网桥接口 br0 ip link add name bond0 type bond mode 802.3ad # 创建链路聚合接口 bond0 (模式 LACP) ip link add name veth1 type veth peer name veth2 # 创建一对虚拟以太网接口 veth1 和 veth2 (用于容器/命名空间互联) ip link add name gre0 type gretap local 192.168.1.1 remote 192.168.2.1 # 创建 GRE 隧道接口del: 删除接口。ip link del eth0.10 # 删除 VLAN 接口 eth0.10 ip link del br0 # 删除网桥 br0 (需先移除所有 Slave 并 down)
2. ip address / ip addr - 管理 IP 地址 (Network Layer - 网络层)
配置接口的 IPv4/IPv6 地址、广播地址、作用域等。
show: 显示所有或指定接口的 IP 地址信息(默认命令)。ip addr # 显示所有接口的 IP 地址 ip addr show # 同上 ip addr show eth0 # 显示 eth0 的 IP 地址 ip -6 addr show # 仅显示 IPv6 地址 ip addr show dev br0 # 显示网桥 br0 的 IP 地址add: 添加 IP 地址。ip addr add 192.168.1.100/24 dev eth0 # 给 eth0 添加 IPv4 地址 ip addr add 2001:db8::1/64 dev eth0 # 给 eth0 添加 IPv6 地址 ip addr add 192.168.1.101/24 dev eth0 label eth0:0 # 添加辅助 IP 并设置标签 (eth0:0) ip addr add 192.168.1.255/24 brd + dev eth0 # 添加地址并设置广播地址 (使用 `+` 自动计算)del: 删除 IP 地址。ip addr del 192.168.1.100/24 dev eth0 # 从 eth0 删除指定 IPv4 地址 ip addr del 2001:db8::1/64 dev eth0 # 从 eth0 删除指定 IPv6 地址flush: 清除接口上的所有 IP 地址 (慎用!会断网!)。ip addr flush dev eth0 # 清除 eth0 上的所有 IP 地址 (IPv4 & IPv6) ip -4 addr flush dev eth0 # 清除 eth0 上的所有 IPv4 地址 ip -6 addr flush dev eth0 # 清除 eth0 上的所有 IPv6 地址
3. ip route - 管理 路由表
查看和操作内核的路由表。支持多路由表和策略路由。
show: 显示路由信息(默认命令)。ip route show # 显示主路由表 (table main) ip route list # 同上 ip route show table main # 显示主路由表 ip route show table local # 显示本地路由表 (广播地址、本机地址等) ip route show table 100 # 显示自定义路由表 100 ip route get 8.8.8.8 # 查询去往 8.8.8.8 的路由路径 (非常实用!) ip -6 route show # 显示 IPv6 路由add: 添加路由。ip route add 10.0.0.0/8 via 192.168.1.1 dev eth0 # 添加静态路由 (经 eth0 网关 192.168.1.1) ip route add default via 192.168.1.1 dev eth0 # 添加默认网关 ip route add 2001:db8:1::/64 via fe80::1%eth0 dev eth0 # 添加 IPv6 路由 (下一跳链路本地地址需指定接口 %eth0) ip route add 192.168.2.0/24 dev tun0 # 添加指向设备 tun0 的路由 (点对点隧道常用) ip route add 172.16.0.0/12 via 192.168.1.1 table 100 # 添加路由到自定义表 100 ip route add blackhole 203.0.113.0/24 # 添加黑洞路由 (丢弃匹配流量)replace/change: 替换或修改现有路由(语法同add)。del: 删除路由。ip route del 10.0.0.0/8 via 192.168.1.1 dev eth0 # 删除指定路由 ip route del default via 192.168.1.1 dev eth0 # 删除默认网关 ip route del 192.168.2.0/24 dev tun0 # 删除指向 tun0 的路由 ip route del 172.16.0.0/12 table 100 # 从表 100 中删除路由flush: 清除路由表 (慎用!会断网!)。ip route flush table main # 清除主路由表 ip route flush cache # 刷新路由缓存 (现代内核很少需要)
4. ip neighbour / ip neigh - 管理 邻居表 (ARP/NDISC 缓存)
查看和操作二层邻居发现缓存(IPv4 的 ARP 表,IPv6 的 NDISC 表)。
show: 显示邻居表信息(默认命令)。ip neigh show # 显示所有邻居条目 ip neigh show dev eth0 # 显示 eth0 上的邻居条目add: 添加静态邻居条目(永久 ARP)。ip neigh add 192.168.1.5 lladdr aa:bb:cc:dd:ee:ff dev eth0 nud perm # 添加永久条目change/replace: 修改现有条目(语法同add)。del: 删除邻居条目。ip neigh del 192.168.1.5 dev eth0 # 删除 eth0 上 192.168.1.5 的条目flush: 清除邻居表 (可能导致短暂通信中断)。ip neigh flush dev eth0 # 清除 eth0 上的所有邻居条目
5. ip rule - 管理 路由策略数据库 (策略路由)
定义基于源地址、目的地址、ToS、fwmark 等条件选择不同路由表的规则。实现复杂路由策略。
show: 显示当前策略规则(默认命令)。ip rule show # 输出示例: # 0: from all lookup local # 32766: from all lookup main # 32767: from all lookup defaultadd: 添加新规则。ip rule add from 192.168.2.0/24 table 100 # 源 IP 匹配 192.168.2.0/24 的流量查表 100 ip rule add to 10.10.0.0/16 table 200 # 目的 IP 匹配 10.10.0.0/16 的流量查表 200 ip rule add fwmark 0x1 table 300 # 防火墙标记 (fwmark) 为 1 的流量查表 300 (需 iptables/nftables 打标记) ip rule add pref 1000 table 400 # 添加优先级为 1000 的规则查表 400 (pref 越小优先级越高) ip rule add iif eth1 table 500 # 流入接口为 eth1 的流量查表 500del: 删除规则。ip rule del from 192.168.2.0/24 table 100 # 删除指定规则 ip rule del pref 1000 # 删除优先级为 1000 的规则
6. ip netns - 管理 网络命名空间
创建隔离的网络栈环境(容器、虚拟化基础)。
list: 列出所有网络命名空间。ip netns listadd: 创建命名空间。ip netns add ns1 # 创建名为 ns1 的网络命名空间delete: 删除命名空间。ip netns delete ns1 # 删除命名空间 ns1exec: 在命名空间中执行命令。ip netns exec ns1 ip link show # 在 ns1 中执行 `ip link show` ip netns exec ns1 bash # 在 ns1 中启动一个 bash shellmonitor: 监视命名空间事件 (较少用)。
7. 其他常用 OBJECT
ip maddress/ip maddr: 管理多播地址。ip tunnel: 管理隧道接口 (IPIP, GRE, SIT 等)。ip tuntap: 管理 TUN/TAP 设备 (用户态网络)。ip xfrm: 管理 IPSec 策略 (加密/认证)。ip monitor: 实时监视网络事件 (路由、邻居、地址变化等)。ip monitor all监视所有。ip -br: 简洁模式输出 (常用于脚本)。ip -br link,ip -br addr.
总结: ip 命令是现代 Linux 网络配置和故障排除的基石。掌握其核心对象 (link, addr, route, neigh, rule, netns) 及其常用操作 (show, add, del, set),你将能高效地管理各种网络场景,从简单的接口配置到复杂的策略路由和网络隔离。务必使用 man ip 和 ip OBJECT help 查阅详细手册。
ss 命令深度详解:Linux 网络套接字分析利器
ss (Socket Statistics) 是 iproute2 工具集的核心组件,用于实时监控和分析 Linux 系统的套接字连接。作为传统 netstat 的现代替代品,ss 直接读取内核数据结构,性能更高、信息更详细,是网络故障排查和性能分析的必备工具。
一、基础用法与核心选项
1. 命令格式
ss [选项] [过滤表达式]
2. 核心选项概览
| 选项 | 说明 | 示例 |
|---|---|---|
-t | 显示 TCP 套接字 | ss -t |
-u | 显示 UDP 套接字 | ss -u |
-w | 显示 RAW 套接字 | ss -w |
-x | 显示 UNIX 域套接字 | ss -x |
-a | 显示所有套接字(包括监听状态) | ss -ta |
-l | 仅显示监听状态套接字 | ss -tl |
-n | 禁用服务名解析(显示端口号) | ss -tn |
-p | 显示使用套接字的进程信息 | ss -tp |
-s | 显示套接字统计摘要 | ss -s |
-i | 显示 TCP 内部信息 | ss -ti |
-e | 显示详细套接字信息 | ss -te |
-m | 显示套接字内存使用情况 | ss -tm |
-o | 显示 TCP 计时器信息 | ss -to |
-H | 隐藏标题行 | ss -tH |
-4 | 仅显示 IPv4 套接字 | ss -t4 |
-6 | 仅显示 IPv6 套接字 | ss -t6 |
二、核心功能详解
1. 连接状态过滤(最强大功能)
使用 TCP 状态机状态进行精确过滤:
# 查看所有已建立的连接
ss -t state established
# 查看所有监听端口
ss -t state listening
# 查看所有 TIME-WAIT 状态的连接
ss -t state time-wait
# 查看 SYN-SENT 状态的连接(连接发起中)
ss -t state syn-sent
支持的所有 TCP 状态:
establishedsyn-sentsyn-recvfin-wait-1fin-wait-2time-waitclosedclose-waitlast-acklisteningallconnected(除 listening 和 closed 外的所有状态)
2. 高级过滤表达式
使用 BPF (Berkeley Packet Filter) 语法进行复杂过滤:
# 查看目标端口为 443 的 HTTPS 连接
ss -t 'dport = 443'
# 查看源 IP 为 192.168.1.100 的连接
ss -t 'src 192.168.1.100'
# 组合条件:源端口80或443
ss -t '( sport = :http or sport = :https )'
# 查看本地端口范围 8000-9000
ss -t 'sport gt 8000 and sport lt 9000'
3. 进程信息查看
# 显示进程信息和用户信息
ss -tup
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp ESTAB 0 0 192.168.1.100:ssh 203.0.113.5:64231 users:(("sshd",pid=1234,fd=3))
4. TCP 内部参数分析
# 显示 TCP 内部信息(cwnd, ssthresh, rtt 等)
ss -ti
输出示例:
ESTAB 0 0 192.168.1.100:ssh 203.0.113.5:64231
cubic wscale:8,7 rto:209 rtt:12.5/7.5 ato:40 cwnd:10 send 4.3Mbps rcv_space:14480
关键参数说明:
cwnd:拥塞窗口大小(数据包数量)ssthresh:慢启动阈值rtt:往返时间(平均/方差)rto:重传超时时间(毫秒)mss:最大分段大小rcv_space:接收窗口大小
5. 统计摘要
ss -s
输出示例:
Total: 189 (kernel 220)
TCP: 5 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 220 - -
RAW 0 0 0
UDP 4 2 2
TCP 5 3 2
INET 9 5 4
FRAG 0 0 0
三、高级应用场景
1. 服务监控与排障
# 查看所有监听端口及对应进程
ss -tlpn
# 检查特定服务是否监听(如 HTTP)
ss -tln 'sport = :http'
# 查看异常连接状态(大量 TIME-WAIT)
ss -t state time-wait | wc -l
2. 网络性能分析
# 查看接收队列积压的连接(可能性能瓶颈)
ss -t -e | awk '/Recv-Q/ && $2 > 0'
# 分析高延迟连接
ss -ti | grep 'rtt:.*ms' | sort -k5 -n
3. 安全审计
# 查看所有外部连接
ss -t | grep -v 192.168
# 检查异常进程的网络活动
ss -p | grep suspicious_process
4. 容器网络分析
# 查看容器命名空间的网络连接
nsenter -t <pid> -n ss -t
# 查看 Docker 容器的所有连接
docker exec <container> ss -t
5. 实时监控
# 每秒刷新 ESTABLISHED 连接
watch -n 1 "ss -t state established"
# 监控特定端口的连接变化
ss -t -H 'dport = :80' | ts '[%Y-%m-%d %H:%M:%S]'
6. 关闭占用端口的程序进程
在 Linux 中,ss 命令本身不能直接关闭程序,但可以结合其他命令终止占用端口的进程。以下是详细步骤:
方法一:使用 ss + kill(推荐)
# 1. 查找占用端口的进程ID (PID)
sudo ss -tulnp | grep ':80 ' | awk '{print $7}' | cut -d= -f2 | cut -d, -f1
# 2. 终止进程 (替换为实际 PID)
sudo kill <PID>
# 强制终止 (如果普通 kill 无效)
sudo kill -9 <PID>
方法二:单行命令(快速终止)
# 终止所有占用 80 端口的进程
sudo kill $(sudo ss -tulnp | grep ':80 ' | awk -F= '{print $3}' | cut -d, -f1)
关键步骤详解:
-
查找占用端口的 PID:
sudo ss -tulnp | grep ':80 '-tulnp:查看 TCP/UDP 监听端口和进程信息-
选项 说明 示例 -t显示 TCP 套接字 ss -t-u显示 UDP 套接字 ss -u-l仅显示监听状态套接字 ss -tl-n禁用服务名解析(显示端口号) ss -tn-p显示使用套接字的进程信息 ss -tp
-
grep ':80 ':过滤 80 端口(空格避免匹配 8080)- 示例输出:
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=1234,fd=6))
-
提取 PID:
awk '{print $7}' | cut -d= -f2 | cut -d, -f1- 从
users:(("nginx",pid=1234,fd=6))提取1234
- 从
-
终止进程:
sudo kill 1234 # 正常终止 sudo kill -9 1234 # 强制终止
完整操作示例:
# 查找并终止占用 80 端口的进程
port=80
pids=$(sudo ss -tulnp | grep ":$port " | awk -F= '{print $3}' | cut -d, -f1)
if [ -z "$pids" ]; then
echo "未找到占用 $port 端口的进程"
else
echo "终止进程: $pids"
sudo kill $pids
fi
替代方案:使用 fuser(更简单)
# 查看占用 80 端口的进程
sudo fuser 80/tcp
# 终止进程
sudo fuser -k 80/tcp
。
四、与 netstat 对比
| 功能 | netstat | ss | 优势说明 |
|---|---|---|---|
| 性能 | 较慢(遍历 /proc) | 极快(直接读内核) | 高负载服务器更适用 |
| TCP 状态过滤 | 不支持 | 原生支持 | 精确诊断连接问题 |
| TCP 内部参数 | 不支持 | 详细显示 | 网络性能优化必备 |
| BPF 过滤 | 不支持 | 完整支持 | 复杂查询更高效 |
| 进程信息 | 需要 -p | 更详细的进程信息 | 直接显示进程名和 PID |
| 输出格式 | 固定格式 | 可脚本解析 | 支持 JSON 输出 (-j) |
| IPv6 支持 | 需额外选项 | 原生支持 | 更简洁的工作流 |
| 维护状态 | 已弃用 | 积极维护 | 未来兼容性保证 |
五、专业技巧
-
JSON 输出(v5.1+)
ss -t -j | jq '.[] | select(.state == "ESTAB")' -
持续监控模式
# 实时监控 TCP 状态变化 ss -t -a -E -
内存使用分析
# 按内存使用排序套接字 ss -t -e -m | sort -k3 -n -
连接地理信息
# 结合 whois 查看连接来源 ss -tn | awk '{print $5}' | cut -d: -f1 | sort -u | xargs -I{} geoiplookup {} -
容器连接追踪
# 查找容器的所有网络连接 container_pid=$(docker inspect -f '{{.State.Pid}}' nginx) nsenter -t $container_pid -n ss -t
六、输出字段详解
典型 ss -tne 输出:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.100:22 203.0.113.5:64231
timer:(keepalive,1.120ms,0) uid:1000 ino:123456 sk:ffff888abc123456
关键字段:
Recv-Q:接收队列积压字节数Send-Q:发送队列积压字节数Local Address:Port:本地地址和端口Peer Address:Port:远端地址和端口timer:TCP 计时器类型和参数uid:套接字所属用户 IDino:套接字的 inode 号sk:套接字的内核内存地址
使用 ss 命令关闭占用端口的程序
ss 命令本身不能直接关闭程序,但它是识别占用端口进程的关键工具。以下是完整解决方案:
完整步骤:查找并终止占用端口的进程
1. 使用 ss 查找占用端口的进程
# 查找占用 8080 端口的进程
sudo ss -tulnp | grep ':8080'
| 选项 | 说明 | 示例 |
|---|---|---|
-t | 显示 TCP 套接字 | ss -t |
-u | 显示 UDP 套接字 | ss -u |
-l | 仅显示监听状态套接字 | ss -tl |
-n | 禁用服务名解析(显示端口号) | ss -tn |
-p | 显示使用套接字的进程信息 | ss -tp |
示例输出:
tcp LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("node",pid=12345,fd=21))
2. 从输出中提取 PID
# 提取 PID (12345)
sudo ss -tulnp | grep ':8080' | awk '{print $NF}' | cut -d= -f3 | cut -d, -f1
3. 终止进程
# 正常终止进程
sudo kill 12345
# 如果进程未响应,强制终止
sudo kill -9 12345
一键脚本:释放指定端口
创建脚本 free-port.sh:
#!/bin/bash
if [ -z "$1" ]; then
echo "Usage: $0 <port>"
exit 1
fi
PORT=$1
PID=$(sudo ss -tulnp "sport = :$PORT" | awk 'NR>1 {print $NF}' | cut -d= -f3 | cut -d, -f1)
if [ -z "$PID" ]; then
echo "No process found using port $PORT"
exit 0
fi
echo "Found process $PID using port $PORT"
sudo kill $PID && echo "Process terminated" || sudo kill -9 $PID && echo "Process force-terminated"
使用示例:
sudo ./free-port.sh 8080
进阶方法:按服务名终止进程
1. 使用服务名称关闭
# 查找使用端口的服务名
SERVICE=$(sudo ss -tulp "sport = :8080" | awk 'NR>1 {print $NF}' | cut -d\" -f2)
# 通过系统服务关闭
sudo systemctl stop $SERVICE
2. 处理多个进程占用同一端口
# 获取所有占用8080端口的PID
PIDS=$(sudo ss -tulnp "sport = :8080" | awk 'NR>1 {split($NF,a,/=|,/); print a[3]}' | sort -u)
# 终止所有相关进程
for PID in $PIDS; do
sudo kill $PID
done
替代方法:使用 fuser 命令
如果系统安装了 fuser,更简单的方法:
# 查看占用端口的进程
sudo fuser 8080/tcp
# 终止进程
sudo fuser -k 8080/tcp
验证端口是否释放
# 检查端口是否释放
sudo ss -tuln | grep ':8080'
# 或使用 netstat
sudo netstat -tuln | grep ':8080'
注意事项
-
权限问题:需要使用
sudo查看所有进程信息 -
服务管理:对于系统服务,优先使用
systemctl stop <service> -
谨慎操作:确保终止的是正确进程
-
端口范围:TCP/UDP 端口需要区分
# 指定协议 sudo ss -tulnp 'sport = :8080 and dport = :*' -
进程保护:某些关键进程(如数据库)可能需要特殊关闭流程
完整工作流示例
释放被占用的 3000 端口:
# 1. 查找占用进程
$ sudo ss -tulnp | grep ':3000'
tcp LISTEN 0 128 0.0.0.0:3000 0.0.0.0:* users:(("node",pid=4567,fd=18))
# 2. 终止进程
$ sudo kill 4567
# 3. 验证
$ sudo ss -tuln | grep ':3000' # 无输出表示成功
通过结合 ss 和其他 Linux 工具,你可以高效地识别并释放被占用的端口,解决常见的 "Address already in use" 问题。
bridge 命令详解:Linux 网桥管理利器
bridge 是 iproute2 工具集中用于管理二层以太网桥的专用命令,可替代传统的 brctl 工具。它提供更精细的控制,支持现代网络特性(如 VLAN 过滤、STP、VXLAN 等),是容器网络和虚拟化环境的核心工具。
一、基础命令结构
bridge [OPTIONS] OBJECT COMMAND [ARGUMENTS]
常用 OBJECT:
link:管理桥接端口fdb:管理 MAC 地址表(转发数据库)vlan:管理 VLAN 配置mdb:管理组播数据库vni:管理 VXLAN 网络标识符monitor:实时监控网桥事件
常用 OPTIONS:
-j:JSON 格式输出-d:详细信息模式-s:显示统计信息-c[color]:彩色输出(-c或-cc更丰富)-t:显示时间戳
二、核心功能详解
1. bridge link - 桥接端口管理
管理物理/虚拟接口与网桥的关联
# 显示所有桥接端口信息
bridge link show
# 显示特定接口的桥接状态
bridge link show dev eth0
# 设置端口属性
bridge link set dev eth0 cost 10 # STP路径成本
bridge link set dev eth0 priority 32 # STP端口优先级
bridge link set dev eth0 state 3 # 强制转发状态 (0:禁用, 1:监听, 2:学习, 3:转发)
bridge link set dev eth0 guard on # 启用BPDU guard
bridge link set dev eth0 hairpin on # 启用端口镜像
2. bridge fdb - MAC 地址表管理
管理网桥的 MAC 学习与转发
# 显示所有MAC表项
bridge fdb show
# 显示特定设备的MAC表
bridge fdb show dev br0
# 添加静态MAC表项
bridge fdb add 00:11:22:33:44:55 dev eth0 master static
# 添加本地永久条目(不转发)
bridge fdb add 00:11:22:33:44:55 dev eth0 local
# 删除MAC表项
bridge fdb del 00:11:22:33:44:55 dev eth0
# 带VLAN的静态条目
bridge fdb add 00:11:22:33:44:55 dev eth0 vlan 10 master static
3. bridge vlan - VLAN 管理
配置 802.1Q VLAN 过滤
# 显示所有VLAN配置
bridge vlan show
# 显示特定接口的VLAN
bridge vlan show dev eth0
# 添加VLAN成员
bridge vlan add dev eth0 vid 10 # 添加VLAN 10
bridge vlan add dev eth0 vid 20 pvid # 设为PVID(端口VLAN ID)
bridge vlan add dev eth0 vid 30 untagged # 不打标签
# 删除VLAN成员
bridge vlan del dev eth0 vid 10
# 配置网桥自身的VLAN
bridge vlan add dev br0 vid 10 self
4. bridge mdb - 组播管理
管理 IGMP/MLD 监听组播组
# 显示组播组信息
bridge mdb show
# 添加静态组播组
bridge mdb add dev br0 port eth0 grp 239.1.2.3 permanent
# 删除组播组
bridge mdb del dev br0 port eth0 grp 239.1.2.3
三、完整网桥配置示例
1. 创建基本网桥
# 创建网桥设备
ip link add name br0 type bridge
# 启用网桥
ip link set br0 up
# 添加端口到网桥
ip link set eth0 master br0
ip link set eth1 master br0
# 设置STP参数
ip link set br0 type bridge stp_state 1
ip link set br0 type bridge forward_delay 1500
2. 配置 VLAN 感知网桥
# 启用VLAN过滤
ip link set br0 type bridge vlan_filtering 1
# 配置端口VLAN
bridge vlan add dev eth0 vid 10 pvid untagged
bridge vlan add dev eth0 vid 20
bridge vlan add dev eth1 vid 10
bridge vlan add dev eth1 vid 20 pvid untagged
# 配置网桥自身VLAN
bridge vlan add dev br0 vid 10 self
bridge vlan add dev br0 vid 20 self
3. 私有 VLAN (PVLAN) 配置
# 创建主VLAN 100
bridge vlan add dev eth0 vid 100
bridge vlan add dev br0 vid 100 self
# 创建隔离VLAN 200
bridge vlan add dev eth1 vid 200 pvid
bridge vlan add dev eth1 vid 100 isolated
# 创建团体VLAN 300
bridge vlan add dev eth2 vid 300 pvid
bridge vlan add dev eth2 vid 100 community
四、监控与诊断
1. 实时监控网桥事件
bridge monitor [fdb|link|vlan|mdb] # 监控特定对象
bridge monitor all # 监控所有事件
2. 查看详细统计信息
bridge -s link show # 端口统计
bridge -s fdb show # MAC表操作统计
bridge -c vlan show # 彩色显示VLAN配置
3. 生成树协议 (STP) 状态
# 查看STP摘要
bridge -j link show | jq '.[] | {ifname, stp_state}'
# 安装额外工具查看详细STP状态
sudo apt install bridge-utils
brctl showstp br0
五、高级特性
1. VXLAN 集成
# 创建VXLAN接口
ip link add vxlan0 type vxlan id 42 dstport 4789
# 加入网桥
ip link set vxlan0 master br0
# 配置VXLAN的VNI映射
bridge vni add dev br0 vni 42
2. 端口保护配置
# 启用根保护
bridge link set dev eth0 root_block on
# 启用BPDU过滤
bridge link set dev eth0 bpdufilter on
# 设置MAC学习限制
bridge link set dev eth0 learning_limit 100
3. EVPN 集成
# 配置MAC-VRF
bridge link set dev br0 vlan_tunnel on
# 添加VXLAN到EVPN
bridge fdb add 00:11:22:33:44:55 dev vxlan0 dst 192.168.1.100 vni 42 self permanent
六、与传统 brctl 对比
| 功能 | brctl | bridge |
|---|---|---|
| 创建网桥 | brctl addbr br0 | ip link add br0 type bridge |
| 添加端口 | brctl addif br0 eth0 | ip link set eth0 master br0 |
| 删除端口 | brctl delif br0 eth0 | ip link set eth0 nomaster |
| 显示网桥 | brctl show | bridge link show |
| STP 控制 | brctl stp br0 on | ip link set br0 type bridge stp_state 1 |
| VLAN 支持 | 有限(需 vconfig) | 原生支持 |
| MAC 表管理 | brctl showmacs br0 | bridge fdb show |
| 组播管理 | 不支持 | 完整支持 |
| JSON 输出 | 不支持 | 支持 |
七、实用技巧
1. 批量配置脚本
#!/bin/bash
BR="br0"
PORTS="eth0 eth1"
# 创建网桥
ip link add $BR type bridge
ip link set $BR up
# 添加端口
for port in $PORTS; do
ip link set $port up
ip link set $port master $BR
bridge link set dev $port state 3 # 强制转发状态
done
# 启用VLAN过滤
ip link set $BR type bridge vlan_filtering 1
2. 端口镜像 (SPAN)
# 创建镜像端口
ip link add name mirror0 type bridge
# 配置镜像源和目标
bridge link set dev eth0 monitor on
tc qdisc add dev mirror0 ingress
tc filter add dev mirror0 parent ffff: matchall action mirred egress mirror dev eth0
3. MAC 地址过滤
# 拒绝特定MAC
bridge fdb add 00:11:22:33:44:55 dev eth0 master static deny
# 仅允许白名单MAC
bridge fdb flush dev eth0
bridge fdb add 00:11:22:33:44:55 dev eth0 master static
bridge link set dev eth0 learning 0 # 关闭MAC学习
4. 网络命名空间桥接
# 创建命名空间
ip netns add ns1
# 创建veth对
ip link add veth0 type veth peer name veth1
# 将veth1放入命名空间
ip link set veth1 netns ns1
# 将veth0加入网桥
ip link set veth0 master br0
八、故障排查命令
# 检查VLAN过滤状态
bridge vlan show
# 查看STP阻塞端口
bridge -c link show | grep "state 0"
# 检查MAC学习异常
bridge -s fdb show | grep "learning"
# 查看组播组状态
bridge mdb show
# 实时监控FDB变化
bridge monitor fdb
bridge 命令提供了对 Linux 网桥的精细控制,特别适合容器网络、SDN 和虚拟化环境。结合 ip 和 tc 命令,可实现完整的 L2-L7 网络管理能力。
iproute2 bridge 命令详解
bridge 是 iproute2 工具集中专门用于管理 Linux 内核网桥的命令,它取代了旧的 brctl 工具,提供了更强大的功能,尤其在 VLAN 支持方面表现突出。Linux 网桥实现了二层交换功能,用于连接多个网络接口。
基本语法
bridge [OPTIONS] OBJECT COMMAND
常用 OBJECT:
link:管理网桥端口fdb:管理 MAC 转发数据库mdb:管理多播组数据库vlan:管理 VLAN 配置vni:管理 VXLAN 配置
常用 OPTIONS:
-d:详细输出-s:显示统计信息-j:JSON 格式输出-p:美化输出
核心功能详解
1. bridge link - 管理网桥端口
管理连接到网桥的物理/虚拟接口(端口)。
# 查看所有网桥端口信息
bridge link show
# 查看指定网桥的端口
bridge link show dev br0
# 设置端口属性
bridge link set dev eth0 cost 50 # 设置STP路径开销
bridge link set dev eth0 priority 32 # 设置STP端口优先级
bridge link set dev eth0 state blocked # 手动设置端口状态
端口状态说明:
forwarding:正常转发数据blocked:阻塞状态(STP)disabled:禁用状态learning:学习MAC地址
2. bridge vlan - VLAN 管理(核心功能)
重要提示: 使用 VLAN 功能前,必须在网桥上启用 VLAN 过滤:
ip link set dev br0 type bridge vlan_filtering 1
VLAN 端口配置
# 添加 VLAN 到端口
bridge vlan add dev eth0 vid 10 pvid untagged
# 参数说明:
# vid <VLAN_ID> : VLAN ID
# pvid : 设置为端口的默认 VLAN
# untagged : 该 VLAN 流量出端口时去掉标签
# tagged : 保留 VLAN 标签(默认)
# 删除端口的 VLAN
bridge vlan del dev eth0 vid 20
# 查看 VLAN 配置
bridge vlan show
示例配置:
# 端口 eth0:
# - VLAN 10 作为默认 VLAN (PVID),untagged
# - VLAN 20 作为 tagged VLAN
bridge vlan add dev eth0 vid 10 pvid untagged
bridge vlan add dev eth0 vid 20
# 端口 eth1:
# - VLAN 20 作为默认 VLAN (PVID),untagged
# - VLAN 10 作为 tagged VLAN
bridge vlan add dev eth1 vid 20 pvid untagged
bridge vlan add dev eth1 vid 10
3. bridge fdb - MAC 地址表管理
管理网桥的 MAC 地址转发表(FDB)。
# 查看 MAC 地址表
bridge fdb show
# 添加静态 MAC 条目
bridge fdb add aa:bb:cc:dd:ee:ff dev eth0 vlan 10 static
# 删除 MAC 条目
bridge fdb del aa:bb:cc:dd:ee:ff dev eth0
# 刷新 MAC 表(谨慎使用!)
bridge fdb flush dev br0
MAC 条目标志:
static:静态条目(不会老化)self:网桥自身的 MAC 地址master:通过端口学习到的 MACrouter:路由器 MAC 地址
4. bridge mdb - 多播组管理
管理网桥的多播组转发表(MDB)。
# 查看多播组
bridge mdb show
# 添加多播组条目
bridge mdb add dev br0 port eth0 grp 01:00:5e:00:00:01 permanent
# 删除多播组条目
bridge mdb del dev br0 port eth0 grp 01:00:5e:00:00:01
5. 网桥全局配置(使用 ip link)
网桥本身的配置需要通过 ip link 命令完成:
# 创建网桥
ip link add name br0 type bridge
# 启用网桥
ip link set br0 up
# 设置网桥参数
ip link set dev br0 type bridge \
stp_state 1 \ # 启用STP
forward_delay 1500 \ # 转发延迟(ms)
hello_time 200 \ # Hello包间隔(ms)
max_age 2000 # 最大老化时间(ms)
# 添加端口到网桥
ip link set dev eth0 master br0
ip link set dev eth1 master br0
# 从网桥移除端口
ip link set dev eth0 nomaster
完整配置示例:带 VLAN 的网桥
# 1. 创建网桥并启用 VLAN 过滤
ip link add name br0 type bridge
ip link set dev br0 type bridge vlan_filtering 1
ip link set br0 up
# 2. 添加物理接口到网桥
ip link set dev eth0 master br0
ip link set dev eth1 master br0
# 3. 配置端口 VLAN
# eth0: VLAN 10 (untagged), VLAN 20 (tagged)
bridge vlan add dev eth0 vid 10 pvid untagged
bridge vlan add dev eth0 vid 20
# eth1: VLAN 20 (untagged), VLAN 10 (tagged)
bridge vlan add dev eth1 vid 20 pvid untagged
bridge vlan add dev eth1 vid 10
# 4. 创建 VLAN 虚拟接口
ip link add link br0 name br0.10 type vlan id 10
ip link add link br0 name br0.20 type vlan id 20
# 5. 配置 IP 地址
ip addr add 192.168.10.1/24 dev br0.10
ip addr add 192.168.20.1/24 dev br0.20
ip link set br0.10 up
ip link set br0.20 up
# 6. 验证配置
bridge vlan show
bridge fdb show
常见问题排查
-
VLAN 不工作:
# 检查 VLAN 过滤是否启用 ip -d link show br0 | grep vlan_filtering # 检查端口 VLAN 配置 bridge vlan show -
STP 问题:
# 查看端口状态 bridge link show | grep -E 'state|cost' # 检查网桥 STP 设置 ip -d link show br0 | grep stp -
MAC 地址表问题:
# 查看 MAC 地址表 bridge -s fdb show # 检查老化时间 ip -d link show br0 | grep ageing_time
总结
bridge 命令是管理 Linux 网桥的核心工具,特别在以下场景中必不可少:
- 配置带 VLAN 的复杂网络拓扑
- 管理 MAC 地址转发表
- 实现多播网络
- 网络虚拟化环境(容器、虚拟机网络)
关键优势:
- 完整的 VLAN 支持(PVID、tagged/untagged)
- 精细的 MAC 地址表控制
- 直接操作内核数据结构,高效可靠
- 与
ip link命令无缝配合
掌握 bridge 命令对于构建复杂网络拓扑、实现网络隔离和优化网络性能至关重要,特别是在虚拟化环境和云基础设施中。
iproute2 tc 命令详解:Linux 流量控制终极指南
tc (Traffic Control) 是 Linux 系统中最强大的网络流量控制工具,属于 iproute2 套件的一部分。它允许管理员实现精细的 QoS(服务质量)策略,包括流量整形、调度、限速和优先级管理。
核心概念
1. Qdisc (Queueing Discipline)
- 队列规则,决定数据包如何排队和发送
- 类型:
- 无类 Qdisc:简单队列(pfifo_fast, tbf, sfq)
- 有类 Qdisc:支持流量分类(HTB, CBQ, PRIO)
2. Class
- 存在于有类 Qdisc 中
- 代表特定流量类别
- 可包含子类和子 Qdisc
3. Filter
- 流量分类器,决定数据包属于哪个 Class
- 分类依据:IP 地址、端口、协议、防火墙标记等
4. 流量控制层次结构
[ Root Qdisc ]
|
|-- [ Class 1:1 ] --- [ Leaf Qdisc ]
| |
| |-- [ Subclass 1:10 ]
| |-- [ Subclass 1:20 ]
|
|-- [ Filter ] (将流量导向特定 Class)
基本语法
tc [ OPTIONS ] OBJECT COMMAND [ dev DEVICE ]
常用 OBJECT:
qdisc: 管理队列规则class: 管理流量类filter: 管理流量过滤器action: 高级操作(限速器、采样等)
常用 COMMAND:
add: 添加新对象delete: 删除对象change: 修改现有对象replace: 替换对象show: 显示配置
常用 Qdisc 详解
1. HTB (Hierarchical Token Bucket)
最常用的流量整形器,支持分层带宽分配
# 创建根 HTB Qdisc
tc qdisc add dev eth0 root handle 1: htb default 30
# 创建主类 (总带宽)
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
# 创建子类 (保证带宽 + 最大带宽)
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30mbit ceil 50mbit
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 20mbit ceil 40mbit
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 50mbit ceil 100mbit
# 为子类添加叶 Qdisc (SFQ 用于公平排队)
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10
HTB 参数:
rate: 保证带宽ceil: 最大可用带宽burst: 令牌桶大小cburst: 承诺突发大小quantum: 每次轮询服务的数据量
2. TBF (Token Bucket Filter)
简单高效的流量整形器
# 限制出口带宽为 10Mbps
tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms
TBF 参数:
rate: 目标速率burst: 桶大小(允许突发)latency: 最大延迟peakrate: 峰值速率mtu: 最大传输单元
3. SFQ (Stochastic Fairness Queueing)
随机公平队列,防止单一流独占带宽
tc qdisc add dev eth0 parent 1:10 sfq perturb 10 quantum 1514
SFQ 参数:
perturb: 哈希算法重置间隔(秒)quantum: 每次轮询服务的数据量limit: 队列最大包数
4. PRIO (Priority Queueing)
优先级调度器
tc qdisc add dev eth0 root handle 1: prio bands 3
# 为每个优先级带添加叶 Qdisc
tc qdisc add dev eth0 parent 1:1 handle 10: sfq
tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 5mbit burst 32k
tc qdisc add dev eth0 parent 1:3 handle 30: sfq
流量过滤器 (Filter)
1. u32 过滤器
基于包头的任意字段进行匹配
# 匹配目标端口 80 (HTTP)
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 \
match ip dport 80 0xffff flowid 1:10
# 匹配源 IP 192.168.1.0/24
tc filter add dev eth0 protocol ip parent 1: prio 2 u32 \
match ip src 192.168.1.0/24 flowid 1:20
2. fw 过滤器
基于防火墙标记
# 用 iptables 打标记
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1
# 用 fw 过滤器分类
tc filter add dev eth0 parent 1: protocol ip prio 3 handle 1 fw flowid 1:30
3. 基本匹配器 (Basic Matcher)
简单匹配条件组合
tc filter add dev eth0 parent 1: protocol ip prio 4 basic \
match 'cmp(u16 at 0 layer transport eq 22)' flowid 1:10
监控与统计
# 查看所有 Qdisc
tc -s qdisc show dev eth0
# 查看所有 Class
tc -s class show dev eth0
# 查看所有 Filter
tc filter show dev eth0
# 查看 HTB 详细统计
tc -s -d class show dev eth0
关键统计指标:
Sent: 已发送字节/包Rate: 当前速率Ceil: 最大速率Borrows: 借用带宽次数Lends: 借出带宽次数Drops: 丢包数
高级功能
入口流量控制 (Ingress Policing)
# 添加入口 Qdisc
tc qdisc add dev eth0 handle ffff: ingress
# 添加入口限速器 (限速 10Mbps)
tc filter add dev eth0 parent ffff: protocol ip prio 1 u32 \
match ip src 0.0.0.0/0 police rate 10mbit burst 32k drop flowid :1
Police 参数:
rate: 允许的速率burst: 突发大小drop/mark: 超限时动作conform-exceed: 不同动作策略
流量镜像 (Mirroring)
# 将 eth0 的流量镜像到 eth1
tc filter add dev eth0 parent 1: protocol ip prio 10 u32 \
match ip src 192.168.1.0/24 action mirred egress mirror dev eth1
采样 (Sampling)
# 每100个包采样1个发送到监控端口
tc filter add dev eth0 parent 1: protocol ip prio 20 u32 \
match ip src 0.0.0.0/0 action sample rate 100 group 1
综合示例:企业级 QoS 策略
# 1. 创建根 HTB
tc qdisc add dev eth0 root handle 1: htb default 40
# 2. 创建主类 (总带宽1Gbps)
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit ceil 1000mbit
# 3. 创建子类
# 关键业务 (30%)
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 300mbit ceil 500mbit prio 0
# 普通业务 (40%)
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 400mbit ceil 800mbit prio 1
# 默认业务 (30%)
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 300mbit ceil 1000mbit prio 2
# 低优先级业务
tc class add dev eth0 parent 1:1 classid 1:40 htb rate 100mbit ceil 200mbit prio 3
# 4. 添加叶 Qdisc
for i in 10 20 30 40; do
tc qdisc add dev eth0 parent 1:$i handle ${i}0: sfq perturb 10
done
# 5. 添加过滤器
# VoIP (最高优先级)
tc filter add dev eth0 parent 1: prio 1 u32 \
match ip dport 5060 0xffff flowid 1:10
match ip protocol 17 0xff flowid 1:10 \
match u16 0xb800 0xffff at -4
# 视频会议
tc filter add dev eth0 parent 1: prio 2 u32 \
match ip dport 1935 0xffff flowid 1:10 # RTMP
# 关键业务应用
tc filter add dev eth0 parent 1: prio 3 u32 \
match ip dport 3306 0xffff flowid 1:20 # MySQL
match ip dport 5432 0xffff flowid 1:20 # PostgreSQL
# 低优先级流量 (P2P)
tc filter add dev eth0 parent 1: prio 10 u32 \
match ip dport 6881 0xffff flowid 1:40 # BitTorrent
match ip dport 4662 0xffff flowid 1:40 # eMule
# 6. 监控配置
watch -n 1 "tc -s class show dev eth0"
调试与排错
-
查看内核日志
dmesg | grep tc -
模拟流量测试
# 生成测试流量 iperf3 -c server -p 80 -t 60 # HTTP iperf3 -c server -u -p 5060 -b 1M # VoIP -
检查配置层次
tc -p -graph qdisc show dev eth0 -
常见错误解决
- "RTNETLINK answers: Invalid argument": 参数错误
- "No such file or directory": 对象不存在
- "Operation not supported": 内核模块未加载
最佳实践
- 分层设计:从简单到复杂逐步构建策略
- 监控驱动:基于实际流量调整参数
- 标记优先:使用防火墙标记简化分类
- 文档化:记录所有策略和参数
- 测试验证:在生产环境前充分测试
- 自动化:使用脚本管理复杂配置
性能优化技巧
-
使用
ifb虚拟设备处理入口流量modprobe ifb ip link set dev ifb0 up tc qdisc add dev eth0 ingress tc filter add dev eth0 parent ffff: u32 match u32 0 0 action mirred egress redirect dev ifb0 -
HTB 参数优化
tc class add ... htb rate 100mbit ceil 100mbit burst 1m cburst 2m quantum 1514 -
选择合适叶 Qdisc
- 高吞吐量:
fq_codel - 低延迟:
pfifo_fast - 公平性:
sfq
- 高吞吐量:
-
离线计算参数
burst = rate * (latency / 1000) / 8 quantum = MTU * 10
总结
tc 是 Linux 网络工程师的终极武器,掌握它意味着:
- 精确控制网络带宽分配
- 保障关键应用服务质量
- 实现复杂流量工程策略
- 优化网络性能与资源利用
虽然学习曲线陡峭,但投入时间掌握 tc 将在网络管理、云计算、CDN 优化等领域带来巨大回报。从简单限速开始,逐步探索分层 QoS、流量整形和高级过滤,最终构建出满足任何业务需求的网络流量控制系统。
tc 命令详解:Linux 流量控制终极指南
tc (Traffic Control) 是 iproute2 工具集中用于网络流量整形、调度和策略控制的核心命令。它实现了 Linux 内核的 QoS (Quality of Service) 系统,允许对网络流量进行精细控制,是构建高性能网络和解决拥塞问题的关键工具。
一、核心概念体系
1. 三大基础组件
| 组件 | 作用 | 示例 |
|---|---|---|
| qdisc | 队列规则 - 流量调度核心机制 | HTB, TBF, SFQ, Netem |
| class | 流量类别 - 划分不同优先级/带宽类别 | 1:1, 1:10, 1:20 |
| filter | 分类器 - 将流量分配到特定 class | u32, fwmark, route |
2. 流量控制层级
[ root qdisc ]
|
|-- [ class 1:1 ]
| |
| |-- [ leaf qdisc 1:10 ] (e.g., SFQ)
|
|-- [ class 1:2 ]
|
|-- [ leaf qdisc 1:20 ]
二、命令结构详解
tc [ OPTIONS ] OBJECT COMMAND [ PARAMETERS ]
常用 OBJECT:
qdisc:管理队列规则class:管理流量类别filter:管理流量分类器action:管理过滤器动作
核心 OPTIONS:
-s:显示统计信息-d:显示详细信息-p:人性化显示速率值-j:JSON 格式输出-stats:显示历史统计
三、队列规则 (qdisc) 详解
1. 常用 qdisc 类型
| 类型 | 作用 | 适用场景 |
|---|---|---|
| HTB | 分层令牌桶 - 精确带宽控制 | 多级带宽分配 |
| TBF | 令牌桶过滤器 - 简单限速 | 单级限速 |
| SFQ | 随机公平队列 - 防止流饥饿 | P2P/多连接场景 |
| Netem | 网络模拟器 - 模拟网络特性 | 测试延迟/丢包 |
| PRIO | 优先级队列 - 简单优先级调度 | VoIP/游戏流量优先 |
| FQ_Codel | 公平队列+拥塞控制 - 现代AQM算法 | 高拥塞场景 |
2. qdisc 管理命令
# 添加根队列
tc qdisc add dev eth0 root handle 1: htb default 30
# 添加子队列
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
# 替换现有队列
tc qdisc replace dev eth0 root netem delay 100ms
# 删除队列
tc qdisc del dev eth0 root
# 显示队列
tc -s qdisc show dev eth0
四、流量类别 (class) 配置
1. HTB 类别配置示例
# 创建父类 (总带宽100Mbps)
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
# 创建子类 (限速30Mbps,最大50Mbps)
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30mbit ceil 50mbit burst 15k cburst 15k
# 创建默认类
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 10mbit ceil 100mbit
2. 关键参数解析
rate:保证带宽ceil:最大可用带宽burst:突发缓冲区大小prio:优先级 (数值越小优先级越高)quantum:每次调度分配的字节数
五、过滤器 (filter) 配置
1. 常用分类器
| 分类器 | 匹配依据 | 示例 |
|---|---|---|
| u32 | 包头任意字段 | IP/TCP/UDP 头字段 |
| fw | 防火墙标记 (iptables MARK) | 结合 iptables 使用 |
| route | 路由表 | 根据路由结果分类 |
| cgroup | cgroup 控制组 | 容器环境流量控制 |
2. 过滤器配置示例
# 基于源IP分类
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 \
match ip src 192.168.1.0/24 flowid 1:10
# 基于目标端口分类
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 \
match ip dport 80 0xffff flowid 1:20
# 基于防火墙标记
tc filter add dev eth0 parent 1: protocol ip prio 3 handle 1 fw flowid 1:30
六、实战配置示例
1. 企业级带宽分配
# 创建HTB根队列
tc qdisc add dev eth0 root handle 1: htb default 40
# 创建父类 (总带宽1Gbps)
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit
# 创建子类 - VOIP (高优先级)
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 100mbit ceil 200mbit prio 1
tc qdisc add dev eth0 parent 1:10 sfq quantum 1514b perturb 10
# 创建子类 - 视频会议
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 300mbit ceil 600mbit prio 2
tc qdisc add dev eth0 parent 1:20 fq_codel limit 1000 flows 1024
# 创建子类 - 普通流量
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 200mbit ceil 800mbit prio 3
tc qdisc add dev eth0 parent 1:30 sfq
# 默认类 - 背景流量
tc class add dev eth0 parent 1:1 classid 1:40 htb rate 50mbit ceil 100mbit prio 4
tc qdisc add dev eth0 parent 1:40 netem delay 50ms
# 分类规则
tc filter add dev eth0 parent 1: prio 1 u32 match ip dport 5060 0xffff flowid 1:10 # SIP
tc filter add dev eth0 parent 1: prio 2 u32 match ip tos 0xb8 0xff flowid 1:20 # DSCP EF
tc filter add dev eth0 parent 1: prio 3 u32 match ip src 10.0.0.0/24 flowid 1:30
2. 网络模拟 (Netem)
# 基础延迟
tc qdisc add dev eth0 root netem delay 100ms
# 随机丢包
tc qdisc add dev eth0 root netem loss 5%
# 丢包相关性 (连续丢包)
tc qdisc add dev eth0 root netem loss 5% 25%
# 包重复
tc qdisc add dev eth0 root netem duplicate 3%
# 包损坏
tc qdisc add dev eth0 root netem corrupt 2%
# 包乱序
tc qdisc add dev eth0 root netem delay 50ms reorder 25% 50%
3. 入口流量控制 (Ingress Policer)
# 添加ingress qdisc
tc qdisc add dev eth0 handle ffff: ingress
# 限速入口流量为10Mbps
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 \
police rate 10mbit burst 10k drop flowid :1
七、监控与诊断
1. 查看统计信息
tc -s qdisc show dev eth0
tc -s class show dev eth0
tc -s filter show dev eth0
2. 关键监控指标
| 指标 | 含义 | 问题指示 |
|---|---|---|
sent | 发送的字节数/包数 | - |
dropped | 丢弃的包数量 | 拥塞/配置过严 |
overlimits | 超过限制的次数 | 突发配置过小 |
requeues | 重新排队次数 | 调度问题 |
backlog | 当前队列积压 | 瞬时拥塞 |
lended | (HTB) 借用带宽的包数 | 带宽不足 |
3. 实时监控工具
# 安装tc监控工具
sudo apt install bmon iftop nload
# 使用bmon
bmon -o format:fmt='$(element:name) $(attr:txrate:bytes)'
八、高级技巧
1. cgroup 集成 (容器环境)
# 创建cgroup
mkdir /sys/fs/cgroup/net_cls/container1
echo 0x1001 > /sys/fs/cgroup/net_cls/container1/net_cls.classid
# tc过滤器
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 1: cgroup
2. 负载均衡多WAN
# 创建HTB根
tc qdisc add dev eth0 root handle 1: htb
# 为每个WAN创建类
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1: classid 1:2 htb rate 100mbit
# 创建过滤器 (基于源IP哈希)
tc filter add dev eth0 parent 1: prio 1 protocol ip u32 \
match u32 0 0 flowid 1:1 hashkey mask 0x000f at 12 divisor 2
# 添加路由标记
ip rule add fwmark 1 table 1
ip rule add fwmark 2 table 2
3. 动态带宽调整
# 创建带宽调整脚本
#!/bin/bash
BW=$1
tc class change dev eth0 parent 1: classid 1:10 htb rate ${BW}mbit ceil ${BW}mbit
4. 结合 eBPF
# 附加eBPF程序分类
tc filter add dev eth0 parent 1: bpf obj classifier.o flowid 1:10
九、常见问题解决
1. 配置不生效
# 检查现有qdisc
tc qdisc show
# 删除现有配置
tc qdisc del dev eth0 root
# 检查内核模块
lsmod | grep sch_
2. 带宽控制不准确
- 增加 burst/cburst 值
- 检查物理链路带宽 (ethtool eth0)
- 使用更精确的 qdisc (如 FQ_Codel)
3. CPU 使用率高
- 避免复杂 u32 匹配
- 使用 fwmark 替代
- 减少小包处理 (增加 quantum)
十、tc 与 iptables 集成
# 标记SSH流量
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 10
# 基于标记分类
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 10 fw flowid 1:10
十一、持久化配置
# 保存配置
tc qdisc save dev eth0 > /etc/tc.conf
# 系统启动加载
echo "tc qdisc restore < /etc/tc.conf" >> /etc/rc.local
# 使用systemd服务
[Unit]
Description=Traffic Control
[Service]
ExecStart=/sbin/tc -f /etc/tc.conf
[Install]
WantedBy=multi-user.target
tc 是 Linux 网络工程师的高级武器库,从简单的带宽限制到复杂的 QoS 策略都能胜任。掌握其原理和配置技巧,可有效解决网络拥塞、优化应用性能,并为关键业务提供服务质量保障。对于云环境、实时系统和电信级应用,tc 是实现高级流量工程的基石工具。
iproute2 详解:Linux 网络管理的终极工具集
iproute2 是现代 Linux 系统的网络配置核心套件,它彻底取代了传统的 net-tools(ifconfig/route/arp 等工具),提供更强大、更一致的操作接口。以下从架构设计到实际应用进行全面解析:
一、iproute2 架构与设计哲学
核心组件关系
graph TD
A[iproute2套件] --> B[核心命令 ip]
A --> C[辅助工具 ss]
A --> D[辅助工具 bridge]
A --> E[辅助工具 tc]
B --> F[对象子系统]
F --> G[link 接口管理]
F --> H[address IP地址]
F --> I[route 路由表]
F --> J[neigh ARP/NDISC]
F --> K[rule 策略路由]
F --> L[tunnel 隧道]
设计特点:
- 统一语法结构:
ip [OPTIONS] OBJECT COMMAND - 直接内核通信:通过 Netlink 接口操作内核网络栈
- 模块化设计:各网络对象(link/addr/route)独立操作
- 支持现代特性:网络命名空间、VRF、XDP 等
二、核心对象操作详解
1. 接口管理 (ip link)
# 创建虚拟接口
ip link add veth0 type veth peer name veth1
# 设置接口属性
ip link set dev eth0 mtu 9000 txqueuelen 1000
# VLAN 接口操作
ip link add link eth0 name eth0.100 type vlan id 100
# 接口状态监控
ip -s -s link show eth0 # 双-s显示详细统计
2. 地址管理 (ip address)
# 添加主IP和别名IP
ip addr add 192.168.1.10/24 dev eth0
ip addr add 192.168.1.11/24 dev eth0 label eth0:backup
# 特殊地址操作
ip addr add 2001:db8::1/64 dev eth0 nodad # IPv6无重复检测
ip addr change 192.168.1.10/24 dev eth0 preferred_lft 0 # 取消首选地址
# 地址策略配置
ip addr add 192.168.2.10/24 dev eth0 scope site # 作用域限定
3. 路由管理 (ip route)
# 多路由表操作
echo "200 custom" >> /etc/iproute2/rt_tables
ip route add 10.0.0.0/24 via 192.168.1.1 table custom
# 策略路由
ip rule add from 192.168.2.0/24 table 200
# 多路径路由
ip route add default \
nexthop via 192.168.1.1 weight 1 \
nexthop via 192.168.2.1 weight 2
# 路由缓存
ip route get 8.8.8.8 # 查看具体路由路径
4. 邻居表管理 (ip neighbor)
# 永久ARP条目
ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
# 代理ARP
ip neigh add proxy 192.168.1.200 dev eth0
# 邻居状态监控
ip -s neigh show nud reachable # 仅显示可达条目
三、高级网络功能
1. 网络命名空间 (Network Namespace)
# 创建并管理独立网络空间
ip netns add ns1
ip -n ns1 link set lo up
ip link add veth-ns type veth peer name veth-host
ip link set veth-ns netns ns1
# 跨命名空间通信
ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth-ns
2. VRF (Virtual Routing and Forwarding)
# 创建VRF实例
ip link add vrf-red type vrf table 1000
# 绑定接口到VRF
ip link set dev eth0 master vrf-red
# VRF内路由配置
ip -vrf vrf-red route add default via 10.0.0.1
3. 高级隧道 (Tunneling)
# GRE隧道
ip tunnel add gre0 mode gre local 192.168.1.100 remote 203.0.113.5 ttl 64
# VXLAN配置
ip link add vxlan0 type vxlan id 42 \
group 239.1.1.1 dev eth0 \
dstport 4789 ttl 10
# IPIP隧道
ip tunnel add ipip0 mode ipip remote 203.0.113.10 local 192.168.1.100
四、辅助工具详解
1. bridge - 网桥管理
# VLAN过滤配置
bridge vlan add dev eth0 vid 100 pvid untagged
bridge vlan del dev eth1 vid 200
# STP参数调整
bridge link set dev eth0 priority 32 cost 10
# 组播控制
bridge mdb add dev br0 port eth0 grp 239.1.1.1 permanent
2. tc - 流量控制
# 限速配置
tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms
# 优先级队列
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30mbit ceil 50mbit
# 过滤器
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10
3. ss - 套接字统计
# 高级过滤
ss -nt state established '( dport = :443 or sport = :80 )'
# 进程关联
ss -tup -a # 显示所有TCP/UDP进程信息
# 内核内存分析
ss -tem # 显示内存使用和socket选项
五、诊断与监控技巧
1. 实时监控
# 路由事件监听
ip monitor route
# 邻居表变化监控
ip -t monitor neigh
2. 网络状态快照
# 生成完整网络配置报告
ip -d -s -h link list
ip -d -s -h addr list
ip -d -s -h route list table all
bridge -d -s link show
3. 故障排查三板斧
# 1. 验证内核支持
lsmod | grep -e vxlan -e geneve -e bonding
# 2. 检查配置生效
ip -d link show eth0 # -d显示详细信息
# 3. 跟踪内核处理
echo 1 > /proc/sys/net/ipv4/route/debug # 启用路由调试
六、与传统工具对比
| 功能 | iproute2 | net-tools |
|---|---|---|
| 接口信息 | ip -s link | ifconfig -a |
| 路由表 | ip route show | route -n |
| ARP缓存 | ip neigh | arp -n |
| 隧道管理 | ip tunnel | 无直接对应 |
| 策略路由 | ip rule | 不支持 |
| 网络命名空间 | ip netns | 不支持 |
| VLAN接口 | ip link add ... type vlan | vconfig |
七、最佳实践指南
-
配置持久化:
# Debian/Ubuntu (netplan) network: version: 2 bonds: bond0: interfaces: [eth0, eth1] parameters: mode: 802.3ad -
安全操作原则:
# 危险操作前备份状态 ip link show > network_backup.txt ip route save > route_backup.bin # 恢复路由表 ip route restore < route_backup.bin -
性能调优:
# 启用多队列 ethtool -L eth0 combined 8 # RPS配置 echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
iproute2 的强大之处在于直接映射内核网络功能,掌握它等于掌握 Linux 网络的底层控制权。建议通过 man ip-<object>(如 man ip-route)获取最权威文档参考。
iproute2 命令大全:现代 Linux 网络管理终极指南
iproute2 是 Linux 网络管理的核心工具集,替代了传统的 net-tools (ifconfig, route 等)。以下是全面的 iproute2 命令参考手册,涵盖所有主要网络管理场景:
一、设备与链路管理
1. 接口状态管理
# 查看所有网络接口
ip link show
# 启用/禁用接口
ip link set eth0 up
ip link set eth0 down
# 修改接口属性
ip link set eth0 mtu 9000
ip link set eth0 name wan0 # 重命名接口
ip link set eth0 address 00:11:22:33:44:55 # 修改MAC
ip link set eth0 promisc on # 启用混杂模式
2. VLAN 管理
# 创建 VLAN 接口
ip link add link eth0 name eth0.10 type vlan id 10
# 删除 VLAN
ip link delete eth0.10
# 查看 VLAN 配置
ip -d link show eth0.10
3. 绑定接口 (Bonding)
# 创建绑定接口
ip link add bond0 type bond mode 802.3ad
# 添加从属接口
ip link set eth0 master bond0
ip link set eth1 master bond0
# 查看绑定状态
cat /proc/net/bonding/bond0
二、IP 地址管理
1. 地址配置
# 添加/删除 IP 地址
ip addr add 192.168.1.100/24 dev eth0
ip addr del 192.168.1.100/24 dev eth0
# 查看地址配置
ip addr show # 所有接口
ip -4 addr # 仅IPv4
ip -6 addr # 仅IPv6
# 刷新地址
ip addr flush dev eth0
2. 特殊地址
# 添加广播地址
ip addr add broadcast 192.168.1.255 dev eth0
# 添加任意地址
ip addr add 0.0.0.0/0 dev eth0
三、路由管理
1. 路由表操作
# 查看路由表
ip route show
ip -6 route # IPv6路由
# 添加默认路由
ip route add default via 192.168.1.1
# 添加静态路由
ip route add 10.0.0.0/24 via 192.168.1.254
# 删除路由
ip route del 10.0.0.0/24
# 刷新路由缓存
ip route flush cache
2. 策略路由
# 添加路由表
echo "200 custom" >> /etc/iproute2/rt_tables
# 添加策略规则
ip rule add from 192.168.2.0/24 table custom
# 查看策略规则
ip rule show
四、邻居表 (ARP/NDP) 管理
1. ARP 操作
# 查看 ARP 表
ip neigh show
# 添加静态 ARP 条目
ip neigh add 192.168.1.50 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
# 删除 ARP 条目
ip neigh del 192.168.1.50 dev eth0
# 刷新 ARP 表
ip neigh flush dev eth0
2. IPv6 邻居发现
# 查看 NDP 表
ip -6 neigh show
# 管理 IPv6 邻居
ip -6 neigh add fe80::1 lladdr 00:11:22:33:44:55 dev eth0
五、网络命名空间管理
# 创建命名空间
ip netns add ns1
# 在命名空间中执行命令
ip netns exec ns1 ip link show
# 转移接口到命名空间
ip link set eth0 netns ns1
# 连接两个命名空间
ip link add veth0 type veth peer name veth1
ip link set veth1 netns ns1
六、流量控制 (QoS)
1. 队列规则管理
# 添加 HTB 队列规则
tc qdisc add dev eth0 root handle 1: htb default 10
# 添加分类
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50mbit ceil 100mbit
# 添加过滤器
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10
# 查看配置
tc qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0
2. 流量整形
# 添加 TBF 整形器
tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms
# 添加网络模拟
tc qdisc add dev eth0 root netem delay 100ms 10ms 25% loss 5% duplicate 1%
七、网桥管理
# 创建网桥
ip link add br0 type bridge
# 管理网桥属性
ip link set br0 type bridge stp_state 1
ip link set br0 type bridge forward_delay 1500
ip link set br0 type bridge vlan_filtering 1
# 添加端口
ip link set eth0 master br0
# VLAN 管理
bridge vlan add dev eth0 vid 10
bridge vlan add dev eth0 vid 10 pvid
bridge vlan del dev eth0 vid 10
# 查看网桥信息
bridge link show
bridge fdb show
八、隧道接口管理
# 创建 GRE 隧道
ip tunnel add gre0 mode gre remote 203.0.113.5 local 192.168.1.100 ttl 64
ip link set gre0 up
ip addr add 10.0.0.1/24 dev gre0
# 创建 VXLAN 隧道
ip link add vxlan0 type vxlan id 100 group 239.1.1.1 dev eth0 dstport 4789
九、统计与监控
# 接口统计
ip -s link show eth0
ip -s -s link show eth0 # 更详细统计
# 路由统计
ip route show table cache
# 邻居表统计
ip -s neigh show
# 实时监控
ip monitor all # 监控所有事件
ip monitor link # 监控链路状态变化
ip monitor route # 监控路由变化
十、高级技巧
1. 批量操作
# 批量启用所有接口
ip link | awk -F: '/state/ {print $2}' | xargs -I {} ip link set {} up
# 批量添加多个IP
for i in {10..20}; do
ip addr add 192.168.1.$i/24 dev eth0
done
2. JSON 输出
ip -j link show # JSON格式输出
ip -j -p route # JSON + 美化输出
3. 颜色输出
ip -c link show # 启用彩色输出
alias ip='ip -c' # 永久启用彩色
4. 网络诊断
# 路由追踪
ip route get 8.8.8.8
# MTU 路径发现
ip route get 8.8.8.8 | grep -oP 'mtu \K\d+'
# 连接跟踪
conntrack -L
十一、常用命令对照表
| 传统命令 | iproute2 等效命令 |
|---|---|
| ifconfig | ip addr, ip link |
| route | ip route |
| arp | ip neigh |
| netstat -i | ip -s link |
| netstat -r | ip route |
| netstat -g | ip maddr |
| iptunnel | ip tunnel |
| brctl | bridge |
提示:iproute2 的所有配置都是临时的,重启后会丢失。要永久保存配置,需要写入网络配置文件(如 /etc/network/interfaces)或使用网络管理器(如 NetworkManager)。
掌握这些命令将使您能够高效管理任何复杂的 Linux 网络环境,从简单的家庭网络到大型数据中心架构。
以下是 iproute2 命令大全,涵盖网络接口、IP地址、路由、隧道、ARP 管理等核心功能,基于 Linux 现代网络管理工具整理。命令需 root 权限执行,临时生效(重启失效),持久化需结合网络配置文件(如 /etc/network/interfaces 或 systemd-networkd)。
⚙️ 一、基础命令结构
ip [OPTIONS] OBJECT { COMMAND | help }
- OBJECT:
link(接口)、address(IP地址)、route(路由)、neigh(ARP)、tunnel(隧道)等 - 常用选项:
-s(统计信息)、-4(IPv4)、-6(IPv6)、-d(详细信息)、-br(简洁输出)。
🔧 二、网络接口管理(ip link)
| 命令 | 功能 | 示例 |
|---|---|---|
| 查看接口 | 显示所有接口状态 | ip link show |
| 启停接口 | 启用/禁用接口 | ip link set eth0 upip link set eth0 down |
| 修改MTU | 设置最大传输单元 | ip link set eth0 mtu 9000 |
| 修改MAC | 更改硬件地址 | ip link set eth0 address 00:0c:29:xx:xx:xx |
| 多播控制 | 启用/禁用多播 | ip link set eth0 multicast on |
📡 三、IP地址管理(ip address)
| 命令 | 功能 | 示例 |
|---|---|---|
| 查看IP | 显示所有IP地址 | ip addr show |
| 添加IP | 分配IPv4/IPv6地址 | ip addr add 192.168.1.10/24 dev eth0 |
| 删除IP | 移除指定地址 | ip addr del 192.168.1.10/24 dev eth0 |
| 别名地址 | 添加带标签的别名 | ip addr add 192.168.1.20/24 label eth0:1 dev eth0 |
| 清除IP | 清空接口所有IP | ip addr flush dev eth0 |
🗺️ 四、路由管理(ip route)
| 命令 | 功能 | 示例 |
|---|---|---|
| 查看路由 | 显示路由表 | ip route show |
| 添加路由 | 静态路由/默认网关 | ip route add 10.0.0.0/24 via 192.168.1.1ip route add default via 192.168.1.1 |
| 修改路由 | 替换现有路由 | ip route replace default via 192.168.1.2 |
| 删除路由 | 移除指定路由 | ip route del 10.0.0.0/24 |
| 多表路由 | 查看特定路由表 | ip route show table local |
📡 五、邻居表管理(ARP,ip neigh)
| 命令 | 功能 | 示例 |
|---|---|---|
| 查看ARP | 显示ARP缓存 | ip neigh show |
| 添加ARP | 静态ARP条目 | ip neigh add 192.168.1.100 lladdr 00:0c:29:xx:xx:xx dev eth0 |
| 删除ARP | 移除ARP条目 | ip neigh del 192.168.1.100 dev eth0 |
⛓️ 六、隧道管理(ip tunnel)
| 命令 | 功能 | 示例 |
|---|---|---|
| 创建GRE隧道 | 建立GRE隧道 | ip tunnel add gre0 mode gre local 10.1.1.1 remote 20.2.2.1 ttl 255 |
| 创建IPIP隧道 | 建立IPIP隧道 | ip tunnel add ipip0 mode ipip local 10.1.1.1 remote 20.2.2.1 |
| 查看隧道 | 显示隧道信息 | ip tunnel show |
| 删除隧道 | 移除隧道接口 | ip tunnel del gre0 |
📊 七、Socket统计(ss替代netstat)
| 命令 | 功能 | 示例 |
|---|---|---|
| 监听端口 | 显示所有监听端口 | ss -l |
| TCP连接 | 查看所有TCP连接 | ss -t -a |
| UDP连接 | 查看所有UDP连接 | ss -u -a |
| 进程关联 | 显示Socket关联进程 | ss -p |
| 状态过滤 | 按状态筛选(如ESTABLISHED) | ss -anltp state established |
🎚️ 八、策略路由(ip rule 和 ip route)
ip rule show # 显示策略规则
ip rule add from 192.168.1.10 lookup 100 # 添加策略
ip route add default via 192.168.2.1 table 100 # 为规则表添加路由
💎 总结:核心命令速查表
| 功能 | 常用命令 |
|---|---|
| 接口状态 | ip link show、ip -s link |
| IP地址 | ip addr add/del、ip addr flush |
| 路由 | ip route add/del、ip route replace |
| ARP | ip neigh show、ip neigh add/del |
| 隧道 | ip tunnel add/del |
| Socket统计 | ss -l、ss -t、ss -p |
⚠️ 注意:
- 以上命令需
sudo执行,重启后失效,持久化需编辑网络配置文件(如 NetworkManager 或/etc/network/interfaces)。- 查看详细信息可加
-d(如ip -d link show eth0),统计信息用-s(如ip -s -s addr)。
完整文档见 iproute2 Wiki。
iproute2 的 ip 命令详解
ip 命令是 Linux 网络管理的瑞士军刀,属于 iproute2 套件的核心工具,取代了传统的 ifconfig、route 等命令。它提供了统一的接口管理网络栈的各个方面,包括设备、地址、路由、邻居、隧道等。
一、基础语法结构
ip [OPTIONS] OBJECT COMMAND
常用全局选项:
-s:显示详细统计信息(可重复使用增加详细度)-d:输出详细信息-4:仅操作 IPv4-6:仅操作 IPv6-r:解析主机名-c:彩色输出-j:JSON 格式输出-p:易读格式(pretty print)
主要对象(OBJECT):
| 对象 | 描述 | 替代传统命令 |
|---|---|---|
link | 网络设备管理 | ifconfig |
address | IP地址管理 | ifconfig |
route | 路由表管理 | route |
neigh | ARP/邻居表管理 | arp |
rule | 策略路由规则管理 | ip rule |
tunnel | 隧道接口管理 | - |
maddress | 多播地址管理 | - |
mroute | 多播路由管理 | - |
monitor | 监控网络事件 | - |
二、核心功能详解
1. ip link - 网络设备管理
功能:管理物理和虚拟网络接口
常用命令:
# 显示所有网络接口
ip link show
# 显示指定接口详情
ip -s -s link show eth0
# 启用/禁用接口
ip link set eth0 up
ip link set eth0 down
# 修改接口属性
ip link set eth0 mtu 9000
ip link set eth0 name newname
ip link set eth0 address 00:11:22:33:44:55
# 创建虚拟接口
ip link add veth0 type veth peer name veth1
ip link add br0 type bridge
2. ip address - IP地址管理
功能:管理接口的IP地址
常用命令:
# 显示所有接口IP地址
ip address show
# 添加/删除IP地址
ip address add 192.168.1.10/24 dev eth0
ip address del 192.168.1.10/24 dev eth0
# 添加辅助IP地址
ip address add 192.168.1.11/24 dev eth0 label eth0:1
# 清除所有地址
ip address flush dev eth0
3. ip route - 路由管理
功能:管理路由表
常用命令:
# 显示路由表
ip route show
# 添加/删除默认网关
ip route add default via 192.168.1.1
ip route del default
# 添加静态路由
ip route add 10.0.0.0/24 via 192.168.1.100
ip route add 192.168.2.0/24 dev eth1
# 添加策略路由
ip route add 172.16.0.0/16 via 10.0.0.1 table 100
# 测试路由路径
ip route get 8.8.8.8
4. ip neigh - 邻居表管理
功能:管理ARP缓存和邻居发现
常用命令:
# 显示ARP表
ip neigh show
# 添加静态ARP条目
ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
# 删除ARP条目
ip neigh del 192.168.1.100 dev eth0
# 刷新ARP缓存
ip neigh flush dev eth0
5. ip rule - 策略路由
功能:管理路由策略数据库
常用命令:
# 显示路由策略
ip rule show
# 添加策略路由规则
ip rule add from 192.168.2.0/24 table 100
ip rule add to 10.0.0.0/8 table 200
ip rule add fwmark 0x1 table 150
# 删除规则
ip rule del from 192.168.2.0/24
6. ip tunnel - 隧道管理
功能:创建和管理隧道接口
常用命令:
# 创建GRE隧道
ip tunnel add gre0 mode gre local 10.0.0.1 remote 203.0.113.5 ttl 255
# 创建IPIP隧道
ip tunnel add ipip0 mode ipip local 10.0.0.1 remote 203.0.113.5
# 配置隧道IP
ip address add 192.168.100.1/30 dev gre0
# 显示隧道接口
ip -d tunnel show
三、高级功能与技巧
1. 虚拟网络设备管理
# 创建VLAN接口
ip link add link eth0 name eth0.100 type vlan id 100
# 创建MACVLAN
ip link add link eth0 name macvlan0 type macvlan mode bridge
# 创建IPVLAN
ip link add link eth0 name ipvlan0 type ipvlan mode l2
# 创建网络命名空间
ip netns add ns1
2. VRF(虚拟路由转发)管理
# 创建VRF
ip link add vrf-blue type vrf table 10
# 分配接口到VRF
ip link set dev eth0 master vrf-blue
# 在VRF中添加路由
ip route add 192.168.1.0/24 via 10.0.0.1 vrf vrf-blue
3. 多表路由管理
# 查看所有路由表
grep -E '^[0-9]' /etc/iproute2/rt_tables
# 添加自定义路由表
echo "200 custom" >> /etc/iproute2/rt_tables
# 在自定义表中添加路由
ip route add default via 192.168.100.1 table custom
4. 网络事件监控
# 实时监控网络事件
ip monitor all
# 监控路由变化
ip monitor route
# 监控链路状态变化
ip monitor link
5. 高级诊断命令
# 查看详细接口统计
ip -s -s link show eth0
# 检查路由缓存
ip route show cache
# 追踪路由决策过程
ip route get 8.8.8.8 from 10.0.0.100 iif eth0
四、实用场景示例
1. 创建VLAN接口
ip link add link eth0 name eth0.10 type vlan id 10
ip address add 192.168.10.1/24 dev eth0.10
ip link set eth0.10 up
2. 配置网桥
ip link add name br0 type bridge
ip link set eth1 master br0
ip link set eth2 master br0
ip address add 192.168.1.1/24 dev br0
ip link set br0 up
3. 策略路由配置
# 创建自定义路由表
echo "100 vpn" >> /etc/iproute2/rt_tables
# 添加路由到自定义表
ip route add default via 10.8.0.1 dev tun0 table vpn
# 添加规则:来自特定用户的流量使用VPN
ip rule add uidrange 1000-1000 table vpn
# 添加规则:特定应用的流量使用VPN
ip rule add fwmark 0x1 table vpn
4. 双WAN负载均衡
# 创建自定义路由表
echo "200 isp1" >> /etc/iproute2/rt_tables
echo "201 isp2" >> /etc/iproute2/rt_tables
# 添加默认路由到各表
ip route add default via 192.168.1.1 dev eth1 table isp1
ip route add default via 192.168.2.1 dev eth2 table isp2
# 添加策略规则
ip rule add from 192.168.1.0/24 table isp1
ip rule add from 192.168.2.0/24 table isp2
# 设置默认路由
ip route add default nexthop via 192.168.1.1 dev eth1 weight 1 \
nexthop via 192.168.2.1 dev eth2 weight 1
5. 网络故障排查
# 查看接口错误统计
ip -s link show eth0 | grep -E 'errors|dropped'
# 检查路由
ip route get 8.8.8.8
# 检查ARP缓存
ip neigh show
# 监控实时事件
ip monitor route link neigh
五、与传统命令对比
| 功能 | iproute2 命令 | 传统命令 |
|---|---|---|
| 查看接口信息 | ip link show | ifconfig |
| 配置IP地址 | ip addr add 192.168.1.1/24 dev eth0 | ifconfig eth0 192.168.1.1 netmask 255.255.255.0 |
| 查看路由表 | ip route show | route -n |
| 添加默认网关 | ip route add default via 192.168.1.1 | route add default gw 192.168.1.1 |
| 查看ARP缓存 | ip neigh show | arp -n |
| 添加策略路由 | ip rule add ... | 无直接替代 |
| 创建隧道 | ip tunnel add ... | 无直接替代 |
六、最佳实践
-
使用简洁输出:
ip -br link show # 简洁显示接口状态 ip -br addr show # 简洁显示IP地址 -
批量操作:
ip -batch - <<EOF link set eth0 up addr add 192.168.1.10/24 dev eth0 route add default via 192.168.1.1 EOF -
JSON输出处理:
ip -j link show | jq '.[] | select(.operstate == "UP") | .ifname' -
持久化配置:
# Debian/Ubuntu nano /etc/network/interfaces # RHEL/CentOS nano /etc/sysconfig/network-scripts/ifcfg-eth0 -
结合其他工具:
# 监控带宽使用 iftop -i eth0 # 分析网络流量 nethogs # 测试网络连通性 mtr 8.8.8.8
ip 命令的强大之处在于其统一性和灵活性,通过组合不同的对象和命令,几乎可以实现任何网络配置需求。掌握 ip 命令是成为 Linux 网络管理专家的关键一步。
ip link 命令详解:Linux 网络接口管理手册
ip link 是 iproute2 工具集中用于管理网络接口(链路层) 的核心命令,可完全替代传统的 ifconfig。它提供更精细的接口控制,支持现代网络技术(如 VLAN、VXLAN、桥接等),是 Linux 网络配置的基础工具。
一、基础命令结构
ip link [选项] [动作] [设备] [参数]
常用动作:
show:显示接口信息add:创建新接口delete:删除接口set:修改接口属性help:显示帮助
常用选项:
-s:显示统计信息-d:显示详细信息-j:JSON 格式输出-p:人性化显示 MAC 地址-br:简化表格输出
二、接口状态管理
1. 启用/禁用接口
# 启用接口
ip link set eth0 up
# 禁用接口
ip link set eth0 down
2. 查看接口状态
# 显示所有接口
ip link show
# 显示特定接口
ip link show eth0
# 简化输出
ip -br link show
# 输出示例:
# lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
# eth0 UP 52:54:00:12:34:56 <BROADCAST,MULTICAST,UP,LOWER_UP>
三、接口属性配置
1. MAC 地址管理
# 查看MAC地址
ip -br link show eth0 | awk '{print $3}'
# 修改MAC地址
ip link set eth0 address 00:11:22:33:44:55
# 随机MAC地址
ip link set eth0 address $(openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//')
2. MTU 设置
# 查看MTU
ip link show eth0 | grep mtu
# 修改MTU
ip link set eth0 mtu 9000
3. 混杂模式
# 启用混杂模式
ip link set eth0 promisc on
# 禁用混杂模式
ip link set eth0 promisc off
4. 传输队列长度
# 设置发送队列长度
ip link set eth0 txqueuelen 10000
四、虚拟接口创建
1. VLAN 接口
# 创建VLAN接口
ip link add link eth0 name eth0.100 type vlan id 100
# 启用VLAN接口
ip link set eth0.100 up
2. VXLAN 隧道
# 创建VXLAN接口
ip link add vxlan0 type vxlan id 42 dstport 4789 remote 203.0.113.1 local 192.168.1.100
3. 网桥接口
# 创建网桥
ip link add br0 type bridge
# 添加端口到网桥
ip link set eth0 master br0
4. 绑定接口(链路聚合)
# 创建bond接口
ip link add bond0 type bond mode 802.3ad
# 添加从接口
ip link set eth0 master bond0
ip link set eth1 master bond0
5. MACVLAN
# 创建MACVLAN接口
ip link add macvlan0 link eth0 type macvlan mode bridge
6. IPVLAN
# 创建IPVLAN接口
ip link add ipvlan0 link eth0 type ipvlan mode l2
五、接口高级操作
1. 接口重命名
# 临时重命名
ip link set eth0 name wan0
# 永久重命名(需修改udev规则)
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME="wan0"' > /etc/udev/rules.d/10-rename.rules
2. 别名接口
# 添加IP别名
ip addr add 192.168.1.100/24 dev eth0 label eth0:0
3. ARP 控制
# 禁用ARP
ip link set eth0 arp off
# 启用ARP
ip link set eth0 arp on
4. 组播控制
# 启用组播
ip link set eth0 multicast on
# 禁用组播
ip link set eth0 multicast off
六、状态监控与诊断
1. 详细统计信息
ip -s link show eth0
输出示例:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped missed mcast
1256895320 1845321 0 0 0 83210
TX: bytes packets errors dropped carrier collsns
783216540 1024589 0 0 0 0
2. 关键统计指标
| 指标 | 含义 | 问题指示 |
|---|---|---|
errors | 错误包数量 | 物理层问题 |
dropped | 丢弃包数量 | 缓冲区满/策略丢弃 |
missed | 错过包数量 | 处理能力不足 |
overruns | 溢出次数 | 系统负载过高 |
carrier | 载波错误 | 物理连接问题 |
collisions | 冲突次数 | 半双工网络问题 |
3. 实时监控
# 监控链路状态变化
ip monitor link dev eth0
# 监控所有接口事件
ip monitor all
七、网络命名空间操作
1. 创建命名空间
ip netns add ns1
2. 在命名空间中操作接口
# 查看命名空间接口
ip -n ns1 link show
# 在命名空间中启用接口
ip -n ns1 link set lo up
3. 移动接口到命名空间
# 移动接口到命名空间
ip link set veth1 netns ns1
# 在命名空间中重命名
ip -n ns1 link set veth1 name eth0
八、高级特性
1. 接口组管理
# 创建接口组
ip link add link eth0 name eth0-group type group
# 添加接口到组
ip link set eth0 group eth0-group
2. XDP 程序附加
# 附加XDP程序
ip link set eth0 xdp obj xdp_prog.o
3. 硬件卸载配置
# 启用VLAN硬件卸载
ethtool -K eth0 tx-vlan-offload on
# 检查卸载状态
ip -d link show eth0 | grep vlan_hw
4. 端口镜像
# 创建镜像端口
ip link add name mirror0 type bridge
# 配置镜像
tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: matchall action mirred egress mirror dev mirror0
九、故障排查指南
1. 接口不工作
# 检查物理状态
ip link show eth0 | grep state
# 检查驱动信息
ip -d link show eth0 | grep driver
# 检查错误统计
ip -s link show eth0
2. VLAN 配置问题
# 检查VLAN配置
bridge vlan show
# 检查VLAN硬件卸载
ethtool -k eth0 | grep vlan
3. 性能问题诊断
# 查看接口统计
ip -s -s link show eth0
# 检查中断平衡
cat /proc/interrupts | grep eth0
# 检查队列长度
ip link show eth0 | grep qlen
十、与传统 ifconfig 对比
| 功能 | ifconfig | ip link |
|---|---|---|
| 显示接口 | ifconfig | ip link show |
| 启用接口 | ifconfig eth0 up | ip link set eth0 up |
| 禁用接口 | ifconfig eth0 down | ip link set eth0 down |
| 修改 MAC | ifconfig eth0 hw ether xx:xx:xx | ip link set eth0 address xx:xx:xx |
| 设置 MTU | ifconfig eth0 mtu 9000 | ip link set eth0 mtu 9000 |
| VLAN 接口 | 不支持 | ip link add ... type vlan |
| 网桥接口 | 不支持 | ip link add ... type bridge |
| 绑定接口 | 需额外工具 | ip link add ... type bond |
| 命名空间支持 | 不支持 | 原生支持 |
| 接口统计 | 有限信息 | 详细统计 (ip -s link) |
| JSON 输出 | 不支持 | 支持 (ip -j link) |
十一、实用命令速查
1. 创建 VLAN 接口
ip link add link eth0 name eth0.100 type vlan id 100
ip addr add 192.168.100.1/24 dev eth0.100
ip link set eth0.100 up
2. 创建网桥
ip link add br0 type bridge
ip link set eth0 master br0
ip link set eth1 master br0
ip addr add 10.0.0.1/24 dev br0
ip link set br0 up
3. 创建 VXLAN
ip link add vxlan42 type vxlan id 42 dstport 4789 group 239.1.2.3 ttl 10
ip addr add 10.42.0.1/24 dev vxlan42
ip link set vxlan42 up
4. 接口批量配置
#!/bin/bash
for intf in eth0 eth1 eth2; do
ip link set $intf mtu 9000
ip link set $intf txqueuelen 10000
ip link set $intf up
done
5. 监控接口状态变化
ip monitor link | awk '/state UP/ {print "Interface", $2, "activated at", strftime("%F %T")}'
ip link 提供了对 Linux 网络接口的全面控制,从基础状态管理到高级虚拟化功能。掌握其用法是 Linux 系统管理员、网络工程师和 DevOps 专业人员的必备技能,特别在云环境、容器网络和 SDN 场景中尤为重要。
ip link add 命令详解:Linux 虚拟接口创建指南
ip link add 是 iproute2 工具集中用于创建虚拟网络接口的核心命令,可创建各种类型的虚拟接口(VLAN、VXLAN、桥接、绑定等)。这些接口在现代网络架构中至关重要,特别是在虚拟化、容器化和 SDN 环境中。
一、命令结构
ip link add [选项] [设备名] type [类型] [类型参数]
核心参数:
name NAME:指定接口名称(必需)type TYPE:指定接口类型(必需)link DEVICE:指定父接口(用于 VLAN、MACVLAN 等)address LLADDRESS:设置 MAC 地址mtu N:设置 MTU 值txqueuelen N:设置传输队列长度netns PID|NAME:直接在命名空间中创建
二、支持的接口类型及参数
1. VLAN 接口 (type vlan)
ip link add link <父接口> name <名称> type vlan id <VLAN ID> [参数]
参数:
id N:VLAN ID (1-4094)protocol 802.1Q|802.1ad:VLAN 协议reorder_hdr on|off:是否重排序包头gvrp on|off:GARP VLAN 注册协议mvrp on|off:多 VLAN 注册协议
示例:
# 创建标准802.1Q VLAN
ip link add link eth0 name eth0.100 type vlan id 100
# 创建Q-in-Q VLAN
ip link add link eth0 name eth0.200 type vlan id 200 protocol 802.1ad
2. VXLAN 接口 (type vxlan)
ip link add name <名称> type vxlan id <VNI> [参数]
参数:
id N:VXLAN 网络标识符 (VNI)dstport PORT:目标 UDP 端口(默认 4789)local ADDR:本地隧道端点 IPremote ADDR:远程隧道端点 IPgroup ADDR:组播组地址ttl N:生存时间dev DEVICE:绑定到物理接口external:外部模式(需手动配置)learning on|off:MAC 学习开关
示例:
# 创建单播VXLAN
ip link add name vxlan42 type vxlan id 42 dstport 4789 local 192.168.1.100 remote 203.0.113.1
# 创建组播VXLAN
ip link add name vxlan100 type vxlan id 100 group 239.1.2.3 dev eth0
3. 网桥接口 (type bridge)
ip link add name <名称> type bridge [参数]
参数:
stp_state 0|1:生成树协议开关priority N:网桥优先级 (0-65535)hello_time N:HELLO 包间隔(厘秒)forward_delay N:转发延迟(厘秒)ageing_time N:MAC 老化时间(秒)vlan_filtering 0|1:VLAN 过滤开关
示例:
# 创建基础网桥
ip link add name br0 type bridge
# 创建带STP的网桥
ip link add name br-stp type bridge stp_state 1 forward_delay 1500
4. 绑定接口 (type bond)
ip link add name <名称> type bond [参数]
参数:
mode balance-rr|active-backup|balance-xor|broadcast|802.3ad|balance-tlb|balance-alb:绑定模式miimon N:链路监控间隔(毫秒)lacp_rate slow|fast:LACP 速率xmit_hash_policy layer2|layer2+3|layer3+4:传输哈希策略primary DEVICE:主接口(active-backup 模式)
示例:
# 创建LACP聚合
ip link add name bond0 type bond mode 802.3ad lacp_rate fast
# 创建主备绑定
ip link add name bond1 type bond mode active-backup primary eth0
5. MACVLAN/IPVLAN (type macvlan|ipvlan)
ip link add link <父接口> name <名称> type [macvlan|ipvlan] [参数]
参数:
mode private|vepa|bridge|passthru|source(MACVLAN)mode l2|l3|l3s(IPVLAN)flags N:控制标志
示例:
# 创建MACVLAN(桥接模式)
ip link add link eth0 name macvlan0 type macvlan mode bridge
# 创建IPVLAN(L3模式)
ip link add link eth0 name ipvlan0 type ipvlan mode l3
6. VETH 对 (type veth)
ip link add name <名称1> type veth peer name <名称2> [参数]
参数:
peer name NAME:指定对端接口名address LLADDR:设置MAC地址netns NAME:直接放入命名空间
示例:
# 创建标准veth对
ip link add name veth0 type veth peer name veth1
# 创建veth对并放入命名空间
ip link add name veth-host type veth peer name veth-guest netns container1
7. GRE/IPIP/SIT 隧道 (type gre|ipip|sit)
ip link add name <名称> type gre|ipip|sit [参数]
参数:
remote ADDR:远程隧道端点local ADDR:本地隧道端点ttl N:生存时间dev DEVICE:绑定物理接口key N:隧道密钥
示例:
# 创建GRE隧道
ip link add name gre1 type gre remote 203.0.113.1 local 192.168.1.100 ttl 255
# 创建IPIP隧道
ip link add name ipip0 type ipip remote 203.0.113.1 local 192.168.1.100
三、高级创建选项
1. 自定义 MAC 地址
ip link add name vlan10 link eth0 type vlan id 10 address 00:11:22:33:44:55
2. 设置 MTU
ip link add name vxlan100 type vxlan id 100 dstport 4789 mtu 9000
3. 直接在命名空间创建
ip netns add ns1
ip link add name veth-ns type veth peer name veth-host netns ns1
4. 创建接口并立即启用
ip link add name br0 type bridge && ip link set br0 up
四、完整创建流程示例
1. 创建 VLAN 接口
# 创建VLAN接口
ip link add link eth0 name eth0.100 type vlan id 100
# 配置IP地址
ip addr add 192.168.100.1/24 dev eth0.100
# 启用接口
ip link set eth0.100 up
2. 创建网桥并添加端口
# 创建网桥
ip link add name br0 type bridge
# 添加物理接口
ip link set eth0 master br0
ip link set eth1 master br0
# 配置IP并启用
ip addr add 10.0.0.1/24 dev br0
ip link set br0 up
3. 创建 VXLAN over VLAN
# 创建VLAN接口
ip link add link eth0 name eth0.42 type vlan id 42
# 创建VXLAN接口
ip link add name vxlan42 type vxlan id 42 dstport 4789 dev eth0.42 local 192.168.1.100
# 启用接口
ip link set eth0.42 up
ip link set vxlan42 up
4. 创建容器网络
# 创建命名空间
ip netns add container1
# 创建veth对
ip link add veth-host type veth peer name veth-guest netns container1
# 配置主机端
ip addr add 10.1.1.1/24 dev veth-host
ip link set veth-host up
# 配置容器端
ip netns exec container1 ip addr add 10.1.1.2/24 dev veth-guest
ip netns exec container1 ip link set veth-guest up
ip netns exec container1 ip route add default via 10.1.1.1
五、注意事项
- 权限要求:需要 root 权限
- 命名冲突:接口名必须唯一
- 依赖关系:某些接口需要父接口存在
- 临时性:创建的接口重启后消失
- 持久化:需通过配置文件持久化
- 内核支持:某些接口类型需要内核模块
# 检查内核支持 ls /sys/class/net modprobe <模块名> # 如 bonding, 8021q, bridge
六、接口持久化方法
1. Debian/Ubuntu (/etc/network/interfaces)
# VLAN接口
auto eth0.100
iface eth0.100 inet static
address 192.168.100.1
netmask 255.255.255.0
vlan-raw-device eth0
2. RHEL/CentOS (/etc/sysconfig/network-scripts/)
# ifcfg-br0
DEVICE=br0
TYPE=Bridge
IPADDR=10.0.0.1
NETMASK=255.255.255.0
ONBOOT=yes
# ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
3. systemd-networkd (/etc/systemd/network/)
# 10-br0.netdev
[NetDev]
Name=br0
Kind=bridge
# 10-br0.network
[Match]
Name=br0
[Network]
Address=10.0.0.1/24
4. NetworkManager (nmcli)
# 创建网桥
nmcli con add type bridge ifname br0 con-name br0
nmcli con modify br0 ipv4.addresses 10.0.0.1/24
# 添加端口
nmcli con add type bridge-slave ifname eth0 master br0
七、故障排查
1. 接口创建失败
# 检查内核支持
dmesg | grep -i vxlan # 或 bridge, bonding 等
# 检查模块加载
lsmod | grep 8021q
# 尝试手动加载模块
modprobe 8021q
2. VLAN 接口不工作
# 检查父接口状态
ip link show eth0
# 检查VLAN过滤
bridge vlan show
3. VXLAN 隧道不通
# 检查防火墙
iptables -L -v -n
# 检查路由
ip route show table all
# 检查组播
bridge mdb show
4. 绑定接口不聚合
# 检查链路状态
cat /proc/net/bonding/bond0
# 检查交换机配置
# 确保LACP正确配置
八、常用命令组合速查
# 1. 创建VLAN接口
ip link add link eth0 name eth0.100 type vlan id 100
# 2. 创建带STP的网桥
ip link add name br0 type bridge stp_state 1
# 3. 创建LACP绑定
ip link add name bond0 type bond mode 802.3ad
# 4. 创建VXLAN隧道
ip link add name vxlan42 type vxlan id 42 dstport 4789 remote 203.0.113.1
# 5. 创建容器veth对
ip link add veth-host type veth peer name veth-guest netns container1
# 6. 创建MACVLAN接口
ip link add link eth0 name macvlan0 type macvlan mode bridge
# 7. 创建GRE隧道
ip link add name gre1 type gre remote 203.0.113.1 local 192.168.1.100
# 8. 创建IPIP隧道
ip link add name ipip0 type ipip remote 203.0.113.1 local 192.168.1.100
# 9. 创建带自定义MAC的接口
ip link add name custom-mac link eth0 type vlan id 200 address 00:11:22:33:44:55
# 10. 创建巨型帧接口
ip link add name jumbo-br type bridge mtu 9000
ip link add 是构建复杂网络架构的基础工具,掌握其用法对于云平台工程师、网络管理员和 DevOps 专业人员至关重要。通过组合不同类型的虚拟接口,可以实现高度灵活的网络设计,满足从传统数据中心到现代云原生环境的各种需求。
ip link set 命令详解:Linux 网络接口配置指南
ip link set 是 iproute2 工具集中用于修改网络接口属性的核心命令,可替代传统的 ifconfig 配置方式。它提供了对接口状态的精细控制,是网络管理员日常操作中最常用的命令之一。
一、命令结构
ip link set [选项] [设备] [参数]
常用选项:
dev NAME:指定操作设备(可省略)up/down:启用/禁用接口name NEWNAME:重命名接口address LLADDRESS:设置 MAC 地址mtu N:设置 MTU 值txqueuelen N:设置传输队列长度master DEVICE:设置接口主设备(如桥接)nomaster:解除主设备关系netns PID|NAME:移动接口到网络命名空间alias NAME:设置接口别名multicast on/off:启用/禁用组播promisc on/off:启用/禁用混杂模式dynamic on/off:启用/禁用动态标志arp on/off:启用/禁用 ARP
二、核心功能详解
1. 接口状态管理
# 启用接口
ip link set eth0 up
# 禁用接口
ip link set eth0 down
# 批量启用所有接口
for iface in $(ip -o link show | awk -F': ' '{print $2}'); do
ip link set $iface up
done
2. MAC 地址管理
# 设置静态MAC地址
ip link set eth0 address 00:11:22:33:44:55
# 随机生成MAC地址
ip link set eth0 address $(openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//')
# 恢复出厂MAC地址
ip link set eth0 address $(ethtool -P eth0 | awk '{print $3}')
3. MTU 设置
# 设置标准以太网MTU
ip link set eth0 mtu 1500
# 设置巨型帧(Jumbo Frames)
ip link set eth0 mtu 9000
# 设置PPPoE MTU(考虑8字节开销)
ip link set ppp0 mtu 1492
4. 队列长度调整
# 增大传输队列
ip link set eth0 txqueuelen 10000
# 查看当前队列长度
ip link show eth0 | grep qlen
三、高级接口操作
1. 桥接管理
# 添加接口到网桥
ip link set eth0 master br0
# 从网桥移除接口
ip link set eth0 nomaster
# 设置桥接端口属性
ip link set dev eth0 type bridge_slave priority 32 cost 100
2. 绑定接口(链路聚合)
# 创建绑定接口
ip link add bond0 type bond mode 802.3ad
# 添加从接口
ip link set eth0 master bond0
ip link set eth1 master bond0
# 设置绑定模式
ip link set bond0 type bond mode balance-rr
3. 网络命名空间操作
# 创建命名空间
ip netns add ns1
# 移动接口到命名空间
ip link set veth1 netns ns1
# 在命名空间中重命名
ip netns exec ns1 ip link set veth1 name eth0
4. VLAN 接口配置
# 创建VLAN接口
ip link add link eth0 name eth0.100 type vlan id 100
# 设置VLAN标志
ip link set eth0.100 type vlan reorder_hdr off
四、接口特性控制
1. ARP 控制
# 禁用ARP
ip link set eth0 arp off
# 启用ARP
ip link set eth0 arp on
2. 组播控制
# 启用组播
ip link set eth0 multicast on
# 禁用组播
ip link set eth0 multicast off
3. 混杂模式
# 启用混杂模式(抓包必备)
ip link set eth0 promisc on
# 禁用混杂模式
ip link set eth0 promisc off
4. 动态标志
# 标记接口为动态创建
ip link set eth0 dynamic on
# 移除动态标志
ip link set eth0 dynamic off
五、接口重命名与别名
1. 重命名接口
# 临时重命名
ip link set eth0 name wan0
# 永久重命名(需配合udev规则)
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME="wan0"' > /etc/udev/rules.d/10-rename.rules
2. 设置别名
# 设置IP别名(传统方式)
ip addr add 192.168.1.100/24 dev eth0 label eth0:backup
# 设置接口别名(新方式)
ip link set eth0 alias "Primary WAN Interface"
六、虚拟接口管理
1. 创建 VXLAN 接口
ip link add vxlan42 type vxlan id 42 dstport 4789 remote 203.0.113.1
ip link set vxlan42 up
2. 创建 MACVLAN
ip link add macvlan0 link eth0 type macvlan mode bridge
ip link set macvlan0 up
3. 创建 IPVLAN
ip link add ipvlan0 link eth0 type ipvlan mode l2
ip link set ipvlan0 up
4. 创建 GRE 隧道
ip link add gre1 type gre remote 203.0.113.1 local 192.168.1.100 ttl 255
ip link set gre1 up
七、高级应用场景
1. 网络故障转移
# 主接口故障时自动切换到备份
ip link set eth0 down && ip link set eth1 up
2. 容器网络配置
# 创建veth对
ip link add veth0 type veth peer name veth1
# 将veth1放入容器命名空间
ip link set veth1 netns mycontainer
# 在容器内配置接口
ip netns exec mycontainer ip link set veth1 name eth0
ip netns exec mycontainer ip link set eth0 up
3. 接口监控脚本
#!/bin/bash
# 监控接口状态变化
ip monitor link | while read -r line; do
if [[ $line =~ "state UP" ]]; then
echo "[$(date)] Interface $(echo $line | awk '{print $2}') activated"
elif [[ $line =~ "state DOWN" ]]; then
echo "[$(date)] Interface $(echo $line | awk '{print $2}') deactivated"
fi
done
4. 安全加固
# 禁用未使用接口
for iface in $(ip -o link show | awk -F': ' '!/lo|eth0|wlan0/ {print $2}'); do
ip link set $iface down
ip link set $iface arp off
ip link set $iface multicast off
ip link set $iface promisc off
done
八、注意事项
- 权限要求:大多数操作需要 root 权限
- 临时性修改:重启后失效(需持久化配置)
- 顺序依赖:某些操作有顺序要求(如先创建父接口)
- 硬件限制:MTU 等设置受网卡硬件限制
- 命名空间隔离:移动接口到命名空间会断开当前连接
九、与传统 ifconfig 对比
| 功能 | ifconfig | ip link set |
|---|---|---|
| 启用接口 | ifconfig eth0 up | ip link set eth0 up |
| 禁用接口 | ifconfig eth0 down | ip link set eth0 down |
| 修改 MAC | ifconfig eth0 hw ether xx:xx:xx | ip link set eth0 address xx:xx:xx |
| 设置 MTU | ifconfig eth0 mtu 9000 | ip link set eth0 mtu 9000 |
| 混杂模式 | ifconfig eth0 promisc | ip link set eth0 promisc on |
| 重命名接口 | 不支持 | ip link set eth0 name wan0 |
| VLAN 操作 | 不支持 | 完整支持 |
| 命名空间操作 | 不支持 | 原生支持 |
| 桥接管理 | 有限支持 | 完整支持 |
十、实用命令速查
# 1. 启用巨型帧
ip link set eth0 mtu 9000
# 2. 创建并启用VLAN接口
ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 up
# 3. 移动接口到命名空间
ip netns add ns1
ip link set veth1 netns ns1
# 4. 设置接口为桥接端口
ip link set eth0 master br0
# 5. 禁用ARP和组播
ip link set eth0 arp off multicast off
# 6. 批量配置接口
for iface in eth{1..4}; do
ip link set $iface mtu 1500 txqueuelen 1000 up
done
# 7. 恢复默认MAC
ip link set eth0 address $(ethtool -P eth0 | awk '{print $3}')
# 8. 监控接口状态变化
ip monitor link dev eth0
ip link set 提供了对 Linux 网络接口的精细控制,是现代网络配置的基础工具。掌握其用法对于系统管理员、网络工程师和 DevOps 专业人员至关重要,特别是在云环境、容器网络和 SDN 场景中。