假设云环境为:clc:192.168.6.89 cc:192.168.6.139 nc:192.168.6.143
在nc上启动一台虚拟机 192.168.6.210 私网地址:10.10.1.2
云外主机一台 192.168.5.168
登录虚拟机的过程:
192.168.5.168->192.168.6.210(实际就是192.168.6.139所在主机)->10.10.1.2(在192.168.6.139上,通过iptables映射表把包转发到nc上)
网络接口配置说明:
在配置文件/etc/eucalyptus/eucalyptus.conf中:
VNET_MODEVNET_PRIVINTERFACE VNET_PUBINTERFACE VNET_BRIDGE,这四个参数说明如下:
1.当CC VNET_MODE配置为 MANAGED-NOVLAN时,不生成eucabr**网桥。公网IP地址被分配给VNET_PUBINTERFACE指向的网卡接口。私网IP的网关地址被分配给VNET_PRIVINTERFACE指向的网卡接口。并且将VNET_PRIVINTERFACE指向的网卡接口挂到VNET_BRIDGE指向的网桥下面,和nc进行通信。
示例:
VNET_MODE="MANAGED-NOVLAN"
VNET_PRIVINTERFACE="eth0"
VNET_PUBINTERFACE="eth1"
VNET_BRIDGE="br0"
bridgename bridge id STP enabled interfaces
br0 8000.0026b978e820 no eth0 //eth0挂在br0下面
NC端VNET_MODE 配置和cc相同。
当VNET_MODE配置为"MANAGED-NOVLAN"时, VNET_PRIVINTERFACEVNET_PUBINTERFACE忽略,只看 VNET_BRIDGE参数。虚拟机的虚拟网卡,会被挂到VNET_BRIDGE指向的网卡接口。
2.当CC VNET_MODE配置为 MANAGED时,生成eucabr**网桥。公网IP地址被分配给VNET_PUBINTERFACE指向的网卡接口。私网IP的网关地址被分配给VNET_PRIVINTERFACE指向的网卡接口。并且将VNET_PRIVINTERFACE指向的网卡接口挂到eucabr**网桥下,和nc进行通信。VNET_BRIDGE参数被忽略。
NC端VNET_MODE配置和cc相同。
当VNET_MODE配置为"MANAGED“时,VNET_PRIVINTERFACE(eucalyptus2.0.2的代码中忽略该参数,为了以后不出现隐藏bug,建议和VNET_PUBINTERFACE设置为同一个网卡接口)和VNET_BRIDGE参数被忽略。虚拟机的虚拟网卡和VNET_PUBINTERFACE指向的网卡接口被一起挂到eucabr**网桥下,与cc通信。
MANAGED-NOVLAN原理说明:
根据上面的配置策略,cc将生成虚拟机的公网IP地址分配给VNET_PUBINTERFACE指向的网卡接口,将私网IP地址的网关地址分配给VNET_PRIVINTERFACE指向的网卡接口。
当nc上启动一台虚拟机后,虚拟机的虚拟网卡挂到VNET_BRIDGE网桥下,发送DHCP数据包广播。cc端同时会根据虚拟机ID生成的网卡MAC地址,配置一个dhcp服务。cc端接受到dhcp数据包,由dhcp服务反馈分配给实例的私有IP,通信完成。
当外部主机请求虚拟机公网ip192.168.6.210时,cc首先接到数据包请求,然后根据本机iptablesfilter表规则,判断包是否允许通过,允许通过的包再根据nat表规则转发到虚拟机的私有ip地址。
问题排查流程:
根据登录虚拟机的过程:
192.168.5.168->192.168.6.210(实际就是192.168.6.139所在主机)->10.10.1.2(在192.168.6.139上,通过iptables映射表把包转发到nc上)
排查问题采用从下至上的方法:
首先,登录到nc端,virshlist查看实例的启动状态。进入到实例文件夹,修改libvirt.xml文件,加入<graphicstype='vnc' port='-1' autoport='yes' listen='0.0.0.0'/>语句。
形式如下:
189 </serial>
190 <graphics type='vnc' port='-1' autoport='yes'listen='0.0.0.0'/>
191 </devices>
然后,virshdestroy i-12345678;virsh create libvirt.xml;重新启动实例。
在本机使用vncviewer192.168.6.143:0 (登录nc上的虚拟机远程桌面)
查看虚拟机中是否分配到了ip地址。情况如下:
1.分配到了错误的ip地址。
解决方法:在MANAGED-NOVLAN模式下,虚拟机dhcp请求会广播到局域网,所以nc主机所在局域网不能有其它dhcp服务器存在,或者设置该dhcp服务器不响应D0:0D开头的网卡地址。
2.分配不到IP地址。
在MANAGED-NOVLAN模式下,确认cc端ps ax|grepdhcp能够看到dhcp服务进程。如果没有dhcp进程,登录到cc端,查看cc.log确认启动dhcp的命令为什么出错。手工将log中的命令执行一下。
一般的原因是因为我们的环境一般将VNET_PRIVINTERFACEVNET_PUBINTERFACE的参数配置为同一个接口。这时由于cc生成的dhcp配置文件中,没有公有ip的地址段配置,导致启动失败。解决方法:1.在vnetwork.c文件中添加网段的地址范围,配置为空即可。2.真正部署时,cc使用双网卡主机,将接口参数配置分开。3.eucalyptus使用的dhcpd41程序好像没有该bug。
3.分配到正确的ip地址。
1)登录到cc端,ping实例的私有地址。一般应该可以ping通。如果ping不通,是否cc端配置模式为MANAGED,而本局域网禁止自定义vlan标签通过?测试方法参考installationguide p24 Prepare VLAN节即可。如果测试不能通过,说明不允许自定义vlan标签,只能使用MANAGED-NOVLAN模式。详细的网络情况使用哪种模式详见installationguide p14 Planning Networking Modes 节最后的附图。
2)如果在cc端可以ping通私网,继续ping虚拟机公网,如果ping不通,查看公网ip是否已经绑定在cc的VNET_PUBINTERFACE参数指向的网卡接口上,并检查iptables的filter表是否允许ping操作,检查iptablesnat表地址转发规则是否正确。
3)cc可以ping通公网地址,但是在外网主机上不能ping通公网地址。方法如上,检查cc端iptables设置规则是否正确。在cc端使用tcpdump-i br0 src 192.168.5.168 and dst 192.168.6.210 -A-s0监听请求,在192.168.5.168上ping虚拟机192.168.6.210,确定请求是否可达。如果cc上接受到请求,说明还是cc上的iptables规则设置有问题,或者sysctl-a 中的
net.ipv4.ip_forward= 1 应该置为1进行数据包转发。这个只能自行检查cc上所有网络设置。
如果cc没有收到192.168.5.168发来的请求,那就是不在同一个网段,可能ping包被网关过滤所致,只能找网管协调。