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

简介: 原作者:阿里云飞天解决方案架构师,云帅。多图预警!预计读完本文需要10分钟。本文高速你,如何使用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的效果。

5fd8b9b09c0ec566bba8229dffc876968fed37fa

3. 准备一个HaVip:

       私网IP:192.168.1.200

       绑定了EIP:123.56.16.108

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

 fcfc2b9303045cc77ae1ff93c6fcbbb3a9a8f3ea

af3fa420150e6248402e4b23abaae3b053fddd68


## 搭建与配置

### 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     

91f9a4a300fd1124d6d02162885d72c88d10577b

### 自定义路由配置:

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

050c8e05b0fc202b65f640bb95ed9209b8377889

添加完成后的效果如下:

8444a6c89fc3fa173f826ba41aa0d52b6a2499a5

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

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

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

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

f78ef65cbfee0df885c657bc468b8fb0a624091f

### 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状态:

 7f1191441a118fd6920dc8bd7b6b7a4601e4bdd9

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

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

cc7ad0a0fa81750631baf58ac2cc1ef35c2999f3

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

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

c1e9289cf2a109f9a129e07612ae20685655844f

### 在203上启动keepalived

观察log,进入backup状态:

cbfd00a3605f682ba84c9928f08321bd57d3a1ee

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

7e11260782d9089510b61742ff6f67d50b9d18ec

### 在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。

02127fff11c0e8f081ebf7adbeebf725b9cb97d0

### 将202的keepalived重新启动

观察到:

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

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

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

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

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
负载均衡 容灾 应用服务中间件
使用Docker-compose搭建nginx-keepalived双机热备来实现高可用nginx集群
最近同学出去面试经常会被问到一个问题。 面试官:你说你们公司使用nginx反向代理tornado,部署了多少多少台机器,好像很牛逼的样子,但是我问你,如果主机也就是部署了nginx那台机器并发过大导致宕机了怎么办? 答曰:不考虑带宽峰值的话,比较新的 CPU 跑 nginx 单核每秒能接近 2 万请求,而且nginx如果纯做 HTTP 转发的话,Nginx 的性能高到恐怖,会挂掉很不科学。。。。 面试官:好吧,算你会忽悠,那如果插头被扫地大妈踢掉了怎么办,因为没电导致服务器宕机 答曰:阿里云机房会断电。。。你特么在逗我吧。。
使用Docker-compose搭建nginx-keepalived双机热备来实现高可用nginx集群
|
人工智能 运维 安全
开源 Remote MCP Server 一站式托管来啦!
MCP Server 的实施存在着诸多挑战,特别是在认证授权、服务可靠性和可观测性方面,Higress 作为 AI 原生的 API 网关,提供了完整的开源 MCP Server 托管解决方案,实现存量 API 到 MCP 的协议转换。即将上线的 MCP 市场,将大幅降低开发者构建 MCP Server 的时间和人力成本。
2608 107
开源 Remote MCP Server 一站式托管来啦!
|
Android开发
【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )(一)
【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )(一)
1367 0
|
前端开发 C++ iOS开发
几款主流好用的markdown编辑器介绍
几款主流好用的markdown编辑器介绍
1698 1
|
10月前
|
存储 缓存 数据可视化
如何开发CRM系统中的客户管理板块(附架构图+流程图+代码参考)
本文深入解析CRM系统中客户管理模块的开发,涵盖功能设计、业务流程、技术实现及代码参考,助力开发者构建高效客户管理系统。
|
tengine 应用服务中间件 nginx
Tengine命令安装教程
该内容提供了一套详细的步骤指南,用于通过 FinalShell 远程连接并安装 Tengine 服务器。从下载与配置 Tengine,到使用 yum 安装必要的组件,再到编译、安装及配置 Nginx,以及如何处理 HTTPS 部署和证书设置,最后涵盖了基本的站点程序控制命令。此外,还提供了隐藏版本号的方法及文本编辑技巧。
|
存储 网络安全 数据安全/隐私保护
[flask]使用mTLS双向加密认证http通信
【7月更文挑战第16天】在Flask应用中实现mTLS双向TLS加密认证可增强HTTP通信安全性。步骤包括: 1. 使用OpenSSL为服务器和客户端生成证书和密钥。 2. 配置Flask服务器使用这些证书: - 安装`flask`和`pyopenssl`. - 设置SSL上下文并启用mTLS验证: 注意事项: - 保持证书有效期并及时更新. - 确保证书链信任. - 充分测试mTLS配置.
565 2
|
Linux Perl
`sed`命令删除文件中匹配特定模式的行
`sed`命令删除文件中匹配特定模式的行
711 4
|
Ubuntu 数据安全/隐私保护 存储
|
数据采集 运维 监控
日志服务SLS:一站式解决日志管理难题
日志服务SLS:一站式解决日志管理难题 在数字化时代,日志管理成为企业面临的挑战之一。为了解决这个问题,阿里云日志服务SLS(Log Service)应运而生,提供了一站式的大规模、低成本、实时的日志管理平台。
775 1

热门文章

最新文章