操作场景
CHC 物理服务器不提供虚拟化方案,您需自行选用虚拟化方案。可参考本文,实现虚拟机与主机间的网络互通。本文采用网络配置方案如下:
虚拟机仅支持通过发送 GARP 绑定 DHCP IP 地址的方式与内网通信。
操作步骤
申请 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 地址绑定至虚拟机。本文提供以下两种方式,您可按需选择其中一种即可:
操作对象
虚拟机。
操作方式
发送如下 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_ipself.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)