有奖捉虫:行业应用 & 管理与支持文档专题 HOT

操作场景

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 地址绑定至虚拟机。本文提供以下两种方式,您可按需选择其中一种即可:
方式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,time

class 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)