通过NAT实现虚拟服务器(VS/NAT)

由于IPv4中IP地址空间的日益紧张和安全方面的原因,很多网络使用 保留IP地址(10.0.0.0/255.0.0.0、172.16.0.0/255.128.0.0和192.168.0.0 /255.255.0.0)[64, 65, 66]。这些地址不在Internet上使用,而是专门为内部网络预留的。当内部网络中的主机要访问Internet或被Internet访问时,就需要 采用网络地址转换(Network Address Translation, 以下简称NAT),将内部地址转化为Internets上可用的外部地址。NAT的工作原理是报文头(目标地址、源地址和端口等)被正确改写后,客户相信 它们连接一个IP地址,而不同IP地址的服务器组也认为它们是与客户直接相连的。由此,可以用NAT方法将不同IP地址的并行网络服务变成在一个IP地址 上的一个虚拟服务。

VS/NAT的体系结构如图所示。在一组服务器前有一个调度器,它们是通过Switch/HUB相连接的。这些服务器 提供相同的网络服务、相同的内容,即不管请求被发送到哪一台服务器,执行结果是一样的。服务的内容可以复制到每台服务器的本地硬盘上,可以通过网络文件系 统(如NFS)共享,也可以通过一个分布式文件系统来提供。



wKioL1V2PwKT9OhHAAGZSOVR9Bg598.jpg



      客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址 Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在连接Hash 表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务 器。当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。


NAT基本架构实现


环境准备:

设备
软件环境
网络环境
virtual_server(dir)
CentOS 6.6+IPVS(ipvsadm)

eth0 : VIP : 192.168.137.128

(对外服务的IP,客户端访问的IP)

eth1 : IP:192.168.1.121
real_server_a(rsa)
CentOS 6.6+nginx(监控的服务项目)
eth0 : IP:192.168.1.118
real_server_b(rsb)
CentOS 6.6+nginx(监控的服务项目)
eth0 : IP:192.168.1.119

配置方法:

# 首先在rsa与rsb中启动nginx,测试是否可以正常访问
[root@rsa ~]# /etc/init.d/nginx start
正在启动 nginx:                                           [确定]

wKiom1V240bSoqoXAALZhD8WRRU150.jpg

# 为了访问更加直观,我们修改一下主页
[root@rsa ~]# vim /usr/share/nginx/html/index.html
This is test page,this is A.
[root@rsa ~]# /etc/init.d/nginx reload
重新载入 nginx:                                           [确定]
# 我们在看一下

wKioL1V25ifgAcXzAAB5JU7qICQ313.jpg


# 当rsa与rsb的nginx都可以正常访问,我们需要将两台设备的网关修改为dir的内网的IP
[root@rsa ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
UUID=779f98ef-706a-4b8c-9e78-75fa1e79fcab
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
HWADDR=00:0C:29:56:5C:C5
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
IPADDR=192.168.1.118
NETMASK=255.255.255.0
GATEWAY=192.168.1.121
DNS1=202.96.128.166
DNS2=202.96.134.133

[root@rsa ~]# service network restart
正在关闭接口 eth0:                                        [确定]
关闭环回接口:                                             [确定]
弹出环回接口:                                             [确定]
弹出界面 eth0: Determining if ip address 192.168.1.118 is already in use for device eth0...
                                                           [确定]


接下来我们开始配置dir的机器,我们以脚本的形式去配置

[root@dir ~]# vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
# director 服务器上开启路由转发功能: 
echo 1 > /proc/sys/net/ipv4/ip_forward 
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects

# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.1.0/24  -j MASQUERADE
# director设置ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.137.128:80 -s rr 
$IPVSADM -a -t 192.168.137.128:80 -r 192.168.1.118:80 -m -w 1
$IPVSADM -a -t 192.168.137.128:80 -r 192.168.1.119:80 -m -w 1

[root@dir ~]# chmod a+x !$
chmod a+x /usr/local/sbin/lvs_nat.sh
[root@dir ~]# /bin/bash /usr/local/sbin/lvs_nat.sh
# 查看配置的状态
[root@dir ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.137.128:80 rr
  -> 192.168.1.118:80             Masq    1      0          0
  -> 192.168.1.119:80             Masq    1      0          0


接下来我们通过VIP进行访问测试


wKiom1V26Mfh1anWAACHAL4vWIM090.jpg


wKiom1V26PmDDrHOAACIEFn_Blg566.jpg