LVS服务NAT工作模式的实现过程

实验环境:192.168.16.0/24 为内网地址,172.16.0.0/16 为外网地址。

注意:

充当外网的网卡信息一定要使用桥接网络,不能使用 nat。

主机名 IP 扮演角色
CIP 172.16.17.77 桥接 客户端
LVS 172.16.17.17 桥接 / 192.168.16.7 仅主机 LVS 调度器
RS1 192.168.16.17 仅主机 后端 RS 服务器
RS2 192.168.16.27 仅主机 后端 RS 服务器

3.1.1 后端 RS 服务器上操作

1、配置 RS1 和 RS2 服务器上的网卡信息

# 在 RS1 服务上配置网卡信息
[14:57:50 root@rs1 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0 
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.16.17        # 配置 IP 为上图中 RIP 1
GATEWAY=192.168.16.7        # 网关指定我们的 LVS 服务器的仅主机 IP
PREFIX=24

[14:59:34 root@rs1 ~]#systemctl restart network

# 在 RS2 服务上配置网卡信息
[14:57:59 root@rs2 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.16.27        # 配置 IP 为上图中 RIP 2
GATEWAY=192.168.16.7        # 网关指定我们的 LVS 服务器的仅主机 IP
PREFIX=24  

[15:00:03 root@rs2 ~]#systemctl restart network

2、在后端的这两台 RS 服务器上部署 httpd 服务(注意这里我是开了另外一块 nat 模式的网卡,安装完了 htppd 之后我这将这块网卡下载掉)

# 在 rs1 节点上安装 httpd 服务
[15:28:18 root@rs1 ~]#yum install httpd -y

# 在 rs2 节点上安装 httpd
[15:25:02 root@rs2 ~]#yum install httpd -y

3、在这两个后端 RS 服务器上编写 html 文件,并且启动 httpd 服务

# 在 RS1 节点上编写 html 文件
[15:29:40 root@rs1 ~]#echo "RS1 RS1" > /var/www/html/index.html

# 在 RS1 节点上启动 httpd
[15:30:13 root@rs1 ~]#systemctl enable --now httpd

# 在 RS2 节点上编写 html 文件
[15:30:19 root@rs2 ~]#echo "RS2 RS2" > /var/www/html/index.html

# 在 RS2 节点上启动 httpd
[15:30:23 root@rs2 ~]#systemctl enable --now httpd

3.1.2 前端 LVS 服务器上操作

1、在 LVS 服务器上配置网卡信息

# 这个是 bridge 网卡信息,和 CIP 客户端主机都在公网上
[16:11:21 root@lvs~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=172.16.17.17
GATEWAY=172.16.0.1
PREFIX=24
DNS1=114.114.114.114
DNS2=8.8.8.8 

# 这个是仅主机的网卡信息,和后端 RS 服务器都在私有网络上
[15:02:25 root@lvs ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth1
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.16.7
PREFIX=24

# 重启网络服务
[16:20:33 root@lvs ~]#systemctl restart network

2、现在我们的 LVS 服务器就已经能够 ping 了所有主机。

# ping cip 客户端主机能够 ping 通
[16:12:31 root@lvs ~]#ping 172.16.17.77
PING 172.16.17.77 (172.16.17.77) 56(84) bytes of data.
64 bytes from 172.16.17.77: icmp_seq=1 ttl=64 time=0.811 ms

# ping 后端 RS1 服务器能够 ping 通
[16:12:14 root@lvs ~]#ping 192.168.16.17
PING 192.168.16.17 (192.168.16.17) 56(84) bytes of data.
64 bytes from 192.168.16.17: icmp_seq=1 ttl=64 time=0.722 ms

# ping 后端 RS2 服务器能够 ping 通
[16:12:47 root@lvs ~]#ping 192.168.16.27
PING 192.168.16.27 (192.168.16.27) 56(84) bytes of data.
64 bytes from 192.168.16.27: icmp_seq=1 ttl=64 time=1.40 ms

3、在 LVS 经过测试已经能够访问后端 RS 服务器的 web 页面

[15:32:18 root@lvs ~]#curl 192.168.16.17
RS1 RS1
[15:32:20 root@lvs ~]#curl 192.168.16.27
RS2 RS2

4、开启路由转发功能

# 添加内核路由转发参数
[15:44:55 root@lvs ~]#vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1                                                                                                      
# 使其生效
[15:46:57 root@lvs ~]#sysctl -p
net.ipv4.ip_forward = 1

5、安装 ipvsadm

[15:33:28 root@lvs ~]#yum install ipvsadm -y

6、配置相关的 LVS 调度规则

# 通过 ipvsadm -Ln 查看默认是没有任何调度规则的
[15:34:14 root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  
# 在 LVS 服务器上先添加集群信息
[16:26:30 root@lvs ~]#ipvsadm -A -t 172.16.17.17:80
ipvsadm -A# 增加集群规则
-t 172.16.17.17:80:     # TCP 协议的 172.16.17.17 主机的 80端口

# 然后通过ipvsadm -Ln  现在里面就加了一条集群规则,走的是 TCP 协议而且 VIP 为 172.16.17.17:80 端口为80 默认算法是 wlc
[16:26:44 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.16.17.17:80 wlc

7、启用了规则之后,我们在 LVS 服务器上将后端的 SR1 和 SR2 这两个 R S服务器添加到集群规则中。

# 将 rs1 节点添加至 LVS 规则中
[16:27:06 root@lvs ~]#ipvsadm -a -t172.16.17.17:80 -r 192.168.16.17:80 -m

# 将 rs2 节点添加至 LVS 规则中
[16:27:39 root@lvs ~]#ipvsadm -a -t172.16.17.17:80 -r 192.168.16.27:80 -m

ipvsadm -a# 增加新的 RS 服务
-t10.0.0.7:80:      # 添加至 10.0.0.7:80 这个集群规则中并且是 TCP 协议
-r 192.168.16.27:80:# 后端真实的 RS 服务器 IP 和端口

8、现在通过cat /proc/net/ip_vs然后查看这个文件中已经定义了三条调度规则,而且都是 16 进制。现在已经将 ipvsadm 规则定义完了

[16:27:42 root@lvs ~]#cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP  AC101111:0050 wlc  
  -> C0A8101B:0050      Masq    1      0          0         
  -> C0A81011:0050      Masq    1      0          0  

9、定义完了规则之后我们可以通过在 LVS 主机上是查看不了 80 端口的,因为他不是在应用层上实现的,他是由内核级实现的所以他这不会打开80端口。但是客户端能够访问。

[16:27:59 root@lvs ~]#ss -ntl

3.1.3 客户端访问测试

现在我们去 CIP 客户端上写一个循环,为了后面更好的测试 LVS 的工作效果。由此实现了 NAT 工作模式的 LVS 调度器服务,他访问的 Lvs 主机是没有 http 服务和 80 端口,因为 LVS 主机调的后面两台 RS 服务器的 http 服务。

[16:28:05 root@cip ~]#while true;do curl 172.16.17.17;sleep 0.5; done
RS2 RS2
RS1 RS1
RS2 RS2
RS1 RS1

3.1.4 总结

假如有一个RS服务器宕机了他就会显示一个报错

1、这里我将 RS1 主机的http服务停了模拟宕机

[16:32:14 root@rs1 ~]#systemctl stop httpd

2、然后再使用 CIP 客户端访问就会出现报错,这个时候就需要用到我们的 keepalived实现高可用

[16:28:59 root@cip ~]#while true;do curl 172.16.17.17;sleep 0.5; done
RS2 RS2
curl: (7) Failed connect to 172.16.17.17:80; Connection refused
RS2 RS2
curl: (7) Failed connect to 172.16.17.17:80; Connection refused
RS2 RS2
curl: (7) Failed connect to 172.16.17.17:80; Connection refused

注意:

使用 keepalived的时候将 VIP 设置成我们的 LVS 集群 IP 即可

而且后端的 RS 服务也需要部署 keepalived使用 VIP 写入到 ipvsadm 的规则中

如果后端服务器,不是指定的80端口的话就只需要在LVS定义规则的时候添加自己修改的端口即可NAT工作模式支持端口映射

点赞