ipvsadm 指令详解

简介

ipvsadm 是Linux虚拟服务器的管理命令。

ipvsadm 是用于设置、维护和检查Linux内核中虚拟服务器列表的命令。Linux虚拟服务器可用于基于两个或更多个节点的集群构建可扩展的网络服务。群集的活动节点将服务请求重定向到真正执行服务的服务器主机上。支持TCP和UDP协议,支持三咱数据包转发方法(NAT、隧道、直接路径)以及八种负载均衡算法(轮询、加权轮询、最少连接、加权最少连接、基于位置的最小连接,基于位置的最小连接与复制,目标散列和源散列)。

该命令有两种执行的基本格式:

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

   ipvsadm COMMAND [ 协议] 虚拟服务地址
      [ 负载调度方法] [ 持久性选项]



   ipvsadm command [protocol] service-address
           server-address [packet-forwarding-method]
           [weight options]

   ipvsadm command [ 协议] 虚拟服务地址
      真实服务器地址 [ 数据包转发方法] [ 权重选项]

第一种格式用于处理虚拟服务和算法(将请求分配给真实服务器的算法)。还可以选择性的指定超时时间和网络掩码。

第二种格式用于处理与现有虚拟服务关联的真实服务器。指定真实服务器时,还可以指定真实服务器的包转发方法和权重,如果没有指定则将使用默认值。

语法

   ipvsadm -A|E -t|u|f service-address [-s scheduler]
           [-p [timeout]] [-M netmask]
   ipvsadm -D -t|u|f service-address
   ipvsadm -C
   ipvsadm -R
   ipvsadm -S [-n]
   ipvsadm -a|e -t|u|f service-address -r server-address
           [-g|i|m] [-w weight] [-x upper] [-y lower]
   ipvsadm -d -t|u|f service-address -r server-address
   ipvsadm -L|l [options]
   ipvsadm -Z [-t|u|f service-address]
   ipvsadm --set tcp tcpfin udp
   ipvsadm --start-daemon state [--mcast-interface interface]
           [--syncid syncid]
   ipvsadm --stop-daemon state
   ipvsadm -h

command

ipvsadm 指令令可以识别以下命令,其中大写命令维护虚拟服务,小写命令维护与虚拟服务关联的真实服务器。

-A , --add-service

在内核的虚拟服务器列表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。虚拟服务器地址由三元组唯一定义:IP地址,端口号和协议。虚拟服务器也可以由防火墙标记定义。

-E , --edit-service

编辑内核虚拟服务器表中的一条虚拟服务器记录。

-D , --delete-service

删除内核虚拟服务器表中的一条虚拟服务器记录,并删除所有与该虚拟服务器相关联的真实服务器。

-C , --clear

清除内核虚拟服务器表中的所有记录。

-R , --restore

从标准输入还原Linux虚拟服务器规则。从stdin读取的每一行都将被视为命令行选项,以单独调用 ipvsadm。从stdin读取的行中开头“ipvsadm”是可选的。这可用于在构建大量的路由表时避免执行大量的ipvsadm命令。

-S , --save

将Linux Virtual Server规则转储为可由-R | --restore读取的格式。

-a , --add-server

在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器。

-e , --edit-server

编辑一条虚拟服务器记录中的某条真实服务器记录。

-d , --delete-server

删除一条虚拟服务器记录中的某条真实服务器记录。

-L , -l , --list

如果没有指定参数,则列出虚拟服务器表。如果选择了虚拟服务器地址,则仅列出该虚拟服务器的信息。如果选择-c选项,则显示连接表。输出内容受到其他参数的影响。

-Z , --zore

虚拟服务表计数器清零(清空当前的连接数量等)。

--set tcp tcpfin udp

更改用于IPVS连接的超时值。该命令始终使用3个参数,分别表示TCP会话,接收到FIN数据包后的TCP会话和UDP数据包的超时值(以秒为单位)。超时值0表示保留相应条目的当前超时值

--start-daemon state

启动同步守护进程。他后面state的值可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。

同步守护进程在Linux内核中实现。在主负载均衡器上运行的主守护程序周期性地组播连接变化,在备份负载均衡器上运行的备份守护程序接收多播消息并创建相应的连接。然后,如果主负载均衡器发生故障,备份负载均衡器则会接管主负载均衡器的工作,并且可以保持所有连接的状态不丢失,所有已建立的连接都可以继续访问该服务。

同步守护程序当前仅支持IPv4连接。

--stop-daemon

停止同步守护进程。

-h , --help

显示命令语法的描述。

参数

-t ,--tcp-service service-address

说明虚拟服务器提供的是tcp 的服务。服务器地址的形式为“主机[:端口]”。“主机”可以是IP地址也可以是主机名。“端口”可以是普通的端口号,也可以是端口的服务名称。端口可以被省略,在这种情况下,默认端口号为0。当端口号为0时,需要指定服务器提供持久稳固的服务(也即是使用了-p | --persistent选项)才有效,在这种情况下,它是一个通配符端口,即访问任何端口的连接都将被接受。

-u ,--udp-service service-address

说明虚拟服务器提供的是udp 的服务。请参阅-t | --tcp-service以获取服务地址的描述。

-f , --fwmark-service integer

使用防火墙标记(一个大于零的整数值)表示虚拟服务,而不是地址,端口和协议(UDP或TCP)。说明是经过iptables 标记过的服务类型。具有防火墙标记的数据包的标记是使用iptables(8)的-m | --mark选项配置的。它可以用来构建与同一个真实服务器相关的虚拟服务,涵盖多个IP地址,端口和协议三部分。如果使用IPv6地址,则必须使用-6选项。

使用防火墙标记虚拟服务提供了将不同IP地址,端口和协议组合在一个虚拟服务中的便捷方法。如果需要大量的虚拟服务,那么这对于简化配置是非常有用的,并且可以在有多个虚拟服务的情况下对持久性进行分组。

-s , --scheduler scheduling-method

将TCP连接和UDP数据报分配给真实服务器的算法。调度算法被实现为内核模块。默认有十个可用的高度算法:

rr

轮询:调度器通过”轮询”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

wrr

Weighted Round Robin(加权轮询):调度器通过”加权轮询”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

lc

最少连接:当有新的作业到达时,调度器选择一个当前作业量较少的真实服务器,并把新到达的作业分配给它。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。

wlc

加权最小连接:将更多的作业分配给作业较少且相对于权重较高(Ci / Wi)的服务器。这是默认值。

在集群系统中的服务器性能差异较大的情况下,调度器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

lblc

基于局部性的最少连接:该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用”最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

lblcr

带复制的基于局部性的最少链接:它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按”最小连接”原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

dh

目标地址散列:调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器。

sh

源地址散列:调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器。

sed

最短预期延迟:将预计延迟最短的传入作业分配给服务器。如果发送到第i个服务器,则作业将经历的预期延迟是(C i + 1)/ U i,其中C i是第i个服务器上的作业数量,并且U i是第i个服务器的固定服务速率。

nq

永不队列:如果有进来的作业,则分配一个空闲的服务器,而不是等待一个快速的服务器; 如果所有服务器都忙,则采用最短期望延迟策略分配作业。

-p, --persistent [timeout]

持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。此选项可以与SSL或FTP等协议结合使用,这对客户端始终与同一台真实服务器保持连接至关重要。

注意:如果虚拟服务要处理FTP连接,且使用直接路由或隧道作为转发机制,则必须为虚拟服务设置持久性。如果使用NAT作为转发机制,则不需要持久性,但必须使用ip_vs_ftp内核模块。可以使用insmod(8)将该模块手动插入到内核中。

-M, --netmask netmask

指定客户端为持久性虚拟服务分组的粒度。请求的源地址用这个网络掩码屏蔽,以将所有客户端从一个网络引导到相同的真实服务器。默认值为255.255.255.255,即保持粒度为每个客户端主机。可以使用较少特定的网络掩码来解决客户端上的非持久性缓存集群的问题。应将IPv6网络掩码指定为1到128之间的前缀长度。缺省前缀长度为128。

-r, --real-server server-address

在为虚拟服务器添加真正的服务器时用于指定一个真实服务器。该服务器使用“地址[:端口]”的格式来指定。“主机”可以是普通的IP地址,也可以是主机名。“端口”可以是普通的端口号,也可以是端口的服务名称。在NAT的情况下,主机地址通常是RFC 1918的私有IP地址,端口可以与关联的虚拟服务器端口不同。使用隧道和直接路由方法,端口必须和虚拟服务器的端口相同。对于正常的业务,如果没有指定端口,则使用虚拟服务器中指定的端口。对于fwmark服务,端口可能被省略,在这种情况下,真实服务器上的目标端口将是发送到虚拟服务的请求的目标端口。

-w, --weight weight

Weight是一个整数,用于指定服务器相对于池中其他服务器的权重。权重的有效值为0到65535。默认值为1。静态服务器的权重为零。静态服务器将不会获得新的作业,但仍可以为现有的作业(所有Linux虚拟服务器已经分发的作业)提供服务。如果服务器超载或需要停机维护,设置静态服务器会很有用。

-x, --u-threshold uthreshold

uthreshold是一个指定服务器上连接阈值的整数。uthreshold的有效值为0到65535。默认值为0,表示没有设置连接阈值。如果将uthreshold设置为其他值,则当连接数超过其上限阈值时,不会向服务器发送新作业。

-y, --l-threshold lthreshold

lthreshold是指定服务器的较低连接阈值的整数。的有效值lthreshold是0〜65535,默认值为0,这意味着较低的连接阈值未设置。如果将lthreshold设置为其他值,则服务器将在其连接数下降到低于其连接阈值时才能够收到新的连接。如果lthreshold没有设置信息,但uthreshold被设定,当其连接的数量降到uthreshold值的四分之三时服务器才能够将获得新的连接。

--mcast-interface interface

指定同步主守护程序发送多播的多播接口,或同步备份守护程序侦听多播的接口。

--syncid syncid

为同步主守护进程指定syncid,当SyncID的值不为0时发送多播消息,同步备用守护程序会过滤掉与自身SyncID值不匹配的多播消息。syncid的有效值是0〜255,缺省值为0,这意味着不进行过滤。

-c, --connection

连接输出。使用此选项的list命令将列出当前的IPVS连接。

--timeout

使用此选项的list命令将显示TCP会话的超时值(以秒为单位),接收FIN分组后的TCP会话以及UDP数据包。

--daemon

守护程序信息输出。使用此选项的list命令将显示守护程序状态及其多播接口。

--stats

带有此选项的list命令将显示服务及其服务器的统计信息。

--rate

使用此选项的list命令将显示服务及其服务器的速率信息(如连接数/秒,字节数/秒和数据包/秒)。

--thresholds

使用此选项的list命令将显示服务列表中每个服务器的上/下连接阈值信息。

--persistent-conn

使用此选项的list命令将显示服务列表中每个服务器的持久连接计数器信息。持久连接用于将实际连接从同一个客户端/网络转发到同一台服务器。

--sort

排序虚拟服务和真实服务器的列表。虚拟服务条目按照<protocol,address,port>升序排列。真实的服务器条目按<地址,端口>升序排列。(默认)

--nosort

不要排序虚拟服务和真实服务器的列表。

-O, --ops

指定一个虚拟服务使用单包调度。该选项只能用于UDP服务。如果指定了此选项,则创建的所有连接都仅用于转发一个数据包。选项对于将UDP数据包从相同的客户端端口调度到不同的真实服务器很有用

-n, --numeric

IP地址和端口号将以数字格式打印,而不是作为主机名和服务分别打印,这是默认设置。

--exact

显示数据包和字节计数器的确切值,而不是K(1000的倍数)M(1000K的倍数)或G(1000M的倍数)的舍入数。该选项仅与-L命令相关。

-6

与-f一起使用表示fwmark规则使用IPv6地址。

分组转发方法

-g , --gatewaying

使用网关(直接路由)。这是默认的。

-i , --ipip

使用ipip封装(隧道)。

-m, --masquerading

使用伪装(网络访问转换或NAT)。

示例

简单的虚拟服务

以下命令将Linux Director配置为将207.175.44.110地址上的端口为80的传入请求平均分配到五个真实服务器上的端口80。本示例中使用的转发方法是NAT,每台真实服务器都由Linux Director伪装。

ipvsadm -A -t 207.175.44.110:80 -srr 
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m 
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.2:80  - m 
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m 
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m 
ipvsadm -a -t 207.175.44.110:80  - r 192.168.10.5:80 -m

由于本例中使用NAT作为转发机制,因此必须将真实服务器的默认路由设置为需要配置转发和伪装数据包的linux Director。这可以通过使用以下命令来实现:

echo "1"> / proc / sys / net / ipv4 / ip_forward

防火墙标记虚拟服务

以下命令将Linux Director配置为将发往207.175.44.110或207.175.44.111上的任何端口的传入请求均等分配给五台真实服务器上的相应端口。根据前面的例子,本例中使用的转发方法是NAT,每个真实服务器都被Linux Director伪装。

ipvsadm -A -f 1 -s rr 
ipvsadm -a -f 1 -r 192.168.10.1:0 -m 
ipvsadm -a -f 1 -r 192.168.10.2:0 -m 
ipvsadm -a -f 1 -r 192.168.10.3 :0 -m 
ipvsadm -a -f 1 -r 192.168.10.4:0 -m 
ipvsadm -a -f 1 -r 192.168.10.5:0 -m

由于本例中使用伪装作为转发机制,因此必须将真实服务器的默认路由设置为需要配置转发和伪装数据包的linux Director。真正的服务器也应该被配置为标记传入到207.175.44.110和207.175.44.111的任何端口的数据包,带有防火墙标记1。如果FTP流量要被这个虚拟服务处理,那么需要插入ip_vs_ftp内核模块进入内核。这些操作可以使用以下命令来实现:

echo "1"> / proc / sys / net / ipv4 / ip_forward 
modprobe ip_tables 
iptables -A PREROUTING -t mangle -d 207.175.44.110/31 -j MARK --set-mark 1 
modprobe ip_vs_ftp

IPV6

Pv6地址应该用方括号([和])包围。

       ipvsadm -A -t [2001:db8 :: 80]:80 -s rr 
      ipvsadm -a -t [2001:db8 :: 80]:80 -r [2001:db8 :: a0a0]:80 -m

fwmark IPv6服务需要-6选项。

注意

The Linux Virtual Server implements three defense strategies against some types of denial of service (DoS) attacks. The Linux Director creates an entry for each connection in order to keep its state, and each entry occupies 128 bytes effective memory. LVS's vulnerability to a DoS attack lies in the potential to increase the number entries as much as possible until the linux director runs out of memory. The three defense strategies against the attack are: Randomly drop some entries in the table. Drop 1/rate packets before forwarding them. And use secure tcp state transition table and short timeouts. The strategies are controlled by sysctl variables and corresponding entries in the /proc filesystem:

/proc/sys/net/ipv4/vs/drop_entry 
/proc/sys/net/ipv4/vs/drop_packet 
/proc/sys/net/ipv4/vs/secure_tcp

Valid values for each variable are 0 through to 3. The default value is 0, which disables the respective defense strategy. 1 and 2 are automatic modes - when there is no enough available memory, the respective strategy will be enabled and the variable is automatically set to 2, otherwise the strategy is disabled and the variable is set to 1. A value of 3 denotes that the respective strategy is always enabled. The available memory threshold and secure TCP timeouts can be tuned using the sysctl variables and corresponding entries in the /proc filesystem:

/proc/sys/net/ipv4/vs/amemthresh 
/proc/sys/net/ipv4/vs/timeout_*

Files

/proc/net/ip_vs
/proc/net/ip_vs_app
/proc/net/ip_vs_conn
/proc/net/ip_vs_stats
/proc/sys/net/ipv4/vs/am_droprate
/proc/sys/net/ipv4/vs/amemthresh
/proc/sys/net/ipv4/vs/drop_entry
/proc/sys/net/ipv4/vs/drop_packet
/proc/sys/net/ipv4/vs/secure_tcp
/proc/sys/net/ipv4/vs/timeout_close
/proc/sys/net/ipv4/vs/timeout_closewait
/proc/sys/net/ipv4/vs/timeout_established
/proc/sys/net/ipv4/vs/timeout_finwait
/proc/sys/net/ipv4/vs/timeout_icmp
/proc/sys/net/ipv4/vs/timeout_lastack
/proc/sys/net/ipv4/vs/timeout_listen
/proc/sys/net/ipv4/vs/timeout_synack
/proc/sys/net/ipv4/vs/timeout_synrecv
/proc/sys/net/ipv4/vs/timeout_synsent
/proc/sys/net/ipv4/vs/timeout_timewait
/proc/sys/net/ipv4/vs/timeout_udp

1

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 75,948评论 12 117
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    O感悟人生O阅读 7,440评论 2 27
  • 百战程序员_ Java1573题 QQ群:561832648489034603 掌握80%年薪20万掌握50%年薪...
    Albert陈凯阅读 10,548评论 2 30
  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 11,924评论 2 47
  • 在我年幼无知的时候,曾经有一段时间特别特别迷恋穿越小说,并且无知的想要穿越到某些朝代。那个时候我和我的好朋友们一起...
    亦如是阅读 54评论 0 0