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/dladmVer los interfaces "físicos"
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>]
El primer paso es conocer nuestros interfaces físicos, y para ello utilizaremos el argumento <show-phys>
itily@openzooey:~$ pfexec /usr/sbin/dladm show-physVer los estado de los "enlaces"
LINK MEDIA STATE SPEED DUPLEX DEVICE
e1000g0 Ethernet up 1000 full e1000g0
e1000g1 Ethernet unknown 0 half e1000g1
Ahora debemos conocer "cómo están conectados" nuestros enlaces, para ello, utilizaremos la opción <show-link>
itily@openzooey:~$ pfexec dladm show-linkVirtualizar Interfaces de Red
LINK CLASS MTU STATE BRIDGE OVER
e1000g0 phys 1500 up -- --
e1000g1 phys 1500 unknown -- --
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-vnicComo vemos, <vnic1> está "asociado" al link físico <e1000g0> y se encuentra como "up"
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
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 plumbY desconectarlo ...
itily@openzooey:~$ pfexec ifconfig vnic1 192.168.1.20/24 broadcast + up
itily@openzooey:~$ pfexec ifconfig vnic1
vnic1: flags=1000843mtu 1500 index 3
inet 192.168.1.20 netmask ffffff00 broadcast 192.168.1.255
ether 2:8:20:cd:ad:34
itily@openzooey:~$ pfexec ifconfig vnic1 unplumbEliminar un Interface Virtual
itily@openzooey:~$ pfexec ifconfig -a
lo0: flags=2001000849mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
e1000g0: flags=1004843mtu 1500 index 2
inet 192.168.1.12 netmask ffffff00 broadcast 192.168.1.255
ether 8:0:27:86:70:32
lo0: flags=2002000849mtu 8252 index 1
inet6 ::1/128
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 vnic1Ver las propiedades de un Enlace
itily@openzooey:~$ pfexec dladm show-vnic
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 vnic1Modificar una propiedad de un enlace
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 -- --
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 vnic1Y ahora la prioridad
itily@openzooey:~$ pfexec dladm show-vnic
LINK OVER SPEED MACADDRESS MACADDRTYPE VID
vnic1 e1000g0 10 2:8:20:74:9a:f3 random 0
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/zonesAhora 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 bootConectarse 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-srvPantalla de Resumen de Red
[Connected to zone 'pkg-srv' console]
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 ──────────────────Instalar IPFilter
> 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
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 ipfilterConclusiones
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
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
ResponderEliminarExelente tengo mi zona instalada y conectada a internet con su nic virtual discriminado su BW en 90m.
ResponderEliminarlo 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
Hola NocThulh,
ResponderEliminarMuchas 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