使用keepalived和HaVip搭建具备高可用能力的SNAT网关

在VPC中,为一台ECS绑定EIP,并在该ECS上搭建代理软件,可以将该ECS实例建设为一个SNAT网关,让同VPC内其他实例将该实例作为公网网关进行公网访问。

然而,这种方式搭建的SNAT网关是个单点,可用性较差。我们可以使用keepalived和HaVip来搭建一个具备主备切换能力的高可用SNAT网关。

## 环境

1.    准备两个EIP。

2.    准备四台ECS实例,在一个VPC的同一个VSwitch下。

  *
192.168.1.201 (绑定了EIP 123.56.16.103):当做跳板机使用,SSH到这台机器上以后,再SSH私网IP跳转到其他机器。

  *
192.168.1.202:SNAT双机中的主实例,一会儿会绑在HaVip上。

  *
192.168.1.203:SNAT双机中的备实例,一会儿会绑在HaVip上。

  *
192.168.1.204:当作需要上网的实例,用它来测试SNAT的效果。

3. 准备一个HaVip:

       私网IP:192.168.1.200

       绑定了EIP:123.56.16.108

       绑定了两个实例:192.168.1.202、192.168.1.203;

 

## 搭建与配置

### Keepalived的安装: 

在要当做SNAT服务器的两台ECS实例上,执行以下keepalived安装流程:

#### 下载:

   
[root@iZ250sept0mZ ~]# wget  
http://www.keepalived.org/software/keepalived-1.2.19.tar.gz

    由于目前这台机器目前不能直接连上公网,所以可以在跳板机上进行wget,然后scp到这两台机器上;

#### 安装:

```bash

[root@iZ250sept0mZ ~]# tar -zxf
keepalived-1.2.19.tar.gz

[root@iZ250sept0mZ ~]# cd keepalived-1.2.19

[root@iZ250sept0mZ keepalived-1.2.19]#
./configure

[root@iZ250sept0mZ keepalived-1.2.19]# make
&& make install

#### 修改配置文件路径:

```bash

[root@iZ250sept0mZ keepalived-1.2.19]# cp
/usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

[root@iZ250sept0mZ keepalived-1.2.19]# cp
/usr/local/etc/sysconfig/keepalived /etc/sysconfig/

[root@iZ250sept0mZ keepalived-1.2.19]#
mkdir /etc/keepalived

[root@iZ250sept0mZ keepalived-1.2.19]# cp
/usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

[root@iZ250sept0mZ keepalived-1.2.19]# cp
/usr/local/sbin/keepalived /usr/sbin/

#### 将keepalived设置为服务,开机启动:

```bash

  [root@iZ250sept0mZ keepalived-1.2.19]# vi
/etc/rc.local    

### 自定义路由配置:

       添加一条自定义路由,目的CIDR为0.0.0.0/0 , 下一跳指向HaVip对象

添加完成后的效果如下:

### 开启内核的IP转发选项:

在两台SNAT服务器ECS实例上都进行如下修改:

运行:`sysctl -w net.ipv4.ip_forward=1`

为了保证实例重启后依然是开启这个选项的,需要对/etc/sysctl.conf 这个配置文件进行修改,将net.ipv4.ip_forward的值改为1,见下图:

### SNAT配置

在两台当做SNAT服务器的ECS实例上,准备两个shell脚本:

* 脚本一: 用于主备切换时让新的master机自动开启IP转发、加载SNAT规则,实现SNAT转发:

* 脚本二: 用于主机切换成备机时或者主机keepalived出错时去除SNAT转发规则(不去除的话,上网会有问题);

P.S. 如果备机带着这几条SNAT规则工作,会导致主机无法直接上网;

两个脚本的内容如下:

脚本一:/etc/keepalived/scripts/ha_vip_start.sh

```bash

#!/bin/bash

echo "start; `date`" >>
/tmp/log

sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A POSTROUTING -d
100.64.0.0/10 -j RETURN

iptables -t nat -A POSTROUTING -d
10.0.0.0/8 -j RETURN

iptables -t nat -A POSTROUTING -s
192.168.0.0/16 ! -p vrrp -j SNAT --to-source 192.168.1.200

需要注意的地方:

1.    红字地方尤其需要注意,应该是HaVip的私网IP。

2.    需要注意几条规则的顺序,要按照上文给出的顺序才行。

3.    如果您的VPC的CIDR是10.0.0.0/8网段,那么需要略过第二条规则不加。

脚本二:/etc/keepalived/scripts/ha_vip_stop.sh

```bash

#!/bin/bash

echo "stop; `date`" >>
/tmp/log

iptables -t nat -F

### Keepalived配置

配置文件位置:/etc/keepalived/keepalived.conf

Master实例 (例子中的192.168.1.202)的完整配置文件:

! Configuration File for keepalived

global_defs {

  
notification_email {

    
acassen@firewall.loc

    
failover@firewall.loc

    
sysadmin@firewall.loc

   }

  
notification_email_from zhao.wang_havip@firewall.loc

  
smtp_server 192.168.200.1

  
smtp_connect_timeout 30

  
router_id LVS_DEVEL

}

vrrp_instance VI_1 {

   
state MASTER

   
interface eth0

   
virtual_router_id 51

   
priority 100

   
advert_int 1

   
authentication {

       
auth_type PASS

       
auth_pass 1111

    }

   
virtual_ipaddress {

       
192.168.1.200 dev eth0 label eth0:havip

}

   
notify_master /etc/keepalived/scripts/ha_vip_start.sh

   
notify_backup /etc/keepalived/scripts/ha_vip_stop.sh

   
notify_fault 
/etc/keepalived/scripts/ha_vip_stop.sh

   
notify_stop   /etc/keepalived/scripts/ha_vip_stop.sh

   
unicast_src_ip 192.168.1.202

   
unicast_peer {

           
192.168.1.203

                 }

}

注意:配置文件中,

  *
`192.168.1.202`和`192.168.1.203`应该换成你的两台实例的私网IP; 注意两个IP分别的位置,不要写反了。

  *
`192.168.1.200`应该是你的HaVip的私网IP地址。

backup 实例(例子中的192.168.1.203)的完整配置文件:

! Configuration File for keepalived

global_defs {

  
notification_email {

    
acassen@firewall.loc

    
failover@firewall.loc

    
sysadmin@firewall.loc

   }

  
notification_email_from zhao.wang_havip@firewall.loc

   smtp_server
192.168.200.1

  
smtp_connect_timeout 30

  
router_id LVS_DEVEL

}

vrrp_instance VI_1 {

   
state BACKUP

   
interface eth0

   
virtual_router_id 51

   
priority 99

   
advert_int 1

   
authentication {

       
auth_type PASS

       
auth_pass 1111

    }

   
virtual_ipaddress {

       
192.168.1.200 dev eth0 label eth0:havip

}

   
notify_master /etc/keepalived/scripts/ha_vip_start.sh

   
notify_backup /etc/keepalived/scripts/ha_vip_stop.sh

   
notify_fault 
/etc/keepalived/scripts/ha_vip_stop.sh

   
notify_stop  
/etc/keepalived/scripts/ha_vip_stop.sh

   
unicast_src_ip 192.168.1.203

   
unicast_peer {

           
192.168.1.202

                 }

}

注意:同样需要注意其中的私网IP,换成你的两台实例的私网IP;注意对应位置,不要写反了。

## 启动服务、验证SNAT效果

### 在202上启动keepalived

```bash

[root@iZ25eb8j6mqZ ~]# service keepalived
start

观察log,进入master状态:

 

查看网卡配置,出现了192.168.1.200的ip;

查看iptables规则,出现了SNAT相关规则;

### 在204上验证上网效果

ping公网网址可以通;traceroute可以看到第一跳为192.168.1.202

### 在203上启动keepalived

观察log,进入backup状态:

查看网卡信息,发现并没有出现192.168.1.200,因为此时202是master,203还只是个备胎:

### 在204上验证上网效果

可以看到,和刚才验证的效果一样

### 将202的keepalived停掉

[root@iZ25eb8j6mqZ ~]# service keepalived
stop

可以观察到:

1.    202的网卡上不再有192.168.1.200

2.    203的keepalived log显示,进入master状态

3.    203
的网卡上出现192.168.1.200

### 在204上验证上网效果

可以看到,依然可以ping通,traceroute变成了第一跳为203。说明,此时203成为了master,接管了vip。

### 将202的keepalived重新启动

观察到:

1.    203回到backup状态,并移除192.158.1.200的ip

2.    202进入master状态,并接管vip

### 在204上验证上网效果

可以看到,依然可以ping通,traceroute变回第一跳为202

上面的主备迁移过程,您也可以停机/系统重启的方式模拟宕机,来观察vip的切换。

时间: 2024-10-16 02:07:54

使用keepalived和HaVip搭建具备高可用能力的SNAT网关的相关文章

搭建Oracle高可用数据库环境

24*7(有些叫法也为24*7*365)的高可用系统越来越多的受到广泛重视与应用,那是因为在实际环境中,不间断的系统代表的就是不间断的义务收入.但是 ◆怎么样搭建与管理24*7的高可用环境? ◆各种各样的高可用环境之间到底有什么差别? ◆我们是否适合于哪种环境? ◆现在高可用环境的主要方式以及以后的发展趋势是什么? 这些话题,都是决策者与实施者都应当考虑的,也是本文所探讨的,我们需要搭建一个怎么样的高可用环境,才能真正做到最适合. 一.什么是高可用(High Availability) 在高可用

keepalived是如何实现MySQL高可用的?

首先我们来看一下通过Keepalived实现,需要对MySQL有什么要求 MySQL需要采用MM复制结构,也就是master-master.当一台为主库的时候,备库开启只读模式(set global read_only=1) 然后我们来看一下数据库在不同情况下,切换是如何进行的: MySQL切换无非两种,一种是人为切换,一种是天灾.也就是一种是正常切换一种是异常切换. 正常切换 正常切换是指主库能正常访问 切换的时候保证主备数据库一致 正常切换的流程 1 主库设置只读 kill主库进程 2 备库

Nginx+Keepalived实现站点高可用

公司内部 OA 系统要做线上高可用,避免单点故障,所以计划使用2台虚拟机通过 Keepalived 工具来实现 nginx 的高可用(High Avaiability),达到一台nginx入口服务器宕机,另一台备机自动接管服务的效果.(nginx做反向代理,实现后端应用服务器的负载均衡)快速搭建请直接跳至 第2节. 1. Keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.p

配置keepalived+ssdb高可用

在前两篇已完成keepalived的安装及service配置,ssdb在此处不再说明,可以参考ssdb官网说明:http://ssdb.io/zh_cn. 以下介绍一下如何结合keepalived+ssdb搭建ssdb高可用环境. 1.配置ssdb的监控命令及脚本 由于ssdb可以兼容redis,所以这里使用redis-cli工具来监控ssdb server. (1)下载redis server source code (2)在redis code目录下make (3)将make好的redis-

高可用笔记(6)keepalived+nginx

前面讲到了部署多个tomcat和多个rabbitmq用nginx做代理服务器,这种情况,tomcat和rabbitmq既实现了高可用又实现了负载均衡.但是,nginx确成了单点.在一个HA环境中,任何一个点都必须实现高可用,这里就需要借助keepalived来实现nginx的高可用. 测试环境 host1 192.168.30.1 (nginx, keepalived/master) host2 192.168.30.2 (nginx, keepalived/backup) 安装keepaliv

数据库高可用实战:化繁为简搭建一套轻量级架构

作者介绍 吴虞,SQL专家云团队成员,擅长解决SQL SERVER数据库性能.高可用.负载均衡等问题.   说到高可用,看官们会想到很多方案,也许是自亲身经历过系统从单机变成高可用的痛苦过程,也许有的看官只是在自己的虚机上搭建过测试的玩具.本文以我自己的真实经历给大家讲述,不管怎样,实战和测试玩耍还是很大区别的,可能你觉得搭建一套高可用方案很简单,配置下就OK了,但在真正的复杂系统中一切就没那么轻松了!    本文主要讲述升级并搭建AlwaysOn高可用的过程,以实施的思路为主.文中并没有搭建集

keepalived实现服务高可用

第1章 keepalived服务说明 1.1 keepalived是什么? Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能.因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx.Haproxy.MySQL等)的高可用解决方案软件. Keepalived软件主要是通过VRRP协议实现高可用功能的.VRRP是Virtual Router RedundancyPr

搭建高可用的MongoDB集群(上):MongoDB的配置与副本集

传统的关系数据库具有不错的性能及稳定性,同时,久经历史考验,许多优秀的数据库沉淀了下来,比如MySQL.然而随着数据体积的爆发性增长,数据类型的增多,许多传统关系数据库扩展难的特点也爆发了出来,NoSQL数据库也应运而生.然而区别于以往的使用方法,许多NoSQL都有着自己的限制,从而也导致了入门难的问题.这里我们为大家分享上海创行科技技术总监严澜的博文--如何搭建高效的MongoDB集群. 以下为原文 在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩

高可用可伸缩架构实用经验谈

移动互联网.云计算和大数据的成熟和发展,让更多的好想法得以在很短的时间内实现为产品.此时,如果用户需求抓得准,用户数量将很可能获得爆发式增 长,而不需要像以往一样需要精心运营几年的时间.然而用户数量的快速增长(尤其是短时间内的爆发式增长),通常会让应用开发者有些吃不消,不得不面临一些 严峻的技术挑战:如何避免因为单台机器当机导致服务不可用:如何避免在服务容量不足时,用户体验下降,等等.在系统构建之初就采用高可用和可伸缩架构,将 能有效避免这些问题. 如何构建高可用和可伸缩架构呢?七牛云存储首席架