keepalived配置⼿册(V1.2.24)中⽂版详解
创建本⽂的⽬的
笔者最近在详细研究keepalived软件,发现⽹上关于这⽅⾯的详细描述较少,需要案例配置参数在新版本中已经失效。keepalived官⽅⽹站提供的⽂档资料,虽然以案例为基础,提供了较为常⽤的参数配置,但是笔者发现许多参数并未提及。作为IT⾏业的⼈,似懂⾮懂只能做⼀个三流的技术⼈员,本着刨根问题的精神,创建了该篇⽂章。
本⽂以keepalived manual pages英⽂版为基础⽽创建的,你可以将该⽂件理解为manual pages中⽂。但笔者并不是单纯的⽂字翻译,对于⽂中的功能描述,笔者为验证其正确性,进⾏了⼤量实验,已确认其描述的正确性。笔者才疏学浅,难免有错误的地⽅,请⼴⼤⽹友给予批评指正,以便不断的完善。
注意:⽂中红⾊条⽬为笔者暂时不能确认其功能的部分
版本:keepalived 1.2.24
考拉先⽣
GLOBAL CONFIGURATION
Global definitions
global_defs
{
notification_email
{
uniformly
}
notification_email_from
stmp_rver 112.3.3.3. 25
stmp_hole_name #⽤于指定发送hole消息的主机,⼀般是mx记录的主机
stmp_connect_timeout 30
router_id my_hostname #指定⼀个字符串给keepalived,不⼀定是主机名,默认为本地主机名
vrrp_mcast_group4 224.0.0.18 #指定vrrp的多播ipv4地址,默认是224.0.0.18
vrrp_mcast_group6 ff02::12 #指定vrrp的多播ipv6地址,默认是ff02::12
default_interface p33p1.3 # 设置⽤户static ipaddress的默认⽹络接⼝,如果系统没有eth0接⼝或者想为多个static ipaddress配置不同的接⼝时,使⽤该配置将会简化配置。
lvs_sync_daemon <INTERFACE> <VRRP_INSTANCE> [id <SYNC_ID>] [MAXLEN <LEN>] [port <PORT>] [ttl <TTL>] [group <IP ADDR>]
#该选项没有详细的官⽅⽂档说明,根据测试发现,该参数作⽤于ipvsad的sync daemon选项,lvs_sync的状态根据keepalived的状态⼀致,当kill掉master keepalived时,backup keepalive的state转变为master状态
lvs_flush #该功能新增于1.2.23版本。启动keepalived时刷新lvs配置,如果lvs没有配置,这不会刷新 vrrp_garp_master_delay 10 #设置当keepalived转变为master后,延迟多少秒发送第⼆组gratuitous arp。时间单位为秒,默认5秒,0表⽰不发送第⼆组gratuitous a
rp发送。
#注意第⼆组发送和第⼆次发送的区别
vrrp_garp_master_repeat 1 #keepalived状态转变为master后,每次发送多少组grntuitous APR 信息的数量,默认为5个
vrrp_garp_lower_prio_repeat 1 #当master keepalived接收到⼀个较低优先级的⼴播后,⼀次发送gratuitous apr的数量组 vrrp_garp_master_refresh 60 #master keepalived 每次发送gratuitous arp的最⼩时间间隔。默认是0,没有
vrrp_garp_master_refresh_repeat 2 #master keepalived 每次发送gratuitous arp消息的组数量。
vrrp_garp_interval 0.001 #⼩数类型,单位秒,在⼀个⽹卡上每组gratuitous arp消息之间的延迟时间,默认为0,⼀个发送的消息=n组 arp报⽂
vrrp_gna_interval 0.000001 #⼩数类型,单位秒, 在⼀个⽹卡上每组na消息之间的延迟时间,默认为0 vrrp_lower_prio_no_advert #如果接收到⼀个低优先级的通告,只需要丢弃它,不⽤发送其他通告,字符类型:布尔
值,fal/true
vrrp_version <2 or 3> #设置vrrp协议版本,默认是版本2
vrrp_iptables #该配置添加于1.2.21版本,添加vrrp_iptables全局配置选项。 iptables / ip6tables条⽬始终添加在INPUT链的末尾,但对于许多配置,这在处理中太晚了。 此修补程序允许指定要添加规则的链名称,
#并且还允许添加指定⽆规则的选项。 如果指定了链名称,则该链必须已经存在于iptables 和/或ip6tables配置中,并且该链将从ip(6)表配置中的适当点调⽤。
#默认是⼊站过滤
vrrp_iptables keepalived_in keepalived_out #或⽤于出站过滤。注意,出站过滤将不适⽤于IPv4,因为可以选择VIP作为出站连接的源地址。 对于IPv6,由于地址已过时,因此不太可能
vrrp_iptables #不添加任何iptables规则
vrrp_ipt [keepalived [keepalived_if [keepalived6 [keepalived_if6]]]] #Keepalived可以选择将ipt与iptables结合使⽤。 如果是这样,则可以指定ipt名称,默认如下。如果没有指定名称,则不使⽤ipts,否则将通过向先前指定的名称添加“_if”和/ #或“6”来构造任何省略的名称。ipt是iptables 的扩展,它允许你创建匹
配整个地址ts(地址集合)的规则。
vrrp_check_unicast_src #该选项允许在unicast模式中,检查vrrp包的源ip地址是否是unicast peers中的⼀个
vrrp_skip_check_adv_addr #检查vrrp报⽂中的所有地址⽐较耗时,设置此标志的意思是如果接收的到报⽂和上⼀个报⽂来⾄同⼀个路由器,则不执⾏检查。默认是跳过检查
vrrp_strict #严格遵守vrrp协议,下⾯这些功能将会禁⽌:1. 0 VIP 2. unicast(单播) peers 3. vrrp 版本2的ipv6功能
#当vrrp或checker进程超时时,可以使⽤下⾯4个选项。这可以是备vrrp实例变为主vrrp状态。有时由于主或备系统太过繁忙,导致⽆法处理vrrp数据包,但这个时候主系统依然还在运⾏。 这时就需要使⽤下列四个选项来处理该问题。
vrrp_priority <-20 to 19> #设置vrrp⼦进程优先级
checker_priority <-20 to 19 > #设置checker⼦进程优先级
vrrp_no_swap #设置vrrp⼦进程不可交换
checker_no_swap #设置checker⼦进程不可交换
#keepalived已经构建了对SNMP的⽀持,keepalived,checker和RFC⽀持可以单独启⽤/禁⽤
snmp_sockert udp:1.2.3.4:705 #⽤户指定连接到SNMP主代理的套接字(默认 unix:/var/agentx/master),除⾮使⽤的是⽹络空间名称,默认为udp:localhost:705
enable_snmp_keepalived #enable keepalived MIB的vrrp元素的SNMP处理功能
enable_snmp_checker #enable keepalived MIB的checker元素的SNMP处理功能
enable_snmp_rfc #enable RFC2787和RFC6527处理功能
搭配 英文
enable_snmp_rfcv2 #enable RFC2787 vrrp MIB的处理功能
enable_snmp_rfcv3 #enable RFC6527 vrrp MIB的处理功能
enable_traps #enable SNMP traps功能
}
net_namespace NAME #设置要运⾏的⽹络命名空间,/var/run/keepalived⽬录将被创建为⾮共享挂载点,例如pid⽂
件.syslog条⽬将_NAME附加到ident。注意,不能在重新加载配置是更改命名空间
# 在Linux协议栈中引⼊⽹络命名空间,是为了⽀持⽹络协议栈的多个实例,⽽这些协议栈的隔离就是由命名空间来实现的(有点像进程的线性地址空间,协议栈不能访问其他协议栈的私有数据)。
#需要纳⼊命名空间的元素包括进程,套接字,⽹络设备。进程创建的套接字必须属于某个命名空间,套接字的操作也必须在命名空间内进⾏,⽹络设备也必须属于某个命名空间,但可能会改变,因为⽹络设备属于公共资源
instance NAME #如果有多个keepalived实例运作在同⼀个命名空间,将会创建⼀个pid⽂件,将NAME作为⽂件名的⼀部分,在/var/run/keepalived。 注意:配置重启时⽆法更改实例名称
u_pid_dir #在/var/run/keepalived中创建pid⽂件
linkbeat_ur_poling #轮询以件车媒体链路故障,否则尝试使⽤ETHTOOL或MII接⼝
##Static routes/address/rules
norfolk#keepalived可以配置静态地址,路由和跪着,这些地址不会被vrrpd移除,他们留在服务器上。如果你的机器上已经有ip和路由,并且你的计算机可以相互ping通对⽅,则可以不需要这个部分。路由和规则的语法和 ip rule add /ip route add 相同。
#虚拟地址和虚拟路由的语法相同,如果没有指定dev元素,默认的接⼝为eth0
static_ipaddress
{
192.168.1.1/24 dev eth0 scope global ##指定192.168.1.1/24在eth0,范围为全局地址
......
}
static_routes
{
192.168.2.0/24 via 192.168.1.100 dev eth0
192.168.100.0/24 table 6909 nexthop via 192.168.101.1 dev wlan0 onlink weight 1 nexthop via 192.168.101.2 dev wlan0 onlink weight 2
192.168.200.0/24 dev p33p1.2 table 6909 tos 0x04 protocol bird scope link priority 12 mtu 1000 hoplimit 100 advmss 101 rtt 102 rttvar 103 reordering 104 window 105 cwnd
106 ssthresh lock 107 realms PQA/0x14 rto_min 108 initcwnd 109 initrwnd 110 features ecn
2001:470:69e9:1:2::4 dev p33p1.2 table 6909 tos 0x04 protocol bird scope link priority 12 mtu 100 hoplimit
100advmss 101 rtt 102 rttvar 103 reordering 104 window 105 cwnd 106 ssthresh
lock 107 rto_min 108 initcwnd 109 initrwnd 110 features ecn
...
}
static_rules
{
from 192.168.2.0/24 table 1
to 192.168.2.0/24 table 1
from 192.168.28.0/24 to 192.168.29.0/26 table small iff p33p1 oif wlan0 tos 22 fwmark 24/12 preference 39 realms 30/20 goto 40
to 1:2:3:4:5:6:7:0/112 from 7:6:5:4:3:2::/96 table 6908
...
}
##VRRPD CONFIGURATION
该选项包含4个⼦块: subblocks of VRRP script(s), VRRP synchronization group(s), VRRP gratuitous ARP and unsolicited neighbour advert delay group(s) and VRRP instance(s)
gff
##VRRP script(s)
#添加⼀个⽤于定期指定的脚本,它的退出码将被所有的VRRP instance记录,它以⾮0的权重监视
vrrp_script<SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> #执⾏脚本的路径
interval <INTEGER> #调⽤脚本两次之间的间隔,默认为1秒
timeout <INEGER> #第⼆次调⽤脚本后多长时间没有回应的超时时间
weight <INTEGER:-254..254> #根据该权重,动态调整调⽤该脚本选项的vrrp实例优先级,默认是2. 当脚本执⾏码为0,权重⼤于0时,vrrp实例优先级增加;当脚本执⾏码为⾮0,权重⼩于0时,vrrp实例优先级减⼩,其他情况优先级不变。
#当该值为0时,不改变实例的优先级
ri <INTEGER> ##设置脚本返回值连续为0的次数。加⼊该参数后,当脚本执⾏码连续为0的次数为ri次,且权重⼤于0时,vrrp 实例优先级增加
fall <INTEGER> ##设置脚本返回值连续为0的次数。加⼊该参数后,当脚本执⾏码连续为⾮0的次数为rfall次,且权重⼩于0
时,vrrp实例优先级增加
}
##VRRP synchronization group(s)
#字符串类型,共同故障转移的ip群组的名称
vrrp_sync_group VG_1 {
group {
inside_network #每个vrrp_instance 的名称
ouside_network #每个vrrp_instance 的名称 暂没有查询到相关的详细⽂档,关于这两个选项的⽤户,⽹上的解释各有差异,在
lvs的DR和NAT模式中,可能⽤法各不相同,后期验证
}
世界杯主题曲we will rock you##指定选项中带有参数是,需⽤引号,如“ notify_master /path/to_master.sh master”
notify_master /path/to_master.sh #转换成master时,执⾏的脚本,⽹上的⼀种⽤法是,执⾏⼀个邮件发送脚本
notify_backup /path/to_backup.sh ##转换成backup时,执⾏的脚本,⽹上的⼀种⽤法是,执⾏⼀个邮件发送脚本
notify_fault /path/to_fault.sh ##转换成fault状态是,执⾏的脚本,⽹上的⼀种⽤法是,执⾏⼀个邮件发送脚本
#该⼀下⼏个选项,⽤户任何状态的转换。"notify“脚本在notify_* 之后调⽤,并使⽤keepalived提供的3个参数执⾏(所有notify中没有指定参数),如果使⽤下⾯选项,建议停⽤上⾯选项
#$1 #"GROUP|INSTANCE",参数为GROUP或INSTANCE
#$2 #指定GROUP或INSTANCE的名称
#$3 #“MASTER"|"BACKUP"|"FAULT",指定转换的状态
notify /path/notify.sh
smtp_alter #当状态发⽣变化后,发送通知邮件,使⽤配置⽂件上⾯”global_defs“定义的邮件地址
global_tracking #所有的VRRP共享相同的跟踪配置
} #end of vrrp_sync_group VG_1
VRRP grantuitous ARP and unsolicited neighbour advert delay group(s)
#指定VRRP grantuitous ARP 和 unsolicited neighbour advert设置,这是⽤于当上游的⾓环境⽆法处理⼤量的ARPS/NAS流。
#当限制适⽤的接⼝为物理接⼝时,使⽤“interface”;当限制适⽤的接⼝为⼀组接⼝时,使⽤“interfaces”。
#如果已经设置了vrrp_grap_interval/vrrp_gna_interval,且在garp_group中没有指定的接⼝,将使⽤全局配置参数
garp_group {
garp_interval <DECIMAL> #设置发送gratuitous ARPs时,两次之间的延时时间。单位秒,分辨率微秒
gna_interval <DECIMAL> #设置两次unsolicited neighbour advers时间的延时时间。单位秒,分辨率微秒
少儿英语培训班interface <STRING> #⽤于以上两个选项的物理接⼝
interfaces { #⽤于以上两个选项的接⼝列表
<STRING>
<STRING>
...
}
} end of garp_group
VRRP instance(s)
dullness
#描述vrrp_sync_group中每个实例组的可移动ip。这⾥描述了两个ip(inside_network outsid和outside_network),在机
器“my_host_name”,它们属于同⼀个组VG_1,并且在任何情况下都会⼀起转换状态。
#你将需要为“outside_network”写⼊另⼀个块中
vrrp_instance inside_network {
state MASTER #初始状态,MASTER|BACKUP ,⼀旦有其他机器加⼊,将会举⾏选举,具有最⾼优先级的机器将会成为MASTER,所以这个条⽬的并不重要
interface eth0 #指定该实例⽤户vrrp的⽹卡,⽤于发送vrrp
ur_vmac [<VMAC_INTERFACE>] #指定VRRP虚拟mac地址
vmac_xmit_ba #从基本接⼝发送和接受vrrp消息,⽽不是VMAC接⼝
native_ipv6 #强制instance使⽤ipv6(当混合ipv4和ipv6的配置)
dont_track_primary #忽略VRRP接⼝错误
track_interface { #可选项,以下⽹卡中如果任意个⽹卡不通,所有的⽹卡都会进⼊FAULT状态
给某人打电话的英文
eth0
eth1
eth2 weight <-254..254>
...
}
track_script {
<SCRIPT_NAME> #增加⼀个跟踪脚本到⽹⼝上(<SCRIPT_NAME>是vrrp_script条⽬的名称)
<SCRIPT_NAME> weight <-254..254>
}
#在⽹卡上,⽤于绑定vrrpd的默认ip是主ip,如果你想隐藏本地vrrpd,可以使⽤这个ip作为多播和单播vrrp报⽂的源地址(如果是多么,vrrpd将会接收到数据包,⽆论使⽤什么样的源IP地址)
mcast_src_ip <IPADDR> #指定多播源ip地址
unicast_src_ip <IPADDR> #指定单播源ip地址
version <2 or 3> #指定运⾏在这个⽹卡上的vrrp版本,默认使⽤的是全局配置的参数“vrrp_version”
unicast_peer { #不通过vrrp组播群组发送vrrp⼴播报⽂。相反,通过单播的⽅式将⼴告发送到⼀下ip列表中。在某些不⽀持多播的⽹络环境中
<IPADDR> #使⽤VRRP FSM(Finite State Machine有限状态机)和功能也是不错的。
... #指定的ip可以是IPV4 和IPV6
}
#指定⽹卡⼝设置,和全局参数⼀样,默认使⽤的是全局参数
garp_master_delay 10
garp_master_repeat 1
boyfriend
garp_lower_prio_delay 10
garp_lower_prio_repeat 1
garp_master_refresh 10
garp_master_refresh_repeat 2
garp_interval 100
gna_interval 100
lower_prio_no_advert [<BOOL>]
#任意⼀个0-255之间的数字
#⽤户区分运⾏在相同NIC(和相同套接字)上的vrrpd的多个实例
virtual_router_id 51
出纳员主要负责什么工作
advert_int 1 #VRRP⼴告的时间间隔(e.g. 0.92)(使⽤默认值)
#注意:2004年,RFC3768C从VRRPv2规范中删除了认证。使⽤此选项是不合规的,可能会导致⼀些问题。如果可能,尽量避免使⽤,除⾮使⽤单播是,他可能会有帮助。
authentication { #认证块
#PASS|AH
#PASS-Simple password(建议)
#AH-IPSEC(不推荐)
auth_type PASS
auth_pass 12345668 #⽤户访问vrrpd的密码,在所有的机器上应该是相同的。只会使⽤前8个字符。
}
#指定状态在MASTER与BACKUP之间切换时,添加或删除的ip地址。其他与之有相同条⽬配置的机器,将会发送想法的状态转换。 virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}