2017年5月1日星期一

虚拟机中网桥和vlan tag的配置

为提高物理机做虚拟化的利用率,有时物理机的上联交换机端口需要是trunk模式;为保证高可用,物理机的两块网卡需要做bonding;虚拟机的网络一般是用桥接模式;为了保证安全,虚拟机网卡只桥接到指定的bridge上。bonding,vlan tag,bridge的配置一般如下:

eth0和eth1配置:

DEVICE=eth0
ONBOOT=yes
MASTER=bond0
SLAVE=yes

bond0 配置:

#配置默认bonding,用以配置宿主机默认bridge以及宿主机管理地址
DEVICE=bond0
ONBOOT=yes
BRIDGE=bridge0
VLAN=yes
ONBOOT=yes
ARP=no

bond0.X 配置:

#配置带有tag的bonding,用以配置对应的bridge
DEVICE=bond0.X
ONBOOT=yes
BRIDGE=bridgeX
VLAN=yes
ONBOOT=yes
ARP=no

bridge0配置:

#配置默认bridge,用以配置宿主机管理地址
DEVICE=bridge0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
IPADDR=IPADDRESS
NETMASK=NETMASK
STP=off
DELAY=0
BRIDGING_OPTS="max_age=0 ageing_time=0"
GATEWAY=GATEWAY

bridgeX配置:

#配置业务bridge,每个bridge只转发包含相应tag的流量
#虚拟机根据业务不同,桥接到不同的bridgeX即可
DEVICE=bridgeX
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
STP=off
DELAY=0
BRIDGING_OPTS="max_age=0 ageing_time=0"

以上配置在bond0.X处解tag,然后将流量分发到不同的bridgeX上,每个bridgeX只能转发解除tag后vlanX的流量。虚拟机桥接到bridgeX,因此也只能获取到指定的vlanX的流量,保证虚拟机隔离在一个vlan中。
还有一种配置是不在bond0上做解tag动作,而是在bridge0上设定tag,创建bridge0.X,bridge0从而可转发所有流量,虚拟机桥接到bridge0,虚拟机可以通过配置不同的vlan接口来获取所有流量,这样会带来一定的不安全因素。

PXE和iPXE

1. PXE原理概述

PXE(preboot execute environment)是Intel公司开发的技术,目前普遍应用于服务器中。PXE通过网络启动操作系统,在启动流程如下:
  • 服务器发送dhcp请求
  • dhcp-server 响应dhcp请求,分配ip地址,并且返回next-server(tftp服务器地址)和filename(一般为pxelinux.0)
  • 服务器获得ip地址,然后通过tftp协议从next-server下载pxelinux.0
  • pxelinux.0读取tftp-server上pxelinux.cfg目录下的配置
  • pxelinux.0展示界面,根据用户输入的选项进行安装或者启动
dhcp-server上/etc/dhcpd.conf的配置:
  next-server 10.127.201.199;
  filename pxelinux.0;
tftp-server一般通过xinet.d服务启动,/etc/xinetd.d/tftp配置如下:
  service tftp
  {
          socket_type             = dgram
          protocol                = udp
          wait                    = yes
          user                    = root
          server                  = /usr/sbin/in.tftpd
          server_args             = -s /var/lib/tftpboot
          disable                 = no
          per_source              = 11
          cps                     = 100 2
          flags                   = IPv4
  }
  
/var/lib/tftpboot 一般包含文件:
  • pxelinux.cfg目录,文件读取顺序为服务器MAC地址,服务器dhcp获取的ip和网段,default文件,即如下顺序:
    • pxelinux.cfg/01-MACADDRESS
    • pxelinux.cfg/C0A8000F
    • pxelinux.cfg/C0A8000
    • pxelinux.cfg/C0A800
    • pxelinux.cfg/C0A80
    • pxelinux.cfg/C0A8
    • pxelinux.cfg/C0A
    • pxelinux.cfg/C0
    • pxelinux.cfg/C
    • pxelinux.cfg/default
  • pxelinux.0
  • 操作系统kernel和initrd文件

2. IPXE 原理概述

PXE有诸多不变之处,IPXE是对PXE的修改,对PXE做了更好的扩展,支持获取服务器上更多的信息,如序列号等等。但是由于物理机目前只支持PXE的方式,所以首先要将PXE启动转换为IPXE启动,才能使用IPXE的便利之处。IPXE流程如下:
  • 服务器 第一次 发送dhcp请求
  • dhcp-server 响应dhcp请求,分配ip地址,并且返回next-server(tftp服务器地址)和filename(一般为undionly.kpxe)
  • 服务器通过tftp协议下载unidonly.kpxe文件
  • undionly.kpxe 第二次 发送dhcp请求
  • dhcp-server 响应dhcp请求,分配ip地址,并且返回一个URL
  • 服务器访问URL,并将硬件信息(如sn)作为参数传递,然后获取根据sn生成的ipxe脚本
  • 服务器执行ipxe脚本,通过http协议下载操作系统kernel和initrd
  • 服务器利用kernel和initrd正常引导
dhcp-server上/etc/dhcpd.conf的配置:
  # 如果是ipxe发送的dhcp请求,表示服务器是在第二次dhcp请求过程中,返回URL,要求服务器将sn作为参数来访问此URL
  if exists user-class and ( option user-class = "iPXE" ) {
      filename "http://10.127.201.97/cgi-bin/ipxe.py?sn=${serial}";
  }
  # 如果不是ipxe发送的dhcp请求,表示服务器是在第一次dhcp请求过程中,返回unidonly.kpxe 文件
  else {
      filename "undionly.kpxe";
  }
  
ipxe.py接收到服务器sn,然后返回对应的ipxe脚本信息,ipxe脚本信息一般如下:
  #!ipxe
  
  set net0/ip IPADDRESS
  set net0/netmask 255.255.255.0
  set net0/gateway GATEWAY
  set dns DNSSERVER
  
  :START
  menu Please choose an operating system to boot
  item --gap --          ------------------------- OS Installation --------------------------------
  item OPERATIONSYSTEM OPERATIONSYSTEM
  choose --default OPERATIONSYSTEM --timeout 5000 os
  goto ${os}
  
  :OPERATIONSYSTEM
  echo Starting install for OPERATIONSYSTEM
  set baseurl http://ks.vip.split.hdb.com/base/OPERATIONSYSTEM/images/pxeboot
  kernel ${baseurl}/vmlinuz
  initrd ${baseurl}/initrd.img
  imgargs vmlinuz text ksdevice=link ramdisk_size=8192 biosdevname=0 sshd=1 ks=http://ks.vip.split.hdb.com/ksconf/OPERATIONSYSTEM.cfg noipv6 ip=IPADDRESS netmask=255.255.255.0 gateway=GATEWAY dns=DNSSERVER
  boot || goto FAILED
  goto START