ipvsadm 命令详解
更新时间:2026-09-17。本文是「一个命令一个文档」系列,聚焦
ipvsadm(IP Virtual Server administration,IP 虚拟服务器管理)——属于网络进阶命令族。它配置内核的 IPVS(IP Virtual Server)模块,即 LVS(Linux Virtual Server)四层负载均衡,在内核里做连接级转发,性能远高于用户态代理。
ipvsadm 操作的是内核 IPVS 表:一个 virtual service(VS,虚拟服务,VIP:端口) 后面挂多个 real server(RS,真实后端)。客户端只连 VIP,IPVS 按调度算法把连接分发到 RS。它工作在四层(只看 IP/端口,不解析 HTTP),因此转发效率极高——这也是 Kubernetes kube-proxy 的 IPVS 模式底层用它做 Service 负载均衡的原因。
一、先装模块、看现状
modprobe ip_vs # 加载内核模块(很多发行版按需自动加载)
ipvsadm -L -n # 列出虚拟服务(-n 数字显示,不反解,最常用)
ipvsadm -Ln --stats # 附带流量统计
ipvsadm -Ln --rate # 每秒速率
ipvsadm -Lc # 查看当前连接表(connection table)记住
-n(numeric):不带它 ipvsadm 会尝试反解主机名和服务名,规则多时非常慢。排查 Service/转发先ipvsadm -Ln看 VS 与后端列表,再-Lc看具体连接被分到了哪个 RS。
二、增删:虚拟服务与真实后端
# -A 添加虚拟服务(VIP:端口),-t TCP / -u UDP,-s 调度算法
ipvsadm -A -t 10.0.0.1:80 -s rr
# -a 添加真实后端,-r 指定 RS,-m NAT / -g DR(直连路由) / -i 隧道
ipvsadm -a -t 10.0.0.1:80 -r 192.168.1.11:80 -m
ipvsadm -a -t 10.0.0.1:80 -r 192.168.1.12:80 -m
ipvsadm -d -t 10.0.0.1:80 -r 192.168.1.12:80 # -d 删一个 RS
ipvsadm -D -t 10.0.0.1:80 # -D 删整个虚拟服务
ipvsadm -C # 清空整张 IPVS 表(危险)
ipvsadm -S > /etc/ipvsadm.rules # 导出规则
ipvsadm -R < /etc/ipvsadm.rules # 导入恢复大小写要分清:大写
-A/-D/-E操作虚拟服务,小写-a/-d/-e操作其下的真实服务器。规则默认只在内存,重启丢失,用-S导出配合ipvsadm-restore/开机脚本持久化。
三、三种转发模式
| 标志 | 模式 | 原理 | 特点 |
|---|---|---|---|
-m | NAT(masq) | 调度器改写目标/源地址,回程也经过它 | 配置最简单,RS 网关指向调度器,调度器易成带宽瓶颈 |
-g | DR(direct routing) | 改 MAC 直接投递,RS 与 VIP 同二层 | 性能最高、回程不经调度器,需 RS 配 lo 上的 VIP 抑制 ARP |
-i | TUN(IPIP 隧道) | IP 封装后跨网段投递给 RS | 可跨机房/网段,RS 需支持 IPIP 解封装 |
生产大规模常用 DR:RS 直接把响应回给客户端(响应通常远大于请求),调度器只处理入向。但 DR 要求二层可达且在每个 RS 上把 VIP 配在 lo 并做 arp 抑制(
arp_ignore=1/arp_announce=2),这是最容易配错的地方。
四、调度算法(-s)
| 算法 | 含义 | 适用 |
|---|---|---|
rr | round-robin,轮询 | 后端配置一致 |
wrr | 加权轮询 | 后端能力不同(配 -w 权重) |
wlc | weighted least-connection,加权最少连接(默认常用) | 长连接、负载不均 |
lc | 最少连接 | 同构后端 |
sh | source hash,源地址哈希 | 需要会话保持(同客户端固定到同 RS) |
dh | 目标地址哈希 | 防火墙/缓存集群 |
lblc | 基于局部性的最少连接 | 缓存代理 |
ipvsadm -A -t 10.0.0.1:443 -s wlc
ipvsadm -a -t 10.0.0.1:443 -r 192.168.1.11:443 -g -w 3 # -w 指定权重
ipvsadm -a -t 10.0.0.1:443 -r 192.168.1.12:443 -g -w 1四层 LB 没有 HTTP cookie,所以"会话保持"只能靠
sh(按源 IP 哈希)。客户端经过同一个大 NAT 出口时 sh 会造成倾斜——这点和七层(Nginx/Envoy 的 cookie 粘性)思路不同。
五、连接表、超时与排障
ipvsadm -Lc # 看活跃连接:pro->VIP->RS,确认分发是否均衡
ipvsadm -Ln --stats # 每个 VS/RS 的 Conns/InPKts/OutPKts/InBytes
ipvsadm -L --timeout # TCP/TCPFIN/UDP 会话超时
ipvsadm --set 900 30 150 # 调整 established/tcpfin/udp 超时(秒)IPVS 是有状态的:它为每条连接记录五元组到 RS 的映射(连接表),连接在超时时间内保持粘性。长连接很多时连接表会很大;某 RS 宕机后已有连接不会立刻迁移(NAT 模式依赖健康检查 + 删除 RS)。大量 TIME_WAIT/半开连接堆积,可像调 conntrack 一样调超时。高并发连接表与软中断背景见内核网络调优。
六、和 iptables / Kubernetes 的关系
- vs iptables/nftables:iptables 也能做 DNAT 实现简单分发,但规则是线性/链式匹配,规则一多转发与更新开销大;IPVS 用哈希表查找,后端规模大时 O(1)、更稳定。
- Kubernetes:kube-proxy 的 IPVS 模式就是自动创建 IPVS 规则来实现 ClusterIP Service 的负载均衡(算法近似 rr、会话保持可选 sh)。在 K8s 节点上
ipvsadm -Ln能直接看到每个 ClusterIP 后面的 endpoint Pod IP,是排查"Service 不通/流量不均衡"的利器(对比 iptables 模式下的长串 KUBE 规则)。
# K8s 节点上排 Service:先看 Service 的 ClusterIP,再看它分发到哪些 Pod
ipvsadm -Ln | grep -A5 10.96.0.10:443相关命令
防火墙/NAT 规则用 iptables/nftables,连接与端口用 ss,抓包用 tcpdump,连通性用 ping/nc,网卡层用 ethtool。高并发内核背景见内核网络调优与多队列 RSS。
总结
ipvsadm = 配置/查看内核 IPVS(LVS)四层负载均衡:-A/-a 建虚拟服务与后端、-m/-g/-i 选 NAT/DR/TUN、-s 选 rr/wlc/sh 等算法,排查用 ipvsadm -Ln(列表)与 -Lc(连接表);它在内核做有状态连接转发、规模大时优于 iptables,也是 kube-proxy IPVS 模式与高性能四层 VIP 的底层。