lvs的nat图解:

lvs的nat模式和dr模式的主要的差别就是nat模式的调度器要负责消息的接收和发送,而dr模式中的调度器只需要负责消息的接收,至于消息的发送直接有后面的realserver直接返回给客户端;


需要遵循以下规则:(dir为调度器的ip,rip为realserver的ip)

1.调度器中的dip和rip要在同一个网络中,如果Dip和rip不在同一网络中,就不能将报文送达到realserver,同时realserver的网关要设置为和Dip一样的网关,否则报文从realserver无法到达DIP

2.Rip通常为私有地址,仅能和集群节点中(Dip通信)。

3.Director位于clientrealserver之间,处理进去的所有通信。

4.Realserver必须将网关指向Dip

5.Director支持端口映射。向外提供服务的端口和realserver的端口可能不一致。

Realserver可以使用任意操作系统,只用directorlinux就可以。


lvs的工作模式和iptables的工作模式有相似之处:

iptables:在内核空间是netfilter,而在用户空间是iptables,我们通过iptables写规则,这些规则会在netfilter上面生效;

lvs:在内核空间工作的是ipvs,而在用户空间是ipvsadm,通过命令ipvsadm写规则在内核上面的ipvs框架上生效;


注意:iptables和lvs不能同时使用。原因是:

iptables中的5个钩子为:(自己理解的,有点粗俗)

prerouting:刚刚进入网络层的数据包通过此节点,还没有到达路由之前,源地址转换在此

input:经过路由之后,如何是访问本机的就会通过此节点

ouput:从本机取到数据之后,出来时要经过的节点,然后走postrouting

forward:定义的转发规则从这里转发到后面的主机

postrouting:出去的时候数据包经过此节点,目标地址转换在此


由于我们对外公布的地址就是负载均衡本地的地址,所以会通过input连将请求送达到本机上,如果本机的确有个端口在响应这个用户请求,就会回复的,负责拒绝。

很显然,在Lvs中我们不能让用户的请求到达本机上面去,如何做?

其实我们的LVS工作在input链上面的,我们在input上面设置规则,一旦发现用户请求是一个集群服务,就会强行修改这个报文的行程的,本来是到达本机的,结果强行修改行程之后,到达post_routing--->其他主机上

这是有点反常与iptables机制的,所以LVSiptables不能同时使用。



安装以及配置:

首先dir上面配置两个网卡:(192.168.116.137为桥接的,192.168.113.128为host-only模式)

image.png

在其他两台主机上配置一个网卡,度为host-only模式,并且和dir的host-only在同一个网段中,网关指定为192.168.113.128。

在dir上面下载lvs:

#yum install  ipvsadm
打开转发机制:
[root@localhost ~]# echo 1 >/proc/sys/net/ipv4/ip_forward #打开ipv的ip转发机制,当前生效
[root@localhost ~]# vim /etc/sysctl.conf 
#打开ipv的ip转发机制,永久生效
net.ipv4.ip_forward = 1

下来再realserver上面下载安装httpd。并分别编辑访问页面为rs1和rs2.

测试如下:

[root@localhost conf]# curl 127.0.0.1
rs 1
[root@localhost conf]#

下来就是写规则了:

ipvsadm:
    管理集群服务
        添加:-A -t|u|f service-address [-s scheduler]
            -t: TCP协议的集群 
            -u: UDP协议的集群
                service-address:     IP:PORT
            -f: FWM: 防火墙标记 
                service-address: Mark Number
        修改:-E
        删除:-D -t|u|f service-address

   

    管理集群服务中的RS
        添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
            -t|u|f service-address:事先定义好的某集群服务
            -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
            [-g|i|m]: LVS类型    
                -g: DR模型
                -i: TUN模型
                -m: NAT模型
            [-w weight]: 定义服务器权重
        修改:-e
        删除:-d -t|u|f service-address -r server-address


    查看
        -L|l
            -n: 数字格式显示主机地址和端口
            --stats:统计数据
            --rate: 速率
            --timeout: 显示tcp、tcpfin和udp的会话超时时长
            -c: 显示当前的ipvs连接状况

    删除所有集群服务
        -C:清空ipvs规则
    保存规则
        -S 
        # ipvsadm -S > /path/to/somefile
    载入此前的规则:
        -R
        # ipvsadm -R < /path/form/somefile

我这里在dir上面添加的规则如下:

ipvsadm -A -t 192.168.116.137:80 -s rr
ipvsadm -a -t 192.168.116.137:80 -r 192.168.113.129 -m
ipvsadm -a -t 192.168.116.137:80 -r 192.168.113.130 -m

然后再dir上面访问测试页面:

image.png


注意:ipvs是在内核中工作,下次重启会导致服务不见了,所以要保存规则