Linux Virtual Server《二》——NAT、TUN、FULLNAT

Linux Virtual Server《一》

LVS的NAT模型

客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址 Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在连接Hash 表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务 器。当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。我们在连接上引入一个状态机,不同的报文会使得连接处于不同的状态,不同的状态有不同的超时值。在TCP 连接中,根据标准的TCP有限状态机进行状态迁移,这里我们不一一叙述,请参见W. Richard Stevens的《TCP/IP Illustrated Volume I》;在UDP中,我们只设置一个UDP状态。不同状态的超时值是可以设置的,在缺省情况下,SYN状态的超时为1分钟,ESTABLISHED状态的超 时为15分钟,FIN状态的超时为1分钟;UDP状态的超时为5分钟。当连接终止或超时,调度器将这个连接从连接Hash表中删除。

首先,需要确定的一点是,LVS-NAT模型中,所有的网络流量都需要流经DS,即包括请求报文和回应报文。当Client端从浏览器或其他客户端请求http或其它网络服务时,先由我们的DS服务器公网网卡接收,然后通过LVS调度挑选一个RS服务器,并通过内部转发机制从其内网网口转发给选中的RS服务器,最后将RS返回的响应报文通过相同的路线反向转回Client端。
假如这里客户端访问RSA的httpd服务
在这里插入图片描述

SRCDEST
CIP XXXXVIP 80
CIP XXXXRSA 80
RSA 80 (GW指向DIP)CIP XXXX
VIP80CIP XXXX

在这里插入图片描述

经过原路返回
可以替代映射非标准端口
对于LVS它的工作机制潜伏在INPUT前,只要是访问对应端口的直接转发到对应的服务。因为访问特定的端口才会被替代。

lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统

这种模式借助 iptables 的 nat 表来实现
用户的请求到分发器后,通过预设的 iptables 规则,把请求的数据包转发到后端的 rs 上去
rs 需要设定网关为分发器的内网 ip
用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈
在 nat 模式中,只需要分发器有公网 ip 即可,所以比较节省公网 ip 资源

在这里插入图片描述

实验搭建

在这里插入图片描述
环境:
四台主机
一台:Internet client :172.20.0.111/16 (桥接) GW在一个网段即不用配
一台:LVS :eth1 桥接 172.20.222.222/16 eth0 NAT 192.168.32.7/24

两台RS:
RS1:192.168.32.8/24 GW指向192.168.32.7,原路返回
RS1:192.168.32.18/24 GW指向192.168.32.7,原路返回

Internet client 中操作:

[root@Internet ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
NAME=eth0
BOOTPROTO="static"
IPADDR=172.20.0.111
NETMASK=255.255.0.0
DNS1=114.114.114.114
GATEWAY=172.20.222.222
DNS2=8.8.8.8
[root@Internet ~]#ip route 
default via 172.20.222.222 dev eth0 proto static metric 100 
172.20.0.0/16 dev eth0 proto kernel scope link src 172.20.0.111 metric 100

RS1:192.168.32.8中操作:

[root@RS1 ~]#yum install httpd -y
[root@RS1 ~]#systemctl start httpd
[root@RS1 ~]#vim /var/www/html/index.html
[root@RS1 ~]#cat /var/www/html/index.html
RS1 web server 1

[root@RS1 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@RS1 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
DEVICE=eth0
NAME=eth0
BOOTPROTO="static"
IPADDR=192.168.32.8
NETMASK=255.255.255.0
GATEWAY=192.168.32.7       #网关指向原路返回
DNS1=114.114.114.114
DNS2=8.8.8.8

[root@RS1 ~]#nmcli c reload
[root@RS1 ~]#nmcli c up eth0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/12)
[root@RS1 ~]#ip route
default via 192.168.32.7 dev eth0 proto static metric 100 
192.168.32.0/24 dev eth0 proto kernel scope link src 192.168.32.8 metric 100 
[root@RS1 ~]#

RS2:192.168.32.18中操作:

[root@RS2 ~]#yum install httpd -y
[root@RS2 ~]#systemctl start httpd
[root@RS2 ~]#vim /var/www/html/index.html
[root@RS2 ~]#cat /var/www/html/index.html
RS2 web server 2

[root@RS2 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0 
[root@RS2 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE="Ethernet"
DEVICE=eth0
NAME=eth0
BOOTPROTO="static"
IPADDR=192.168.32.18
NETMASK=255.255.255.0
GATEWAY=192.168.32.7     #网关指向原路返回
DNS1=114.114.114.114
DNS2=8.8.8.8

[root@RS2 ~]#nmcli c reload
[root@RS2 ~]#nmcli c up eth0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@RS2 ~]#ip route
default via 192.168.32.7 dev eth0 proto static metric 100 
192.168.32.0/24 dev eth0 proto kernel scope link src 192.168.32.18 metric 100 
[root@RS2 ~]#

LVS 服务器中操作:
先测试一下是否在LVS调度器中能否正常访问。

[root@LVS ~]#curl 192.168.32.8
RS1 web server 1
[root@LVS ~]#curl 192.168.32.18
RS2 web server 2
[root@LVS ~]#

在没有配置LVS调度器之前在外网访问不能访问。
在这里插入图片描述

LVS 服务器中操作:
配置LVS 服务器:

[root@LVS ~]#yum install ipvsadm -y

[root@LVS ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  
[root@LVS ~]#ipvsadm -A -t 172.20.222.222:80 -s rr
[root@LVS ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.20.222.222:80 rr

[root@LVS ~]#ipvsadm -a -t 172.20.222.222:80 -r 192.168.32.8 -m   #-m表示NAT模式
[root@LVS ~]#ipvsadm -a -t 172.20.222.222:80 -r 192.168.32.18 -m

[root@LVS ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.20.222.222:80 rr
  -> 192.168.32.8:80              Masq    1      0          0         
  -> 192.168.32.18:80             Masq    1      0          0         
[root@LVS ~]#

lvs类型:
-g: gateway, dr类型,默认
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重

到了这里依旧还是在外网不能访问,因为LVS服务没有打开路由转发功能

[root@LVS ~]#cat /proc/sys/net/ipv4/ip_forward
0
[root@LVS ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
[root@LVS ~]#cat /proc/sys/net/ipv4/ip_forward
1

Internet client 中操作:
测试是否调度成功

[root@Internet ~]#while : ;do curl 172.20.222.222 ;sleep 2 ;done 
RS1 web server 1
RS2 web server 2
RS1 web server 1
RS2 web server 2
RS1 web server 1
RS2 web server 2
RS1 web server 1
RS2 web server 2
......
[root@LVS ~]#cat /proc/net/ip_vs_conn  #连接数
Pro FromIP   FPrt ToIP     TPrt DestIP   DPrt State       Expires PEName PEData
TCP AC14006F D550 AC14DEDE 0050 C0A82012 0050 TIME_WAIT       118
TCP AC14006F D54E AC14DEDE 0050 C0A82008 0050 TIME_WAIT       116
TCP AC14006F D54C AC14DEDE 0050 C0A82012 0050 TIME_WAIT       114
TCP AC14006F D548 AC14DEDE 0050 C0A82012 0050 TIME_WAIT       110
TCP AC14006F D54A AC14DEDE 0050 C0A82008 0050 TIME_WAIT       112
TCP AC14006F D546 AC14DEDE 0050 C0A82008 0050 TIME_WAIT       108
TCP AC14006F D544 AC14DEDE 0050 C0A82012 0050 TIME_WAIT       106
[root@LVS ~]#
[root@LVS ~]#ipvsadm -Lnc    
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:44  TIME_WAIT   172.20.0.111:54678 172.20.222.222:80  192.168.32.8:80
TCP 01:46  TIME_WAIT   172.20.0.111:54680 172.20.222.222:80  192.168.32.18:80
TCP 01:14  TIME_WAIT   172.20.0.111:54648 172.20.222.222:80  192.168.32.18:80
TCP 01:02  TIME_WAIT   172.20.0.111:54636 172.20.222.222:80  192.168.32.18:80
TCP 00:34  TIME_WAIT   172.20.0.111:54608 172.20.222.222:80  192.168.32.18:80
TCP 01:28  TIME_WAIT   172.20.0.111:54662 172.20.222.222:80  192.168.32.8:80
TCP 01:34  TIME_WAIT   172.20.0.111:54668 172.20.222.222:80  192.168.32.18:80
TCP 01:52  TIME_WAIT   172.20.0.111:54686 172.20.222.222:80  192.168.32.8:80
TCP 01:30  TIME_WAIT   172.20.0.111:54664 172.20.222.222:80  192.168.32.18:80
TCP 00:38  TIME_WAIT   172.20.0.111:54612 172.20.222.222:80  192.168.32.18:80

[root@LVS ~]#ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  172.20.222.222:80                  95      566      376    37532    44650
  -> 192.168.32.8:80                    47      282      188    18706    22325
  -> 192.168.32.18:80                   48      284      188    18826    22325
[root@LVS ~]#
[root@LVS ~]#ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  172.20.222.222:80                   0        3        2      187      224
  -> 192.168.32.8:80                     0        1        1       80       96
  -> 192.168.32.18:80                    0        2        1      107      128
[root@LVS ~]#

RS服务器改了端口之后调度就会失败,但是LVS不知道后端服务器的是否故障情况,依旧按照算法调度。

LVS的TUN模式

在这里插入图片描述
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首
部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目
标IP是CIP)
在这里插入图片描述
TUN模式特点:

  1. DIP, VIP, RIP可以是公网地址
  2. RS的网关一般不能指向DIP
  3. 请求报文要经由Director,但响应不经由Director
  4. 不支持端口映射
  5. RS的OS须支持隧道功能

在这里插入图片描述
TUN(virtual server via ip tunneling IP 隧道)调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文。此转发方式不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP),由于一般网络服务应答数据比请求报文大很多,采用lvs-tun模式后,集群系统的最大吞吐量可以提高10倍

缺点:由于后端服务器RS处理数据后响应发送给用户,此时需要租借大量IP(特别是后端服务器使用较多的情况下)。

优点:实现lvs-tun模式时,LVS 调度器将TCP/IP请求进行重新封装并转发给后端服务器,由目标应用服务器直接回复用户。应用服务器之间是通过IP 隧道来进行转发,故两者可以存在于不同的网段中。

原路返回

SRCDEST
CIPVIP
CIPRIP
RIPCIP
VIPCIP

LVS的FULLNAT模式

fullnat模式和nat模式比较类似,客户端的请求和响应都会经过lvs,不同的是nat模式下转换仅存在于目的方向,也就是说客户端的发来的请求经过lvs后,请求的目的ip会转化成rs的ip地址,目的端口会转化成rs的目的端口,而在fullnat模式下,客户端发来的请求的源ip和源端口都会被转换成lvs的内网ip地址和端口,同理对于rs回复的响应,nat模式下,响应的目的ip和目的端口均为客户端的,而fullnat模式下,响应的目的ip和目的端口均为lvs内网的,这样lvs收到这个响应后会将源ip和源端口转换成vip的地址和端口,目的ip和目的端口会被转换成客户端的ip地址和端口,也就是说在nat模式下对于客户端的请求仅发生DNAT转换,对于RS的响应仅发生SNAT转换,而fullnat模式下,在请求和响应上都会发生SNAT和DNAT转换;另一点不同是nat模式下要求lvs的内网ip和rs的ip地址在同一网段,lvs和rs之间需要二层交换设备,而fullnat对于请求和响应都会发生DNAT和SNAT所以lvs的内网ip地址可以和rs不再同一网段,这样lvs和rs之间就需要三层交换设备,所以相对于nat模式,fullnat的部署会更加灵活,它不要求lvs的内网ip和rs的ip在同一网段。

通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
fullnat模式特点:

  1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向
    DIP
  2. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
  3. 请求和响应报文都经由Director
  4. 支持端口映射
    注意:此类型kernel默认不支持

原路返回,中间可以添加公网路由,可以距离非常远

SRCDEST
CIPVIP
DIPRIP
RIPDIP
VIPCIP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值