专有网络 VPC 最佳实践
最佳实践 HaVip 最佳实践 概览 最佳实践 HaVip 的最佳实践 使用 keepalived 搭建具备高可用能力的 SNAT 网关 自建高可用 SNAT 网关 使用 keepalived 和 HaVip 搭建具备高可用能力的 SNAT 网关 在 VPC 中, 为一台 ECS 绑定 EIP, 并在该 ECS 上搭建代理软件, 可以将该 ECS 实例建设为一个 SNAT 网关, 让同 VPC 内其他实例将该实例作为公网网关进行公网访问 然而, 这种方式搭建的 SNAT 网关是个单点, 可用性较差 我们可以使用 keepalived 和 HaVip 来搭建一个具备主备切换能力的高可用 SNAT 网关 环境 1. 准备两个 EIP 准备四台 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 的效果 1
准备一个 HaVip: 私网 IP:192.168.1.200 绑定了 EIP:123.56.16.108 绑定了两个实例 :192.168.1.202 192.168.1.203; 2
搭建与配置 Keepalived 的安装 : 在要当做 SNAT 服务器的两台 ECS 实例上, 执行以下 keepalived 安装流程 : 下载 : [root@iz250sept0mz ~]#### wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz 由于目前这台机器目前不能直接连上公网, 所以可以在跳板机上进行 wget, 然后 scp 到这两台机器上 ; 安装 : [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 3
自定义路由配置 : 添加一条自定义路由, 目的 CIDR 为 0.0.0.0/0, 下一跳指向 HaVip 对象 添加完成后的效果如下 : 开启内核的 IP 转发选项 : 4
在两台 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 #!/bin/bash echo "stop; `date`" >> /tmp/log iptables -t nat -F Keepalived 配置 5
配置文件位置 :/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 6
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 [root@iz25eb8j6mqz ~]#### service keepalived start 观察 log, 进入 master 状态 : 查看网卡配置, 出现了 192.168.1.200 的 ip; 查看 iptables 规则, 出现了 SNAT 相关规则 ; 7
在 204 上验证上网效果 ping 公网网址可以通 ;traceroute 可以看到第一跳为 192.168.1.202 在 203 上启动 keepalived 观察 log, 进入 backup 状态 : 8
查看网卡信息, 发现并没有出现 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 9
将 202 的 keepalived 重新启动 观察到 : 1. 203 回到 backup 状态, 并移除 192.158.1.200 的 ip 2. 202 进入 master 状态, 并接管 vip 在 204 上验证上网效果 可以看到, 依然可以 ping 通,traceroute 变回第一跳为 202 上面的主备迁移过程, 您也可以停机 / 系统重启的方式模拟宕机, 来观察 vip 的切换 10