天天看點

使用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的效果。

使用keepalived和HaVip搭建具備高可用能力的SNAT網關

3. 準備一個HaVip:

       私網IP:192.168.1.200

       綁定了EIP:123.56.16.108

       綁定了兩個執行個體:192.168.1.202、192.168.1.203;

使用keepalived和HaVip搭建具備高可用能力的SNAT網關
使用keepalived和HaVip搭建具備高可用能力的SNAT網關

## 搭建與配置

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

#### 修改配置檔案路徑:

[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設定為服務,開機啟動:

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

使用keepalived和HaVip搭建具備高可用能力的SNAT網關
### 自定義路由配置:

       添加一條自定義路由,目的CIDR為0.0.0.0/0 , 下一跳指向HaVip對象

使用keepalived和HaVip搭建具備高可用能力的SNAT網關

添加完成後的效果如下:

使用keepalived和HaVip搭建具備高可用能力的SNAT網關
### 開啟核心的IP轉發選項:

在兩台SNAT伺服器ECS執行個體上都進行如下修改:

運作:`sysctl -w net.ipv4.ip_forward=1`

為了保證執行個體重新開機後依然是開啟這個選項的,需要對/etc/sysctl.conf 這個配置檔案進行修改,将net.ipv4.ip_forward的值改為1,見下圖:

使用keepalived和HaVip搭建具備高可用能力的SNAT網關
### SNAT配置

在兩台當做SNAT伺服器的ECS執行個體上,準備兩個shell腳本:

* 腳本一: 用于主備切換時讓新的master機自動開啟IP轉發、加載SNAT規則,實作SNAT轉發:

* 腳本二: 用于主機切換成備機時或者主機keepalived出錯時去除SNAT轉發規則(不去除的話,上網會有問題);

P.S. 如果備機帶着這幾條SNAT規則工作,會導緻主機無法直接上網;

兩個腳本的内容如下:

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

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

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 {

     [email protected]

     [email protected]

     [email protected]

   }

   notification_email_from [email protected]

   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)的完整配置檔案:

    state BACKUP

    priority 99

    unicast_src_ip 192.168.1.203

            192.168.1.202

注意:同樣需要注意其中的私網IP,換成你的兩台執行個體的私網IP;注意對應位置,不要寫反了。

## 啟動服務、驗證SNAT效果

### 在202上啟動keepalived

[root@iZ25eb8j6mqZ ~]# service keepalived start

觀察log,進入master狀态:

使用keepalived和HaVip搭建具備高可用能力的SNAT網關

檢視網卡配置,出現了192.168.1.200的ip;

檢視iptables規則,出現了SNAT相關規則;

使用keepalived和HaVip搭建具備高可用能力的SNAT網關
### 在204上驗證上網效果

ping公網網址可以通;traceroute可以看到第一跳為192.168.1.202

使用keepalived和HaVip搭建具備高可用能力的SNAT網關
### 在203上啟動keepalived

觀察log,進入backup狀态:

使用keepalived和HaVip搭建具備高可用能力的SNAT網關

檢視網卡資訊,發現并沒有出現192.168.1.200,因為此時202是master,203還隻是個備胎:

使用keepalived和HaVip搭建具備高可用能力的SNAT網關

可以看到,和剛才驗證的效果一樣

### 将202的keepalived停掉

[root@iZ25eb8j6mqZ ~]# service keepalived stop

可以觀察到:

1.    202的網卡上不再有192.168.1.200

2.    203的keepalived log顯示,進入master狀态

3.    203 的網卡上出現192.168.1.200

可以看到,依然可以ping通,traceroute變成了第一跳為203。說明,此時203成為了master,接管了vip。

使用keepalived和HaVip搭建具備高可用能力的SNAT網關
### 将202的keepalived重新啟動

觀察到:

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

2.    202進入master狀态,并接管vip

可以看到,依然可以ping通,traceroute變回第一跳為202

上面的主備遷移過程,您也可以停機/系統重新開機的方式模拟當機,來觀察vip的切換。