ipvsadm 命令详解

ipvsadm是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置。

命令介绍

向LVS系统中添加一个用于负载均衡的virtual server(VS)

基本用法:

1
2
ipvsadm COMMAND [protocol] service-address
[scheduling-method] [persistence options]

命令:

  • -A, –add-service: 为ipvs虚拟服务器添加一个虚拟服务,即添加一个需要被负载均衡的虚拟地址。虚拟地址需要是ip地址,端口号,协议的形式。
  • -E, –edit-service: 修改一个虚拟服务。
  • -D, –delete-service: 删除一个虚拟服务。
  • -a, –add-server: 为虚拟服务添加一个real server(RS)
  • -e, –edit-server: 修改RS记录
  • -d, –delete-server: 删除RS记录
  • -C, –clear: 清除所有虚拟服务。
  • -R, –restore: 从标准输入获取ipvsadm命令。一般结合下边的-S使用。
  • -S, –save: 从标准输出输出虚拟服务器的规则。可以将虚拟服务器的规则保存,在以后通过-R直接读入,以实现自动化配置。
  • -L, -l, –list: 列出虚拟服务表中的所有虚拟服务。可以指定地址。添加-c显示连接表。
  • -Z, –zero: 将所有数据相关的记录清零。这些记录一般用于调度策略。
  • –set tcp tcpfin udp: 修改协议的超时时间。
  • –start-daemon state: 设置虚拟服务器的备服务器,用来实现主备服务器冗余。(注: 该功能只支持ipv4)
  • –stop-daemon: 停止备服务器。
  • -h, –help: 帮助。
1
2
3
ipvsadm command [protocol] service-address
server-address [packet-forwarding-method]
[weight options]

用来添加或修改VS的配置,service address用来指定涉及的虚拟服务即虚拟地址,server-address指定涉及的真实地址。

参数:

  • -t, –tcp-service service-address: 指定虚拟服务为tcp服务。service-address要是host[:port]的形式。端口是0表示任意端口。如果需要将端口设置为0,还需要加上-p选项(持久连接)。

  • -u, –udp-service service-address: 使用udp服务,其他同上。

  • -f, –fwmark-service integer: 用firewall mark取代虚拟地址来指定要被负载均衡的数据包,可以通过这个命令实现把不同地址、端口的虚拟地址整合成一个虚拟服务,可以让虚拟服务器同时截获处理去往多个不同地址的数据包。fwmark可以通过iptables命令指定。如果用在ipv6需要加上-6。

  • -s, –scheduler scheduling-method: 指定调度算法。调度算法可以指定以下8种: rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队)

  • -p, –persistent [timeout]: 设置持久连接,这个模式可以使来自客户的多个请求被送到同一个真实服务器,通常用于ftp或者ssl中。

  • -M, –netmask netmask: 指定客户地址的子网掩码。用于将同属一个子网的客户的请求转发到相同服务器。

  • -r, –real-server server-address: 为虚拟服务指定数据可以转发到的真实服务器的地址。可以添加端口号。如果没有指定端口号,则等效于使用虚拟地址的端口号。

  • -w, –weight weight:设置权重。权重是0~65535的整数。如果将某个真实服务器的权重设置为0,那么它不会收到新的连接,但是已有连接还会继续维持(这点和直接把某个真实服务器删除时不同的)。

  • -x, –u-threshold uthreshold: 设置一个服务器可以维持的连接上限。0~65535。设置为0表示没有上限。

  • -y, –l-threshold lthreshold: 设置一个服务器的连接下限。当服务器的连接数低于此值的时候服务器才可以重新接收连接。如果此值未设置,则当服务器的连接数连续三次低于uthreshold时服务器才可以接收到新的连接。(PS: 笔者以为此设定可能是为了防止服务器在能否接收连接这两个状态上频繁变换)

  • –mcast-interface interface: 指定使用备服务器时候的广播接口。

  • –syncid syncid: 指定syncid,同样用于主备服务器的同步。

  • [packet-forwarding-method]: 此选项指定某个真实服务器所使用的数据转发模式。需要对每个真实服务器分别指定模式。

    • -g, –gatewaying: 使用网关(即直接路由),此模式是默认模式。
    • -i, –ipip: 使用ipip隧道模式。
    • -m, –masquerading: 使用NAT模式。

以下选项用于list命令:

  • -c, –connection: 列出当前的IPVS连接。
  • –timeout: 列出超时
  • –daemon:
  • –stats: 状态信息
  • –rate: 传输速率
  • –thresholds: 列出阈值
  • –persistent-conn: 坚持连接
  • –sor: 把列表排序。
  • –nosort: 不排序
  • -n, –numeric: 不对ip地址进行dns查询
  • –exact: 单位
  • -6: 如果fwmark用的是ipv6地址需要指定此选项。

其他注意事项

  • 如果使用IPv6地址,需要在地址两端加上”【】“。例如:ipvsadm -A -t [2001:db8::80]:80 -s rr
  • 可以通过设置以下虚拟文件的值来防御DoS攻击:/proc/sys/net/ipv4/vs/drop_entry /proc/sys/net/ipv4/vs/drop_packet /proc/sys/net/ipv4/vs/secure_tcp

示例

使用DR模式

主机列表及IP地址划分

通过访问192.168.66.250可以通过DR模式实现请求在三台机器上轮询.

主机名 IP VIP 功能
node1 192.168.66.11 192.168.66.250(DR) lvs
node2 192.168.66.12 nginx
node3 192.168.66.13 nginx

node1 机器配置
安装 lvs软件

1
yum install ipvsadm -y

开启内核转发

1
2
3
cat /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward

开始添加配置
添加192.168.66.250的vip配置,指定轮询方式为rr

1
ipvsadm -A -t 192.168.66.250:80 -s rr

查看配置

1
2
3
4
5
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.66.250:80 rr

添加真实服务器,指定传输模式为DR

1
2
ipvsadm -a -t 192.168.66.250:80 -r 192.168.66.12:80 -g
ipvsadm -a -t 192.168.66.250:80 -r 192.168.66.13:80 -g

tips: DR 模式通过修改mac地址来实现路由转发,所以vip的端口,必须和后端服务器的端口保持一致。

查看配置

1
2
3
4
5
6
7
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.66.250:80 rr
-> 192.168.66.12:80 Route 1 0 0
-> 192.168.66.13:80 Route 1 0 0

node2 node3 服务器配置
安装 NGINX 软件

1
2
yum install nginx -y
systemctl start nginx

创建一个HTML文件用来验证

1
echo $HOSTNAME > /usr/share/nginx/html/1.html

结果确认

1
2
3
4
curl 192.168.66.12/1.html
node2
curl 192.168.66.13/1.html
node3

抑制ARP响应:

1
2
3
4
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

绑定vip地址

1
2
ifconfig lo:0 192.168.66.250/32 up
route add -host 192.168.66.250 dev lo

node1 验证结果

1
2
3
4
[root@node1 vagrant]# curl http://192.168.66.250/1.html
node2
[root@node1 vagrant]# curl http://192.168.66.250/1.html
node3

回滚配置

node1删除真实服务器地址

1
2
ipvsadm -d -t 192.168.66.250:80 -r 192.168.66.12:80
ipvsadm -d -t 192.168.66.250:80 -r 192.168.66.13:80

node1删除vip配置

1
ipvsadm -D -t 192.168.66.250:80

查看配置

1
2
3
4
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

node2,node3 关闭arp抑制

1
2
3
4
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce

node2,node3 删除网卡及路由规则

1
2
ifconfig lo:0 down
route del 192.168.66.250

使用NAT模式

主机列表及IP地址划分

通过访问192.168.66.251可以通过NAT模式实现请求在三台机器上轮询.

主机名 IP VIP 功能
node1 192.168.66.11 192.168.66.251(NAT) lvs
node2 192.168.66.12 nginx
node3 192.168.66.13 nginx

node1 上操作

添加地址为192.168.66.251:80的虚拟服务,指定调度算法为轮转。

1
ipvsadm -A -t 192.168.66.251:80 -s rr

添加真实服务器,指定传输模式为NAT

1
2
ipvsadm -a -t 192.168.66.251:80 -r 192.168.66.12:80 -m
ipvsadm -a -t 192.168.66.251:80 -r 192.168.66.13:80 -m

查看配置

1
2
3
4
5
6
7
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.66.251:80 rr
-> 192.168.66.12:80 Masq 1 0 0
-> 192.168.66.13:80 Masq 1 0 0

NAT模式是lvs的三种模式中最简单的一种。此种模式下只需要保证调度服务器与真实服务器互通就可以运行。

node1 验证结果

1
2
3
4
5
[root@node1 vagrant]# curl http://192.168.66.251/1.html
node3
[root@node1 vagrant]# curl http://192.168.66.251/1.html
node2
[root@node1 vagrant]#

查询lvs的配置信息

1
2
3
4
5
6
7
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.66.251:80 rr
-> 192.168.66.12:80 Masq 1 0 0
-> 192.168.66.13:80 Masq 1 0 0
1
2
3
4
5
6
7
ipvsadm -L --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.66.251:http 2 12 8 808 912
-> node2:http 1 6 4 404 456
-> node3:http 1 6 4 404 456

说明:

  1. Conns (connections scheduled) 已经转发过的连接数
  2. InPkts (incoming packets) 入包个数
  3. OutPkts (outgoing packets) 出包个数
  4. InBytes (incoming bytes) 入流量(字节)
  5. OutBytes (outgoing bytes) 出流量(字节)
1
2
3
4
5
6
7
ipvsadm -L --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.66.251:http 0 0 0 0 0
-> node2:http 0 0 0 0 0
-> node3:http 0 0 0 0 0

说明:

  1. CPS (current connection rate) 每秒连接数
  2. InPPS (current in packet rate) 每秒的入包个数
  3. OutPPS (current out packet rate) 每秒的出包个数
  4. InBPS (current in byte rate) 每秒入流量(字节)
  5. OutBPS (current out byte rate) 每秒入流量(字节)

保存和重载规则

-S:使用输出重定向进行规则保存

1
2
3
4
5
ipvsadm -S > lvs_`date +%F`.txt
cat lvs_2020-09-03.txt
-A -t 192.168.66.251:http -s rr
-a -t 192.168.66.251:http -r node2:http -m -w 1
-a -t 192.168.66.251:http -r node3:http -m -w 1

-R:使用输入重定向载入规则

1
2
3
4
5
6
7
8
ipvsadm -R < lvs_2020-09-03.txt
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.66.251:80 rr
-> 192.168.66.12:80 Masq 1 0 0
-> 192.168.66.13:80 Masq 1 0 0

请求所有配置

-Z:清空计数器
-C:清空ipvs规则

1
2
3
4
5
6
ipvsadm -Z
ipvsadm -C
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

参考文档

负载均衡集群ipvsadm命令及基本用法