LVS原理

-m NAT(网络地址转换)  出入都要经过调度器     ip层   网络层  

  DNAT   SNAT

-g DR    (直接路由模式) 适合公有ip                         arp协议   amc地址层  

tunnel     (隧道模式) 额外再加一层ip 叫做 gre协议(通用路由协议)

linux中 叫ipip协议

FULL-NAT   (完全NAT模式)

数据链路层    设置ip

lo 口           回环口               虚拟ip(微ip)

elinks --dump

命令:

    -A, --add-service:为ipvs虚拟服务器添加一个虚拟服务,即添加一个需要被负载均衡的虚拟地址。虚拟地址需要是ip地址,端口号,协议的形式。

    -E, --edit-service:修改一个虚拟服务。

    -D, --delete-service:删除一个虚拟服务。

    -C, --clear:清除所有虚拟服务。

    -R, --restore:从标准输入获取ipvsadm命令。一般结合下边的-S使用。

    -S, --save:从标准输出输出虚拟服务器的规则。可以将虚拟服务器的规则保存,在以后通过-R直接读入,以实现自动化配置。

    -a, --add-server:为虚拟服务添加一个real server(RS)

    -e, --edit-server:修改RS

    -d, --delete-server:删除

    -L, -l, --list:列出虚拟服务表中的所有虚拟服务。可以指定地址。添加-c显示连接表。

    -Z, --zero:将所有数据相关的记录清零。这些记录一般用于调度策略。

    --set tcp tcpfin udp:修改协议的超时时间。

    --start-daemon state:设置虚拟服务器的备服务器,用来实现主备服务器冗余。(注:该功能只支持ipv4)

    --stop-daemon:停止备服务器。

    -h, --help:帮助。

参数:

    以下参数可以接在上边的命令后边。

    -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:为虚拟服务指定数据可以转发到的真实服务器的地址。可以添加端口号。如果没有指定端口号,则等效于使用虚拟地址的端口号。

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

        -g, --gatewaying:使用网关(即直接路由),此模式是默认模式。

        -i, --ipip:使用ipip隧道模式。

        -m, --masquerading:使用NAT模式。

    -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,同样用于主备服务器的同步。

    以下选项用于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

NAT模式

做实验的时候LB开两个网卡。连个不在同一个网段,如果都设置桥接的话就要将真机的ip和新添的网卡放在同一个网段。不然是没法实现互通的。202.1.1.200做了好几遍不成功就是这个原因ps:最好第二个网卡选择NAT连接方式,就不在同一网段,就能避开这个问题。

sysctl -a  |grep -i forward   //看看内核参数,并复制 :net.ipv4.ip_forward = 0          

vim /etc/sysctl.conf            //粘贴在这并将0改为1   net.ipv4.ip_forward =1

sysctl -p                             //生效    

yum install   ipvsadm(调度器的包)

用户态 更改 内核态   靠 ipvsadm这个命令完成

-l  查看详细信息   -n 查看端口

例子:

1.使用NAT模式

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

ipvsadm -A -t 207.175.44.110:80 -s rr

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

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

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

添加集群服务命令:

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

[root@galera2 ~]# ipvsadm -A -t 202.1.1.200:80 -s rr

[root@galera2 ~]# ipvsadm -a -t 202.1.1.200:80 -r 10.18.42.45:80 -m

[root@galera2 ~]# ipvsadm -a -t 202.1.1.200:80 -r 10.18.42.164:80 -m

[root@galera2 ~]# ipvsadm -L

删除

[root@galera2 ~]# ipvsadm -D -t 202.1.1.200:80                //删除虚拟

[root@galera2 ~]ipvsadm -d -t 202.1.1.200:80 -r 10.18.42.165:80   // 删除

 其他管理类

 删除RS:

# ipvsadm -d -t|u|f service-address -r server-address

示例:

[root@lvs ~]# ipvsadm -d -t 172.16.1.253:80 -r 172.16.1.101

删除所有集群服务

# ipvsadm -C

保存规则

保存规则至默认配置文件:

# service ipvsadm save                          //centos已经失效

保存规则至指定文件:

# ipvsadm -S > /path/to/somefile

2.4.3 载入保存在文件中的规则

# ipvsadm -R < /path/form/somefile

小结 VS/NAT模式的原理是:当收到Client请求时,Director将数据包的目标IP由VIP转换为选中的Real Server的RIP

来实现分发,要求RS将网关指向Director的DIP。 特点是:配置简单,所有的入站、出站数据包都经过分发器。当

数据量比较大时,分发器可能会出现网络瓶颈!因而支持的RS数量少。

DR模式

*************************首先设置RS  (real server)*********************************

首先配置好网站服务,测试一下所有的RS服务器  //real server    真实服务器

[root@localhost ~]# ip addr add dev lo 10.18.42.144/32      //在lo接口上绑定VIP (就是在LB上配置的第二个IP)

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore       //忽视;不支声

[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce  // 宣布;宣告

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

************Director分发器配置VIP*****就是设置LB  (负载均衡)*****************

ifconfig ens33:0 10.18.42.144 netmask 255.255.255.255 up     //配置VIP

或者:

vim  /etc/sysconfig/network-scripts/ifcfg-ens33    //配置VIP

或者:

ip addr add dev ens33 30.30.30.100/32   //配置VIP

                                        (ps:vip就是虚拟IP)

[root@localhost ~]# yum -y install ipvsadm //确保LoadBalancer仓库

[root@localhost ~]# ipvsadm -C    //删除以前设置的规则

[root@localhost ~]# ipvsadm -A  -t 10.18.42.144:80 -s rr

[root@localhost ~]# ipvsadm -a  -t 10.18.42.144:80 -r 10.18.42.45 -g

[root@localhost ~]# ipvsadm -a  -t 10.18.42.144:80 -r 10.18.42.164 -g

[root@localhost ~]# ipvsadm -Ln

小结 VS/DR模式的原理是: 当一个client发送一个请求到VIP,Director根据VIP选择对应的real-server的Pool,根

据算法,在Pool中选择一台Real-server,然后将client的请求包发给选择的Real-server,最后选择的Real-server 应

答包直接传给client ip

tunnel     (隧道模式)

 

*************************************LB端操作****************************************

lsmod |grep ipip

modprode ipip  

lsmod |grep ipip  

[root@localhost ~]# ip add add dev tunl0 10.18.42.145/32

[root@localhost ~]# ifconfig tunl0 up

[root@localhost ~]# ifconfig tunl0       //查看tunl0

sysctl -p       //没设置

sysctl -a  |grep -i forward   //看看内核参数,并复制 net.ipv4.ip_forward = 0          

vim /etc/sysctl.conf            //粘贴在这并将0改为1   net.ipv4.ip_forward =1

sysctl -p                             //生效    

[root@localhost ~]# ipvsadm -C                 //清除以前所有的规则

[root@localhost ~]# ipvsadm -L                  //查看

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

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

[root@localhost ~]# ipvsadm -A -t 10.18.42.145:80 -s rr          

添加真实服务器,指定传输模式为ipip隧道模式。

[root@localhost ~]# ipvsadm -a -t 10.18.42.145:80 -r 10.18.42.45:80 -i

[root@localhost ~]# ipvsadm -a -t 10.18.42.145:80 -r 10.18.42.164:80 -i

保存数据,不然数据在缓存里。关机就没了。

[root@localhost ~]# ipvsadm -S

-A -t localhost.localdomain:http -s rr

-a -t localhost.localdomain:http -r 10.18.42.45:http -i -w 1

-a -t localhost.localdomain:http -r 10.18.42.164:http -i -w 1

[root@localhost ~]#

************************RS端(real server)操作****************************

modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。

添加ipip模块

[root@localhost ~]# modprobe ipip    

[root@localhost ~]# lsmod |grep ipip        //查看一下

ipip                   13465  0

tunnel4                13252  1 ipip

ip_tunnel              25163  1 ipip

[root@localhost ~]# ip add add dev tunl0 10.18.42.145/32

[root@localhost ~]# ifconfig tunl0 up

[root@localhost ~]# ifconfig tunl0

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore

[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@localhost ~]# cat /proc/sys/net/ipv4/conf/tunl0/rp_filter

1

/proc/sys/net/ipv4/conf/tunl0/rp_filter     //可选项: =0    =1   =2  

[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/tunl0/rp_filter

一定要查看这的参数。确认是0或者2的时候才行,因为这个数据进来的时候走的是tunl0网卡,出去的时候走的ens33网卡,rp_firter默认为=1 !

然后下面设置成这样:

sysctl -a  |grep -i forward           //看看内核参数,

sysctl -a  |grep -i  rp_filter          //看看内核参数,

并复制                  net.ipv4.ip_forward = 0

并复制                   net.ipv4.conf.default.rp_filter = 1

vim /etc/sysctl.conf            //粘贴在这并改为:

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 2

sysctl -p                             //生效    

或者都行,0和2都是不丢弃包的

rp_filter参数有三个值,0、1、2,具体含义:

0:不开启源地址校验。

1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。

2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。

                                                    在所有的real server端都如此布置。                                          

ifconfig ens37 down           //关闭网卡命令

目标地址哈希         CDN 内容分发网络   做缓存服务器会用到