一、申请 DHCP IP
在执行虚拟化方案前,请根据具体的 IP 地址需求申请 DHCP IP 地址,在安装虚拟机时将 DHCP IP 作为虚拟机的 IP 地址。申请步骤如下:
1. 进入 API Explorer 工具的 CreateDhcpIp 接口页面。
2. 根据实际情况输入 region、vpcid、subnetID、dhcpIpName、SecondaryPrivateIpAddressCount(个数)。如需了解输入参数含义,请参见 创建 DhcpIp。
3. 输入后单击发起调用,调用成功后请保存返回的响应结果。
如下所示,在本例中,调用 API 生成了一个 DHCP IP:10.99.0.5(即下图中 PrivateIpAddress 的值)。
注意:该接口不支持指定 IP 地址,只能由系统随机生成 DHCP IP。
二、发送 GARP 包
该步骤将 IP 地址绑定至虚拟机。这篇提供以下两种方式,你可按需选择其中一种即可:
方式1方式2
·操作对象
虚拟机。
·操作方式
发送如下 arping 指令:
arping -c 运行次数 -I 虚拟机的接口 -U dhcp ip
示例如下:
arping -c 1 -I eth0 -U 10.99.0.5
·特点:
无法指定 mac 地址,因此只能在虚拟机上执行。
·操作对象
虚拟机、宿主机。
·操作方式
·执行 arp.py 脚本,命令如下。执行10秒后,请通过 Ctrl + c 停止脚本。
python arp.py –iface 接口–src_mac 虚拟机mac –src_ip 虚拟机ip –dst_ip 虚拟机ip –dst_mac 虚拟机mac
示例如下:
python arp.py –iface eth0 –src_mac 28:6e:d4:89:91:cf –src_ip 10.27.8.155 –dst_ip 10.27.8.155 –dst_mac 28:6e:d4:89:91:cf
·特点:
需获取虚拟机的 mac 地址,且需有 Python 环境。
执行完成后,虚拟机与同 VPC 的其他主机即可正常通信。
三、查询 DHCP IP 是否绑定成功
发送 GARP 包后,可以通过接口自助查询是否绑定成功。步骤如下:
1. 进入 API Explorer 工具的 DescribeDhcpIps 接口页面。
2. 根据实际情况输入 region 及 DhcpIpIds。
其中,DhcpIpIds 请使用 申请 DHCP IP 步骤中获取的 PrivateIpAddress。
3. 单击发起调用,通过返回结果确认是否绑定成功。如需了解返回结果含义,请参见 查询 DhcpIp 列表。
四、虚拟机访问公网
若虚拟机需要访问公网,可以通过 DHCP IP 绑定 EIP 的方式实现。步骤如下:
1. 参见 申请 EIP,获取一个 EIP。
2. 进入 API Explorer 工具的 AssociateDhcpIpWithAddressIp 接口页面。
3. 根据实际情况输入 DHCP IP 及 EIP,发起调用后即可。
五、不支持热迁移
目前 CHC 物理服务器不支持用户的子机的热迁移,原因如下:
·子机上线需要发送 GARP,被网卡捕获上送控制面。子机迁移到另外一台 CHC 服务器后,无法主动发送 GARP。
·子机从一台 CHC 迁移到另外一台 CHC 时,源网卡上的相关会话不会同步到目标 CHC 网卡,会造成已有连接中断。
六、arp.py 脚本
#!/usr/bin/python# -*- coding: utf-8 -*-import socket, binascii,struct,os,subprocess,sys,threading,json,re,argparse,timeclass arping(): def __init__(self, iface): self.sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, ) self.sock.bind((iface, 0)) def arp_request(self, src_ip, src_mac, dst_ip, dst_mac): src_mac_addr = binascii.a2b_hex(src_mac.replace(':','')) dst_mac_addr = binascii.a2b_hex(dst_mac.replace(':','')) src_ip = socket.inet_aton(src_ip) dst_ip = socket.inet_aton(dst_ip) eth = "\\xff\\xff\\xff\\xff\\xff\\xff"+src_mac_addr+"\\x08\\x06"+ \\ "\\x00\\x01\\x08\\x00\\x06\\x04\\x00\\x01"+src_mac_addr+src_ip+dst_mac_addr+dst_ip self.sock.send(eth)if __name__ == '__main__': parser_t = argparse.ArgumentParser(description='arp_req') parser_t.add_argument('–iface', dest= 'iface', type=str, help='interface') parser_t.add_argument('–src_mac', dest= 'src_mac', type=str, help='source mac') parser_t.add_argument('–src_ip', dest= 'src_ip', type=str, help='source ip') parser_t.add_argument('–dst_mac', dest= 'dst_mac',type=str, help='destination mac') parser_t.add_argument('–dst_ip', dest= 'dst_ip', type=str, help='destination ip') args = parser_t.parse_args() while True: handler = arping(args.iface) handler.arp_request(args.src_ip, args.src_mac, args.dst_ip, args.dst_mac) time.sleep(10)