一个openstack的虚拟机,是如何获得分配的地址,以及主机名,dns,主机路由,网关这些信息的呢?
ipv4的地址
对于ipv4的地址,是比较好理解的,无论是地址,dns,主机路由,网关,mtu,还是其他dhcp选项,都是从dhcp server获取到的。
虚拟机配置:
具体虚拟机里只要在配置文件里(Centos7的eth0网卡配置文件时/etc/sysconfig/network-scripts/ifcfg-eth0)把BOOTPROTO=dhcp设置上。
重启network(centos7:systemctl restart network)服务即可。
虚拟机未分配到IP:
可排查是虚拟机没发送请求报文,还是dhcp server没恢复报文,可以抓包tcpdump -i tapxxx -nv port 67(把tapxxx换成虚拟机tap设备)。
ipv6的地址
ipv6的地址分配和ipv4差别比较大。官网介绍:https://docs.openstack.org/newton/networking-guide/config-ipv6.html
对于ipv6的地址,稍微复杂些。创建时,有两个参数ipv6_ra_mode和ipv6_address_mode。决定了获取信息的方式。大概介绍下:
ipv6_ra_mode:确定谁发送RA报文
ipv6_address_mode:确定如何获取ipv6的地址,以及扩展信息,dns,主机路由,等这些。
下面具体,分析下各种配置
ipv6_ra_mode=slaac ipv6_address_mode=slaac
这种模式下,我们设置的地址前缀必须是64位的。
虚拟机IP:
虚拟机最终的IP,是由地址前缀和MAC地址决定的,即地址前64位为地址前缀,后64位由mac地址经过eui64这种地址模式生产的。
地址前缀的获取:
地址前缀,MTU从RA广播中获取。也就是由路由接口发送过来的。也就是说虚拟机如果想从RA报文中获取,前提得有路由接口,需要把虚拟机所在的子网加入到路由器中。
虚拟机配置:
这种模式的网络,配置文件配置方式:
BOOTPROTO=none
ONBOOT=yes
IPV6_ADDR_GEN_MODE=eui64
IPV6_AUTOCONF=yes
有时候我们看到虚拟机内分配的IP,前缀是对的,但是IP却不对,和界面上分配的不一致,那一般都是虚拟机配置的地址生成模式不是eui64,目前openstack只支持eui64所以必须配置成eui64。有的默认可能是stable-privacy。
虚拟机未分配IP
可以排查有没有发出rs(router solicitation)报文,和收到ra(router advertisement)报文。可以抓包tcpdump -i tapxxx -nv icmp6(把tapxxx换成虚拟机tap设备)。
一般情况,虚拟机内配置好,会主动发送rs报文,路由接口回复ra报文。如果没有发出rs报文可能是虚拟内部问题。如果没有回复ra报文,那就是路由接口配置问题了,就是云平台问题了,先确定是不是配置了路由接口。如果收到了ra报文但是没有配置上虚拟机,那也是虚拟机内部的问题。
另外ra报文一般是周期性发送的,使用ovn的情况,默认是200-600s。
网关和默认路由
虚拟机收到ra报文,一般把发送者,设置成默认路由。一般是fe80开头的本地链路地址。
总结:
这种模式下,我们可以通过RA报文设置IP地址,MTU,默认路由。其他信息获取不到。
ipv6_ra_mode=dhcpv6-stateful ipv6_address_mode=dhcpv6-stateful
这种模式我们一般叫做有状态的DHCPv6。
虚拟机IP:
虚拟机的IP我们是可以通过发送dhcpv6的solicit报文,dhcpv6 server收到后,返回分配的虚拟机IP,DNS配置。
一般我们获取到IP地址以后,可能发现地址前缀不对,比如我们的网段是前缀是96位,虚拟机里却设置的64位。这是因为dhcpv6 server分配IP时,并没有告诉地址前缀是多少。
网关和默认路由
虚拟机收到ra报文,一般把发送者,设置成默认路由。一般是fe80开头的本地链路地址。同事RA报文里有MTU,地址前缀信息。
虚拟机配置:
这种模式的网络,配置文件配置方式:
BOOTPROTO=none
ONBOOT=yes
IPV6INIT=yes
DHCPV6C=yes
IPV6_AUTOCONF=yes
虚拟机未分配IP
可通过抓包tcpdump -i tapxxx -nv port 567(把tapxxx换成虚拟机tap设备),查看是否发出dhcpv6的solicit报文。有没有收到dhcpv6 Advertise报文。
虚拟机未配置静态路由
可以排查有没有发出rs(router solicitation)报文,和收到ra(router advertisement)报文。可以抓包tcpdump -i tapxxx -nv icmp6(把tapxxx换成虚拟机tap设备)。
总结:
这种模式下,我们通过dhcpv6报文获取IP地址,DNS服务器信息。从RA报文获取MTU,默认路由,地址前缀。其他信息(主机路由,主机名等)获取不到。
ipv6_ra_mode=dhcpv6-stateless ipv6_address_mode=dhcpv6-stateless
这种模式下,我们设置的地址前缀必须是64位的。
虚拟机IP:
虚拟机最终的IP,是由地址前缀和MAC地址决定的,即地址前64位为地址前缀,后64位由mac地址经过eui64这种地址模式生产的。
地址前缀的获取:
地址前缀,MTU从RA广播中获取。也就是由路由接口发送过来的。也就是说虚拟机如果想从RA报文中获取,前提得有路由接口,需要把虚拟机所在的子网加入到路由器中。
dns, domain_search 从 DHCP server获取
地址前缀,MTU从RA广播中获取。