在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
#### 修改配置檔案路徑:
[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
### 自定義路由配置:
添加一條自定義路由,目的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
#!/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 {
}
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狀态:
檢視網卡配置,出現了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還隻是個備胎:
可以看到,和剛才驗證的效果一樣
### 将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。
### 将202的keepalived重新啟動
觀察到:
1. 203回到backup狀态,并移除192.158.1.200的ip
2. 202進入master狀态,并接管vip
可以看到,依然可以ping通,traceroute變回第一跳為202
上面的主備遷移過程,您也可以停機/系統重新開機的方式模拟當機,來觀察vip的切換。