专线通存储虚拟机高可用方案
一、需求背景
客户IDC机房的虚拟机需要通过专线访问公有云的对象存储。同时提供高可用保障。
二、方案详情
采用在公有云资源池新建两台虚拟机,在虚拟机内部配置NAT规则。使用NAT方式访问公有云对象存储。操作流程如下:
- 在和客户IDC专线打通的VPC内新建两台虚拟机(S6系列);
- 在虚拟机同子网申请一个vip,绑定两台虚拟机的虚拟网卡;
- 在两台虚拟机里面安装部署keepalived,keepalived的vip使用上一步申请的vip;
- 在两台虚拟机里面配置nat规则,使得专线可以通过访问vip来访问公有云对象存储服务。
1)安装iptables
#安装iptables
yum install -y iptables
yum install -y iptables-services
注:如果服务器或云主机不能连接yum源,需要手工安装iptables和iptables-service
安装完成后,检查iptables是否安装完成:
rpm -i iptables*
确认是否iptables和iptables-services安装包的状态都是“installed”状态。
检查iptables服务状态是否为“active”。
systemctl status iptables
2)开启转发功能
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl –p
3)配置iptables规则
a、iptables -t nat -A PREROUTING -d {虚拟IP地址}/32 -p tcp -m tcp --dport {存储端口} -j DNAT --to-destination {存储地址}:{存储端口}
b、iptables -t nat -A POSTROUTING -o {网卡名} -j SNAT --to-source {本机实地址}
样例:
Bucket域名( VPC内网访问 ) :xxx
虚拟IP:xxx
虚机A地址:xxx
虚机B地址:xxx
- 虚机A配置:
iptables -t nat -A PREROUTING -d 虚拟IP -p tcp -m tcp --dport 80 -j DNAT --to-destination bucket域名
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 虚机A IP
- 虚机B配置:
iptables -t nat -A PREROUTING -d 虚拟IP -p tcp -m tcp --dport 80 -j DNAT --to-destination bucket域名
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 虚机B IP
4)修改iptables配置文件
检查两台NAT主机的iptables配置文件,如果/etc/sysconfig/iptables配置文件中含有如下规则:
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
需要在/etc/sysconfig/iptables配置文件中加“#”注释掉,或者删除
5)永久保存iptables配置
持久化保存iptables配置,避免服务器或云主机重启之后,配置丢失,导致重新配置。
持久化iptables配置:
iptables-save > /etc/sysconfig/iptables
注:两台NAT主机都需要保存配置
6)设置iptables开机自启动
# systemctl list-unit-files|grep iptables iptables.service disabled
# systemctl enable iptables.service Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
# systemctl list-unit-files|grep iptables iptables.service enabled |
7)测试验证
curl 虚拟ip
返回如下结果即为正确:
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>