SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 11 de abril de 2011

Qué es Crossbow y Cómo Utilizarlo en Solaris/OpenIndiana - Parte 1

Introducción
Una de las tecnologías que OpenSolaris nos dejó fue la "Virtualización de la Infraestructura de Red". Actualmente tanto OpenIndiana como Solaris 11 incorporan esta tecnología, que, aunque un poco desconocida, realmente muy potente.

En esta serie de artículos vamos a ver cómo podemos utilizar esta tecnología en nuestras máquinas de producción.

¿Virtualizar Infraestructura de Red?
Si, es correcto. Crossbow nos permite virtualizar nuestra infraestructura -switches, routers, tarjetas- por lo tanto, nos permite diseñar una "infraestructura virtual" completa.

Sin embargo, vamos a ver un enfoque más "práctico" a la virtualización de la infraestructura de Red, y, sobre todo, cómo utilizarlo en nuestro equipos de producción.

El uso de Solaris Zones es una ventaja importante, pero, si queremos "mover" nuestras máquinas virtuales de un host a otro, tenemos algunos problemas -por ejemplo el nombre de la tarjeta de red-. Utilizando una tarjeta virtual, eliminaremos este problema, y, además podremos añadir soporte IPFilter a nuestra zona ya que podemos poner <ip-type=exclusive> en vez de <shared>

Por último, crossbow incluye una nueva forma de manejar QoS, y sí, esta vez, es sencilla y muy eficiente.


El comando <dladm>
La gestión de la virtualización de red se encuentra en el comando </usr/sbin/dladm> que, nos proporciona los métodos para: crear, modificar y borrar elementos virtuales -vnic, etherstub, bridge, vlan-

Si ejecutamos el comando -teniendo en cuenta que debemos disponer de permisos suficientes- sin argumentos, se nos muestra las diferentes opciones
itily@openzooey:~$ pfexec /sbin/dladm
usage:  dladm <subcommand> <args> ...
    rename-link      <oldlink> <newlink>
    show-link        [-pP] [-o <field>,..] [-s [-i <interval>]] [<link>]

    create-aggr      [-t] [-P <policy>] [-L <mode>] [-T <time>] [-u <address>]
                     -l <link> [-l <link>...] <link>
    delete-aggr      [-t] <link>
    add-aggr         [-t] -l <link> [-l <link>...] <link>
    remove-aggr      [-t] -l <link> [-l <link>...] <link>
    modify-aggr      [-t] [-P <policy>] [-L <mode>] [-T <time>] [-u <address>]
                     <link>
    show-aggr        [-pPLx] [-o <field>,..] [-s [-i <interval>]] [<link>]

    scan-wifi        [-p] [-o <field>,...] [<link>]
    connect-wifi     [-e <essid>] [-i <bssid>] [-k <key>,...] [-s wep|wpa]
                     [-a open|shared] [-b bss|ibss] [-c] [-m a|b|g] [-T <time>]
                     [<link>]
    disconnect-wifi  [-a] [<link>]
    show-wifi        [-p] [-o <field>,...] [<link>]

    set-linkprop     [-t] -p <prop>=<value>[,...] <name>
    reset-linkprop   [-t] [-p <prop>,...] <name>
    show-linkprop    [-cP] [-o <field>,...] [-p <prop>,...] <name>

    show-ether       [-px][-o <field>,...] <link>

    create-secobj    [-t] [-f <file>] -c <class> <secobj>
    delete-secobj    [-t] <secobj>[,...]
    show-secobj      [-pP] [-o <field>,...] [<secobj>,...]

    create-vlan      [-ft] -l <link> -v <vid> [link]
    delete-vlan      [-t] <link>
    show-vlan        [-pP] [-o <field>,..] [<link>]

    create-iptun     [-t] -T <type> [-a {local|remote}=<addr>,...] <link>]
    delete-iptun     [-t] <link>
    modify-iptun     [-t] -a {local|remote}=<addr>,... <link>
    show-iptun       [-pP] [-o <field>,..] [<link>]

    delete-phys      <link>
    show-phys        [-pP] [-o <field>,..] [-H] [<link>]

    create-vnic      [-t] -l <link> [-m <value> | auto |
                     {factory [-n <slot-id>]} | {random [-r <prefix>]} |
                     {vrrp -V <vrid> -A {inet | inet6}} [-v <vid> [-f]]
                     [-p <prop>=<value>[,...]] <vnic-link>
    delete-vnic      [-t] <vnic-link>
    show-vnic        [-pP] [-l <link>] [-s [-i <interval>]] [<link>]

    create-part      [-t] [-f] -l <link> [-P <pkey>]
                     [-R <root-dir>] <part-link>
    delete-part      [-t] [-R <root-dir>] <part-link>
    show-part        [-pP] [-o <field>,...][-l <linkover>]
                     [<part-link>]
    show-ib          [-p] [-o <field>,...] [<link>]

    create-etherstub [-t] <link>
    delete-etherstub [-t] <link>
    show-etherstub   [-t] [<link>]

    create-bridge    [-R <root-dir>] [-P <protect>] [-p <priority>]
                     [-m <max-age>] [-h <hello-time>] [-d <forward-delay>]
                     [-f <force-protocol>] [-l <link>]... <bridge>
    modify-bridge    [-R <root-dir>] [-P <protect>] [-p <priority>]
                     [-m <max-age>] [-h <hello-time>] [-d <forward-delay>]
                     [-f <force-protocol>] <bridge>
    delete-bridge    [-R <root-dir>] <bridge>
    add-bridge       [-R <root-dir>] -l <link> [-l <link>]... <bridge>
    remove-bridge    [-R <root-dir>] -l <link> [-l <link>]... <bridge>
    show-bridge      [-p] [-o <field>,...] [-s [-i <interval>]] [<bridge>]
    show-bridge      -l [-p] [-o <field>,...] [-s [-i <interval>]] <bridge>
    show-bridge      -f [-p] [-o <field>,...] [-s [-i <interval>]] <bridge>
    show-bridge      -t [-p] [-o <field>,...] [-s [-i <interval>]] <bridge>

    show-usage       [-a] [-d | -F <format>] [-s <DD/MM/YYYY,HH:MM:SS>]
                     [-e <DD/MM/YYYY,HH:MM:SS>] -f <logfile> [<link>]
Ver los interfaces "físicos"
El primer paso es conocer nuestros interfaces físicos, y para ello utilizaremos el argumento <show-phys>
itily@openzooey:~$ pfexec /usr/sbin/dladm show-phys
LINK         MEDIA      STATE      SPEED  DUPLEX    DEVICE
e1000g0      Ethernet   up         1000   full      e1000g0
e1000g1      Ethernet   unknown    0      half      e1000g1
Ver los estado de los "enlaces"
Ahora debemos conocer "cómo están conectados" nuestros enlaces, para ello, utilizaremos la opción <show-link>
itily@openzooey:~$ pfexec dladm show-link
LINK        CLASS     MTU    STATE    BRIDGE     OVER
e1000g0     phys      1500   up       --         --
e1000g1     phys      1500   unknown  --         --
Virtualizar Interfaces de Red
Crossbow nos permite virtualizar los interfaces de red físicos, y asignarlos a una zona de Solaris como <ip-type=exclusive> de esta forma, podemos utilizar IPFilter de forma separada, y, también "mover" nuestra zona a otro host sin importarnos si la tarjeta de red es o no la misma.

Por defecto utilizaremos el nombre <vnicN> para definir nuestros interfaces virtuales, esto es debido a que en OpenSolaris existía un problema con la nomenclatura, y os recomiendo no cambiar a nombres "más complicados".

Para la creación de un interface virtual debemos seleccionar sobre que "interface físico" queremos montarlo, en nuestro caso lo haremos sobre <e1000g0> y lo llamaremos <vnic1>
itily@openzooey:~$ pfexec /sbin/dladm create-vnic -l e1000g0 vnic1

Ver Interfaces Virtuales
Para ver que interfaces virtuales tenemos declarados en nuestro host, utilizaremos la opción <show-vnic> y para ver su estado utilizaremos <show-link>
itily@openzooey:~$ pfexec /sbin/dladm show-vnic
LINK    OVER    SPEED  MACADDRESS      MACADDRTYPE  VID
vnic1   e1000g0 1000   2:8:20:cd:ad:34 random       0
itily@openzooey:~$ pfexec dladm show-link
LINK        CLASS     MTU    STATE    BRIDGE     OVER
e1000g0     phys      1500   up       --         --
e1000g1     phys      1500   unknown  --         --
vnic1       vnic      1500   up       --         e1000g0
Como vemos, <vnic1> está "asociado" al link físico <e1000g0> y se encuentra como "up"

Manejo de Interface Virtuales
La ventaja de uso de interfaces de red virtuales, radica en que se utilizan de igual forma que un interface físico, por lo tanto, podemos utilizar el comando <ifconfig> para asignarle una IP y "levantarlo", por ejemplo:
itily@openzooey:~$ pfexec ifconfig vnic1 plumb
itily@openzooey:~$ pfexec ifconfig vnic1 192.168.1.20/24 broadcast + up
itily@openzooey:~$ pfexec ifconfig vnic1
vnic1: flags=1000843 mtu 1500 index 3
        inet 192.168.1.20 netmask ffffff00 broadcast 192.168.1.255
        ether 2:8:20:cd:ad:34
Y desconectarlo ...
itily@openzooey:~$ pfexec ifconfig vnic1 unplumb
itily@openzooey:~$ pfexec ifconfig -a
lo0: flags=2001000849 mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1004843 mtu 1500 index 2
        inet 192.168.1.12 netmask ffffff00 broadcast 192.168.1.255
        ether 8:0:27:86:70:32
lo0: flags=2002000849 mtu 8252 index 1
        inet6 ::1/128
Eliminar un Interface Virtual
Para eliminar un interface de red virtual, deberemos utilizar la opción <delete-vnic> del comando <dladm>, por ejemplo,

itily@openzooey:~$ pfexec dladm delete-vnic vnic1
itily@openzooey:~$ pfexec dladm show-vnic
Ver las propiedades de un Enlace
Una de las opciones más interesantes que nos proporciona esta tecnología es tratar a los interfaces virtuales como "físicos" y, por lo tanto, podemos modificar los parámetros del enlace de forma similar.

Las propiedades de un enlace las obtendremos con la opción <show-linkprop> y el nombre del enlace, en nuestro caso <vnic1>.

El valor de PERM nos indicará si es posible modificarlo (rw), o por el contrario si es de sólo lectura (r-). Aunque hay muchas propiedades, hoy nos centraremos en dos: maxbw y priority.
itily@openzooey:~$ pfexec dladm show-linkprop vnic1
LINK         PROPERTY        PERM VALUE          DEFAULT        POSSIBLE
vnic1        autopush        rw   --             --             --
vnic1        zone            rw   --             --             --
vnic1        state           r-   unknown        up             up,down
vnic1        mtu             rw   1500           1500           1500
vnic1        maxbw           rw   --             --             --
vnic1        cpus            rw   --             --             --
vnic1        cpus-effective  r-   0              --             --
vnic1        pool            rw   --             --             --
vnic1        pool-effective  r-   --             --             --
vnic1        priority        rw   high           high           low,
                                                                medium,
                                                                high
vnic1        tagmode         rw   vlanonly       vlanonly       normal,vlanonly
vnic1        protection      rw   --             --       mac-nospoof,
                                                          restricted,
                                                          ip-nospoof,
                                                          dhcp-nospoof
vnic1        allowed-ips     rw   --             --             --
vnic1        allowed-dhcp-cids rw --             --             --
vnic1        rxrings         rw   --             --             --
vnic1        rxrings-effective r- --             --             --
vnic1        txrings         rw   --             --             --
vnic1        txrings-effective r- --             --             --
vnic1        txrings-available r- 0              --             --
vnic1        rxrings-available r- 0              --             --
vnic1        rxhwclnt-available r- 0             --             --
vnic1        txhwclnt-available r- 0             --             --
Modificar una propiedad de un enlace
Si la propiedad es de lectura y escritura (rw) entonces, podemos cambiar su valor utilizando la opción <set-linkprop -p OPCION=VALOR>, por ejemplo, vamos a modificar la velocidad de nuestro enlace <vnic1> y vamos a ponerlo a 10Mb en vez de 1000Mb:
itily@openzooey:~$ pfexec dladm set-linkprop -p maxbw=10m vnic1
itily@openzooey:~$ pfexec dladm show-vnic
LINK    OVER     SPEED  MACADDRESS       MACADDRTYPE   VID
vnic1   e1000g0  10     2:8:20:74:9a:f3  random        0
Y ahora la prioridad
itily@openzooey:~$ pfexec dladm set-linkprop -p priority=low vnic1

Crear una Zona con <ip-type=exclusive>
Como es costumbre en el blog, después de un poco de teoría, viene la práctica "real". Esta vez vamos a crear una zona de Solaris/OpenIndiana y vamos a asignar la IP como "exclusiva" para poder incluir IPFilter y poder gestionar el ancho de banda que nos consume nuestra zona.

Para ello, primero crearemos un sistema ZFS donde alojaremos la zona -zonepath- llamado </export/zones> (En mi caso el zpool es "rpool1"). Si ya disponéis de un espacio ZFS para zonas, no es necesario crear uno nuevo.
itily@openzooey:~$ pfexec zfs create rpool1/export/zones
Ahora ya podemos crear la zona, utilizaremos como nombre <pkg-srv> -espero que intuyáis para que la utilizaremos-
itily@openzooey:~$ pfexec zonecfg -z pkg-srv
pkg-srv: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:pkg-srv> create
zonecfg:pkg-srv> set zonepath=/export/zones/pkg-srv
zonecfg:pkg-srv> set ip-type=exclusive
zonecfg:pkg-srv> set scheduling-class=FSS
zonecfg:pkg-srv> add net
zonecfg:pkg-srv:net> set physical=vnic1
zonecfg:pkg-srv:net> end
zonecfg:pkg-srv> verify
zonecfg:pkg-srv> commit
zonecfg:pkg-srv> exit
itily@openzooey:~$ pfexec zoneadm -z pkg-srv install

Encender la zona
itily@openzooey:~$ pfexec /usr/sbin/zoneadm -z pkg-srv boot
Conectarse a la Consola
Para los que no tenemos un teclado en_US el carácter de escape de <zlogin> es un poco complicado, así que pongo un carácter más sencillo "#." de ahí la opción -e\#
itily@openzooey:~$ pfexec zlogin -C -e\# pkg-srv
[Connected to zone 'pkg-srv' console]
Pantalla de Resumen de Red
Aquí os  dejo la pantalla de resumen del asistente de configuración de la zona, y como podéis ver, para él (Solaris/OpenIndiana), el uso de una interface virtual no representa ningún cambio, la trata "igual"
─ Confirm Information for vnic1 ──────────────────

  > Confirm the following information.  If it is correct, press F2; to change any information, press F4.


                  Host name: pkg-srv
                 IP address: 192.168.1.20
    System part of a subnet: Yes
                    Netmask: 255.255.255.0
                Enable IPv6: No
              Default Route: Specify one
          Router IP Address: 192.168.1.1


────────────────────────────────────────────────
    Esc-2_Continue    Esc-4_Change    Esc-6_Help
Instalar IPFilter
Una vez finalizado el proceso de configuración de la zona, podemos realizar la Instalación de IPFilter en la Zona con un simple
root@pkg-srv:~# pkg install ipfilter
Conclusiones
En esta primera parte hemos visto cómo es muy sencillo crear interfaces virtuales y, como se comportan "igual" que los físicos. Además, al poder modificar las propiedades de una forma "sencilla",  tenemos un control más exhaustivo.

En las siguientes entregas veremos un poco más sobre propiedades, flujos y, sobre todo, cómo aplicarlo a nuestros entornos de producción, pero hasta entonces ... a esperar.

Como siempre, cualquier duda o sugerencia es bienvenida,





Referencias

3 comentarios:

  1. Nocthulh: Fenomenal el articulo, la verdad siempre me costo mucho encontrar información clara sobre este tema, y mas encima en español. felicitacion y por favor sigue adelante con tu iniciativa, estare atento a la segunda parte

    ResponderEliminar
  2. Exelente tengo mi zona instalada y conectada a internet con su nic virtual discriminado su BW en 90m.

    lo que me hace entender lo siguiente:

    Si contara con una tarjeta Giga y discrimino un BW de 100m para 9 zonas y el resto para el sistema base, ¿seria como si técnicamente tuviera 10 tarjetas 10/100?

    bueno se que me adelanto a futuras entregas pero yo podria pensar que con openindiana/crossbow/varias-nics-fisicas(con vnics como bocas virtuales) ¿podria crear una suerte de switch administrable con QOS y Vlans?

    Un Saludo

    ResponderEliminar
  3. Hola NocThulh,

    Muchas Gracias por tus comentarios, y ... sí en futuras entregas veremos cómo podemos hacer lo que dices, (partir tarjetas por zonas y añadirlas a CPUs en concreto, todo ello sumando QoS y VLANs)

    Pero ... toca esperar un poco :d

    Gracias de nuevo,
    Urko

    ResponderEliminar