LVS FULLNAT模式

一、 LVS简介

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,现在已经是 Linux标准内核的一部分。LVS是一种叫基于TCP/IP的负载均衡技术,转发效率极高,具有处理百万计并发连接请求的能力。

宗旨:

  • 使用集群技术和Linux操作系统实现一个高性能、高可用的服务器.
  • 很好的可伸缩性(Scalability)
  • 很好的可靠性(Reliability)
  • 很好的可管理性(Manageability)。

特点:

可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份),而IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。

二、VS/NAT,VS/DR,VS/TUN转发模式介绍

2.1 DR模式(Direct Routing)

DR模式下,客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会改写请求包的MAC地址为后端RS的MAC地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。所以DR模式的转发效率是最高的,特别适合下行流量较大的业务场景,比如请求视频等大文件。

DR模式的特点:

1. 数据包在LB转发过程中,源/目的IP、端口都不会变化。
2.每台RS上都必须在环回网卡上绑定LB的虚拟服务IP。 因为LB转发时并不会改写数据包的目的IP,所以RS收到的数据包的目的IP仍是LB的虚拟服务IP。为了保证RS能够正确处理该数据包,而不是丢弃,必须在RS的环回网卡上绑定LB的虚拟服务IP。这样RS会认为这个虚拟服务IP是自己的IP,自己是能够处理这个数据包的。否则RS会直接丢弃该数据包!
3. RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致。 因为LB不会改写数据包的目的端口,所以RS服务的监听端口必须和虚拟服务端口一致,否则RS会直接拒绝该数据包。
4.RS处理完请求后,响应直接回给客户端,不再经过LB。 因为RS收到的请求数据包的源IP是客户端的IP,所以理所当然RS的响应会直接回给客户端,而不会再经过LB。这时候要求RS和客户端之间的网络是可达的。
5.LB和RS须位于同一个子网。 因为LB在转发过程中需要改写数据包的MAC为RS的MAC地址,所以要能够查询到RS的MAC。而要获取到RS的MAC,则需要保证二者位于一个子网,否则LB只能获取到RS网关的MAC地址。

2.2 NAT模式(Network Address Translation)

NAT模式下,请求包和响应包都需要经过LB处理。当客户端的请求到达虚拟服务后,LB会对请求包做目的地址转换(DNAT),将请求包的目的IP改写为RS的IP。当收到RS的响应后,LB会对响应包做源地址转换(SNAT),将响应包的源IP改写为LB的IP。

NAT模式的特点:

1. LB会修改数据包的ip地址。 对于请求包,会进行DNAT;对于响应包,会进行SNAT。
2. LB会透传客户端IP到RS(DR模式也会透传)。
3. 需要将RS的默认网关地址配置为LB的浮动IP地址。 因为RS收到的请求包源IP是客户端的IP,为了保证响应包在返回时能走到LB上面,所以需要将RS的默认网关地址配置为LB的虚拟服务IP地址。当然,如果客户端的IP是固定的,也可以在RS上添加明细路由指向LB的虚拟服务IP,不用改默认网关。
4. LB和RS须位于同一个子网,并且客户端不能和LB/RS位于同一子网。 因为需要将RS的默认网关配置为LB的虚拟服务IP地址,所以需要保证LB和RS位于同一子网。又因为需要保证RS的响应包能走回到LB上,则客户端不能和RS位于同一子网。否则RS直接就能获取到客户端的MAC,响应包就直接回给客户端了,不会走网关,也就走不到LB上面了。这时候由于没有LB做SNAT,客户端收到的响应包源IP是RS的IP,而客户端的请求包目的IP是LB的虚拟服务IP,这时候客户端无法识别响应包,会直接丢弃。

2.3 TUNNEL模式

IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。

数据流向客户端请求 VIP 时,通过因特网到达调度器,调度器收到数据包后进行封
装,即在原有的包头加上 IP Tunnel 的包头,然后通过调度算法发送给真实服务器,真实服务器再进行拆包,并且与调度器达成协议,从而对请求做出响应,直接由公网达到客户端,此时的源 IP 是 VIP,原理同 DR 模式。
优点:相对 NAT 模式来说,可以支持更大的访问量
缺点:需要隧道协议

三、LVS FULLNAT基本原理

LVS的NAT服务只提供了DNAT的功能。如果把经过了LVS服务的包在出LVS主机的时候,再做SNAT处理,就能够实现fullnat了。

LVS FULLNAT模式_第1张图片

(1)客户端将请求报文发送给VS;cip->vip
(2)VS将请求报文的目的地址修改为后端真实服务器(DNAT),源地址改为自己的ip地址(SNAT),发送给后端真实服务器;dip->rip
(3)后端服务器在处理完之后要将响应的报文返回给Lvs;rip->dip
(4)LVS将返回的数据包源地址改为自己(SNAT),目的地址改为客户端(DNAT),发送给客户端;vip->cip
数据流走向:Client -> Vs -> Rs -> Vs -> client

注:cip为客户端的地址,vip为虚拟地址,rip为真实的服务器,dip为本地地址,SNAT为来源地址转换,DNAT为目的地址转换

架构特点:这是一种对nat模型的改进,是一个扩展,使得RS与Director可以处于不同网络,负载均衡器可以独立的和真实服务器进行数据包的传送。

1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络,因此RIP的网关一般不会指向DIP
2.RS收到的请求报文源地址是DIP,因此只需响应给DIP;但Director还要将其发往Client
3.请求和响应报文都经由Director
4.相对NAT模式,可以更好的实现LVS-RealServer间跨VLAN通讯
5.支持端口映射

LVS负载均衡常见工作模式总结:

lvs-nat与lvs-fullnat:请求和响应报文都经由Director

  • lvs-nat:RIP的网关要指向DIP (负载均衡器和真实服务器必须在同一局域网内)
  • lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信

lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发Client

  • lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
  • lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

四、IPVS FULLNAT实践

LVS的IP负载均衡技术是通过IPVS模块实现的。IPVS模块是LVS集群的核心软件模块,它安装在LVS集群作为负载均衡的主节点上,虚拟出一个IP地址和端口对外提供服务。用户通过访问这个虚拟服务(VS),然后访问请求由负载均衡器(LB)调度到后端真实服务器(RS)中,由RS实际处理用户的请求给返回响应。

ipvs主要参数:

添加虚拟服务器
    语法:ipvsadm -A [-t|u|f]  [vip_addr:port]  [-s:指定算法]
    -A:添加
    -t:TCP协议
    -u:UDP协议
    -f:防火墙标记
    -s:指定算法
    -D:删除虚拟服务器记录
    -E:修改虚拟服务器记录
    -C:清空所有记录
    -L:查看
添加后端RealServer
    语法:ipvsadm -a [-t|u|f] [vip_addr:port] [-r ip_addr] [-g|i|m] [-w 指定权重]
    -a:添加
    -t:TCP协议
    -u:UDP协议
    -f:防火墙标记
    -r:指定后端realserver的IP
    -g:DR模式
    -i:TUN模式
    -m:NAT模式
    -q:FULLNAT模式
    -w:指定权重
    -d:删除realserver记录
    -e:修改realserver记录
    -l:查看
通用:
    ipvsadm -ln:查看规则

测试模型:
LVS FULLNAT模式_第2张图片

VM1: eth0  10.1.1.10/24

VM2: eth0  10.1.1.1/24
     eth1  192.168.10.1/24

VM3: eth0  192.168.10.2/24

lvs节点fullnat配置示例:

ipvsadm -A -t 10.1.1.1:80 -s rr
ipvsadm -a -t 10.1.1.1:80 -r 192.168.10.2:22 -q -w 1 //DNAT
ipvsadm -P -t 10.1.1.1:80 -z 192.168.10.1:90  //SNAT

测试SSH:
ssh -p 80 [email protected]
正常可以登录到VM3上

# ipvsadm -h
ipvsadm v1.31 2019/12/24 (compiled with popt and IPVS v1.2.1)
Usage:
  ipvsadm -A|E virtual-service [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags] [--tcp_draining_timeout timeout]
  ipvsadm -D virtual-service
  ipvsadm -C
  ipvsadm -R
  ipvsadm -S [-n]
  ipvsadm -P|Q -t|u|f virtual-service -z local-address
  ipvsadm -a|e virtual-service -r server-address [options]
  ipvsadm -d virtual-service -r server-address
  ipvsadm -L|l [virtual-service] [options]
  ipvsadm -Z [virtual-service]
  ipvsadm --set tcp tcpfin udp
  ipvsadm --start-daemon {master|backup} [daemon-options]
  ipvsadm --stop-daemon {master|backup}
  ipvsadm --set-vlanflag [0/1]
  ipvsadm --get-vlanflag
  ipvsadm -h

Commands:
Either long or short options are allowed.
  --add-service     -A        add virtual service with options
  --edit-service    -E        edit virtual service with options
  --delete-service  -D        delete virtual service
  --clear           -C        clear the whole table
  --restore         -R        restore rules from stdin
  --add-laddr       -P        add local address
  --del-laddr       -Q        del local address
  --save            -S        save rules to stdout
  --add-server      -a        add real server with options
  --edit-server     -e        edit real server with options
  --delete-server   -d        delete real server
  --list            -L|-l     list the table
  --zero            -Z        zero counters in a service or all services
  --set tcp tcpfin udp        set connection timeout values
  --start-daemon              start connection sync daemon
  --stop-daemon               stop connection sync daemon
  --set-vlanflag              set value of vlan flag
  --get-vlanflag              get value of vlan flag
  --help            -h        display this help message

virtual-service:
  --tcp-service|-t  service-address   service-address is host[:port[:subnet_id]]
  --udp-service|-u  service-address   service-address is host[:port[:subnet_id]]
  --sctp-service    service-address   service-address is host[:port[:subnet_id]]
  --fwmark-service|-f fwmark          fwmark is an integer greater than zero
  --raw-service|-W  service-address   service-address is host[:port[:subnet_id]]

Options:
  --ipv6         -6                   fwmark entry uses IPv6
  --scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq|fo|ovf|mh,
                                      the default scheduler is   --vsestablish-timeout -V [timeout]  set up vs private establish state timeout
  --tcp_draining_timeout   [timeout]  set tcp_draining timeout
wlc.
  --pe            engine              alternate persistence engine may be sip,
                                      not set by default.
  --persistent   -p [timeout]         persistent service
  --netmask      -M netmask           persistent granularity mask
  --laddr        -z local-address     local-address is host[:oif_name]
  --real-server  -r server-address    server-address is host[:port[:oif_name]]
  --gatewaying   -g                   gatewaying (direct routing) (default)
  --ipip         -i                   ipip encapsulation (tunneling)
  --fullnat      -q                   fullnat mode
  --masquerading -m                   masquerading (NAT)
  --tun-type      type                one of ipip|gue|gre,
                                      the default tunnel type is ipip.
  --tun-port      port                tunnel destination port
  --tun-nocsum                        tunnel encapsulation without checksum
  --tun-csum                          tunnel encapsulation with checksum
  --tun-remcsum                       tunnel encapsulation with remote checksum
  --weight       -w weight            capacity of real server
  --u-threshold  -x uthreshold        upper threshold of connections
  --l-threshold  -y lthreshold        lower threshold of connections
  --connection   -c                   output of current IPVS connections
  --timeout                           output of timeout (tcp tcpfin udp)
  --daemon                            output of daemon information
  --stats                             output of statistics information
  --rate                              output of rate information
  --exact                             expand numbers (display exact values)
  --thresholds                        output of thresholds information
  --persistent-conn                   output of persistent connection info
  --tun-info                          output of tunnel information
  --nosort                            disable sorting output of service/server entries
  --sort                              does nothing, for backwards compatibility
  --ops          -o                   one-packet scheduling
  --numeric      -n                   numeric output of addresses and ports
  --sched-flags  -b flags             scheduler flags (comma-separated)
Daemon Options:
  --syncid sid                        syncid for connection sync (default=255)
  --sync-maxlen length                Max sync message length (default=1472)
  --mcast-interface interface         multicast interface for connection sync
  --mcast-group address               IPv4/IPv6 group (default=224.0.0.81)
  --mcast-port port                   UDP port (default=8848)
  --mcast-ttl ttl                     Multicast TTL (default=1)

参考:
https://blog.csdn.net/qq_42409495/article/details/121905868

你可能感兴趣的:(云计算虚拟化,Linux/Unix,计算机网络,lvs,服务器,网络)