Estoy probando zonas en Solaris 10, versión 10/09 (s10x_u8wos_08a) con el kernel Generic_142901-04.
El servidor host tiene dos NIC físicas (bnx0 y bnx1) y, dado que tengo la intención de ejecutar varias (tres o más) zonas, dedicar una NIC a una zona está fuera de discusión. Actualmente, no tengo ninguna dirección IP "dedicada" asignada a estas zonas, por lo que estoy obteniendo concesiones de DHCP.
Mis preguntas, a las que volveremos una vez que les haya mostrado mi configuración actual, giran principalmente en torno a esta configuración de red.
Estos son los pasos (con información adicional) que seguí para configurar la zona:
erikn@global:~ $ zpool status zpool1
pool: zpool1
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
zpool1 ONLINE 0 0 0
c1t1d0 ONLINE 0 0 0
errors: No known data errors
erikn@global:~ $ zfs list zpool1
NAME USED AVAIL REFER MOUNTPOINT
zpool1 84.1G 183G 6.14G /zpool1
erikn@global:~ $ pfexec zfs create zpool1/zones
erikn@global:~ $ pfexec zfs set mountpoint=/zones zpool1/zones
erikn@global:~ $ pfexec zonecfg -z test \
> 'create -b ;
> set zonepath=/zones/test ;
> verify ;
> commit'
erikn@global:~ $ zoneadm list -vic
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- test configured /zones/test native shared
Procedí a instalar la zona.
erikn@global:~ $ pfexec zoneadm -z test install
A ZFS file system has been created for this zone.
Preparing to install zone <test>.
Creating list of files to copy from the global zone.
Copying <196614> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1595> packages on the zone.
Initialized <1595> packages on zone.
Zone <test> is initialized.
Installation of these packages generated errors: <SUNWvbox SUNWpostgr-83-server-data-root CSWcacertificates CSKmysql32 SUNWpostgr-82-libs SUNWpostgr-82-server SUNWpostgr-82-client SUNWpostgr-82-devel CSKphp5 SUNWpostgr-82-contrib CSKapache2 SUNWpostgr-82-server-data-root>
Installation of <1> packages was skipped.
The file </zones/test/root/var/sadm/system/logs/install_log> contains a log of the zone installation.
Algunos paquetes generaron errores, pero eso no me preocupa mucho ya que de todos modos no los necesito dentro de esta zona.
La instalación finalizó con cero de todos modos.
erikn@global:~ $ echo $?
0
Arranqué la zona
erikn@global:~ $ pfexec zoneadm -z test boot
Y conectado a la "consola".
erikn@global:~ $ pfexec zlogin -C test
Seguí la instalación; seleccionar un idioma (inglés), configurar la configuración regional (EE. UU. (en_US.ISO8859-1)), tipo de terminal (DEC VT100), asignarle un nombre de host (prueba), configurar la zona horaria (Europa/Oslo), configurar una contraseña de root ( "contraseña123" - no, es broma).
Cambió el shell raíz a bash:
# usermod -s /usr/bin/bash root
UX: usermod: root is currently logged in, some changes may not take effect until next login.
Cerré la sesión y volví a iniciarla.
Como había muchos servicios habilitados (incluidos telnet y finger), pensé que sería más fácil deshabilitar todo y luego volver a habilitar los servicios hasta que tuviera un sistema que funcionara.
-bash-3.00# svcs | grep " svc:" | sed "s/ \{1,\}/ /g" | cut -d' ' -f3 | \
> xargs svcadm disable
Al hacer esto, como se esperaba, la zona entró en el modo de mantenimiento del sistema.
Volví a habilitar todos los servicios de Milstone:
-bash-3.00# svcs -a | grep " svc:/milestone/" | sed "s/ \{1,\}/ /g" | \
> cut -d' ' -f3 | xargs svcadm enable
Sshd y syslogd habilitados.
-bash-3.00# svcadm enable svc:/network/ssh:default
-bash-3.00# svcadm enable svc:/system/system-log:default
Se conecta a los servicios de dependencia, permitiéndoles:
-bash-3.00# while [ $( svcs -xv | wc -l ) -gt 0 ] ; do
> svcs -xv | grep "^svc" | cut -d' ' -f1 | xargs svcadm enable
> done
Hostname: test
Reading ZFS config: done.
Habilité el inicio de sesión en la consola y verifiqué el estado.
-bash-3.00# svcadm enable svc:/system/console-login:default
-bash-3.00# svcs -xv
svc:/system/console-login:default (Console login)
State: offline since August 27, 2012 11:38:04 AM CEST
Reason: Unknown.
See: http://sun.com/msg/SMF-8000-AR
See: man -M /usr/share/man -s 1M ttymon
Impact: This service is not running.
Reinicié la zona.
-bash-3.00# reboot
Fue recibido por el mensaje de inicio de sesión de la consola. Iniciado sesión. Estado del servicio comprobado:
-bash-3.00# svcs -xv
Ningún resultado es un buen resultado.
Detuve la zona y tomé una instantánea de la zona global por si acaso.
-bash-3.00# halt
Aug 27 12:10:08 test halt: halted by root
Aug 27 12:10:09 test syslogd: going down on signal 15
[NOTICE: Zone halted]
~.
[Connection to zone 'test' console closed]
erikn@global:~ $ pfexec zfs snapshot zpool1/zones/test@neat
Después de esto, reinicié la zona nuevamente, descubrí el orden de dependencia de los paquetes que se instalaron (usando el script "pkgdep"encontrado aquí), y eliminé algunas de las cosas que no necesitaba.
A continuación llegó el momento de configurar la red, que es de lo que trata esta pregunta.
Desde la zona global, creé una interfaz lógica y la asigné a la zona "prueba".
erikn@global:~ $ pfexec ifconfig bnx1:1 plumb zone test
Podemos verificar que esto fue asignado a la zona:
-bash-3.00# ifconfig bnx1:1
bnx1:1: flags=1100842<BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4> mtu 1500 index 5
inet 0.0.0.0 netmask 0
Ahora, dado que la zona está configurada con el tipo de IP "compartida", no podrá enviar solicitudes DHCP en la interfaz. Por tanto, lo hacemos desde la zona global:
erikn@global:~ $ pfexec ifconfig bnx1:1 dhcp start
ifconfig: bnx1:1: wait timed out, operation still pending...
Eso no salió muy bien, ¿verdad?
erikn@global:~ $ echo $?
4
De vuelta a la zona.
-bash-3.00# ifconfig bnx1:1
bnx1:1: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,ROUTER,IPv4> mtu 1500 index 5
inet 10.0.6.92 netmask fffffc00 broadcast 10.0.7.255
Bueno, tenemos una dirección IP... (Aquí he reemplazado la red con 10.0.4.0/22, pero la máscara de red es la misma).
Modificamos nuestro /etc/nsswitch.conf y /etc/resolv.conf para usar nuestros servidores de nombres.
Dado que estamos usando un proxy HTTP en nuestra red, debemos recordar exportarlo (normalmente lo pongo en ~/.bash_profile)
-bash-3.00# export http_proxy=http://proxy.example.com:8080
-bash-3.00# /usr/sfw/bin/wget http://www.google.com
--2012-08-27 13:03:30-- http://www.google.com/
Resolving proxy.example.com... 10.0.7.17
Connecting to proxy.example.com|10.0.7.17|:8080... connected.
Proxy request sent, awaiting response... 302 Found
Location: http://www.google.no/ [following]
--2012-08-27 13:03:40-- http://www.google.no/
Connecting to proxy.example.com|10.0.7.17|:8080... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `index.html'
[ <=> ] 11,343 --.-K/s in 0s
2012-08-27 13:03:40 (65.3 MB/s) - `index.html' saved [11343]
Aunque las cosas parecen estar funcionando, no es perfecto. Volvamos a la zona global.
Primero tenemos la interfaz bnx1 real, que también usa DHCP.
erikn@global:~ $ ifconfig bnx1 dhcp status
Interface State Sent Recv Declined Flags
bnx1 BOUND 2357 1558 778
(Began, Expires, Renew) = (08/27/2012 12:09, 08/31/2012 12:09, 08/29/2012 12:09)
Luego tenemos nuestra interfaz lógica:
erikn@global:~ $ ifconfig bnx1:1 dhcp status
Interface State Sent Recv Declined Flags
bnx1:1 PRE_BOUND 20 14 6
Creemos otra interfaz lógica, pero esta no se la daremos a ninguna zona, por lo que pertenecerá a la zona global:
erikn@global:~ $ pfexec ifconfig bnx1:2 plumb
erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start
erikn@global:~ $ echo $?
0
erikn@global:~ $ ifconfig bnx1:2
bnx1:2: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,ROUTER,IPv4> mtu 1500 index 5
inet 10.0.6.123 netmask fffffc00 broadcast 10.0.7.255
erikn@global:~ $ ifconfig bnx1:2 dhcp status
Interface State Sent Recv Declined Flags
bnx1:2 BOUND 5 4 1
(Began, Expires, Renew) = (08/27/2012 13:11, 08/31/2012 13:11, 08/29/2012 13:11)
Así que funcionó bastante bien. Por desgracia, no nos ayuda mucho.
Intenté entregar esa interfaz a la zona "prueba":
erikn@global:~ $ pfexec ifconfig bnx1:2 zone test
erikn@global:~ $ echo $?
0
No estaba muy contento con eso:
erikn@global:~ $ ifconfig bnx1:2 dhcp status
Interface State Sent Recv Declined Flags
bnx1:2 DECLINING 6 4 2
Y liberar e iniciar el cliente DHCP nuevamente en la interfaz conduce al mismo resultado que vimos la última vez:
erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp release
erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start
ifconfig: bnx1:2: wait timed out, operation still pending...
Como último y desesperado intento, intenté:
erikn@global:~ $ pfexec ifconfig bnx1:2 plumb \
> netmask 0xfffffc00 \
> broadcast 10.0.7.255 \
> zone test \
> up
No hubo tanta suerte.
erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start
ifconfig: bnx1:2: wait timed out, operation still pending...
Mis preguntas son básicamente:
¿Es posible tener IP asignadas por DHCP para una zona Solaris 10/09 sin darle una NIC física propia?
¿Estoy haciendo esto de manera incorrecta? ¿Debería tener IP privadas para las zonas y dejar que la computadora host realice NAT? ¿Es eso posible?
El objetivo final para mí es tener diferentes servicios conectados a la red ejecutándose en cada zona.
Habrá cierta comunicación de red entre las zonas y
También ejecutarán servicios accesibles a la red que serán utilizados por otros hosts de nuestra red.
Respuesta1
La interfaz virtual de zona tiene algunas características limitadas... algunos estados no se pueden configurar, el filtro de paquetes tampoco funciona en la zona. Si no recuerdo mal, la interfaz de zona no puede enviar transmisiones de Ethernet, por lo que no hay DHCP.
Por cierto, ¿por qué estás haciendo tanto ruido sobre la configuración de la interfaz de zona? ¿Qué pasa con esto?
pfexec zonecfg -z test
> 'create -b ;
> set zonepath=/zones/test ;
> add net ;
> set physica=bnx1 ;
> set address=10.0.6.92 ;
> end ;
> verify ;
> commit'
Heredará la máscara de red de la interfaz de la zona global. Por supuesto, puede configurar más interfaces o colocar la zona solo en la interfaz 'interna' (sin IP pública) y dejar que ipf
se proporcione NAT
.