NAT实现虚拟服务器 (VS/NAT)
NAT的工作原理是报文头(目标地址、源地址、目标端口)被正确改写后,客户相信他们连接一个IP地址,而不同IP地址的服务器也认为他们是与客户直接相连的。由此,可以用NAT方法将不同IP地址的并行网络服务变成一个IP上的网络虚拟服务。
VS/NAT 体系结构如下图所示。在一组服务器前端有一个调度器,他们通过Switch/HUB连接的。这些服务器提供相同的网络服务、相同的内容,即不管请求被派发到哪一台后端的realserver,执行结果都是一样的。服务内容可以复制到每台服务器的本地硬盘中,也可以通过网络文件系统(例如NFS)共享,也可以通过一个分布式的文件系统来提供。
客户端通过Virtual IP 访问网络服务器时,请求到达调度器,调度器根据连接调度算法挑选一台
后端的realserver,将报文的Virtual IP改为选定的readlserver的IP地址,报文的目标端口跟改为
选定readlserver的指定端口,最后将修改后的报文发送给readlserver。同时,调度器在连接hash
表中记录这个链接,往这个链接的下一个报文到来时,从连接hash表中可以获得原选定的readlserver
服务器的地址和端口,进行同样的改写操作,并将报文发送给原选定readlserver。
当来自真实服务器的响应报文经过调度器时,调度去将响应报文的源地址和源端口改为Virtual IP
对应的端口和地址,再把报文返回给用户。 我们在连接上引入一个状态机,不同的报文会使得
连接处于不同的状态,不同的状态有不同的超时值。在TCP连接中,根据标准的TCP有限状态机
进行状态转移;在UDP中,我们只设置一个UDP状态。不同状态的超时值是可以设置的,在缺省
状态下,SYN状态的超时未1min,ESTABLISHED状态的超时值为15min,FIN的为1min;UDP状
态超时值为5min。当连接终止或者超时,调度器会将这个连接从hash表中删除。
这样,客户端只是看见了Virtual IP在提供服务,而服务器的后端集群对用户来说就是透明的。对
改写后的报文,应用增量调整checksum算法调整TCP checksum的值,避免扫描整个报文来计算
Checksum的开销。
在一些网络服务中,他们将IP地址和端口号在报文的数据中传送,若我们只对报文头的IP地址和端口
做转换,这样会出现不一致的结果,服务会中断,所以针对这些服务,需要编写响应的模块来转换报文
中的IP地址或者端口号,比如这些: FTP、IRC、H.323、Real Video、VDOLive、PPTP
下面举个例子来说明VS/NET
我们假定请求者的IP地址是1.1.1.1
source | dest |
---|---|
1.1.1.1:23456 | 202.103.106.5:80 |
调度器根据调度算法选定一台realserver,假如是172.16.0.3
source | dest |
---|---|
202.103.106.5:22122 | 172.16.0.3:8000 |
从服务器返回的报文
source | dest |
---|---|
172.16.0.3:8000 | 202.103.106.5:22122 |
响应报文的源地址修改为Virtual IP端口修改为80,并返回给客户端
source | dest |
---|---|
202.103.106.5:80 | 1.1.1.1:23456 |
虚拟机实现
实验需要机器
Scheduler:
vmware虚拟机 :两个网卡,一个配置外网地址,我们假设外网为192.168.1.0网段,一个配置内网,
可以调成vmnet2
ens33:192.168.1.105/24
ens37:172.16.0.3/24
ipvsadm -A -t 192.168.1.105:80 -s rr 开启集群服务,轮巡调度
ipvsadm -a -t 192.168.1.105:80 -r 172.16.0.1:80 -m -w 1
ipvsadm -a -t 192.168.1.105:80 -r 172.16.0.2:80 -m -w 1
# {-m NAT|-g DR|-i TUN}
接下来配置我们的后端server
server1
也选择vmnet2模式
IP: 172.16.0.1/24
ifconfig ens33 172.16.0.1/24
route add default gw 172.16.0.3
开启http服务,关闭iptables selinux
setenforce 0
iptables -F
systemct start nginx
server2
也选择vmnet2模式
IP: 172.16.0.2/24
ifconfig ens33 172.16.0.2/24
route add default gw 172.16.0.3
开启http服务,关闭iptables selinux
setenforce 0
iptables -F
systemct start nginx
接下来我们就可以访问192.168.1.105:80来访问集群服务了
O(∩_∩)O哈哈~