Guía de administración del sistema: servicios IP

Capítulo 18 Comandos y archivos DHCP (referencia)

En este capítulo se explican las relaciones entre los comandos DHCP y los archivos DHCP. En él no se explica el uso de los comandos.

El capítulo contiene la información siguiente:

Comandos DHCP

En la tabla siguiente se enumeran los comandos que se pueden utilizar para gestionar DHCP en la red.

Tabla 18–1 Comandos utilizados en DHCP

Orden 

Descripción 

Página de comando man 

dhtadm

Se emplea para efectuar cambios en las opciones y macros de dhcptab. Este comando resulta útil en secuencias creadas para automatizar los cambios en la información DHCP. Utilice dhtadm con la opción -P y redirija la salida al comando grep para buscar de forma rápida valores específicos de opciones en la tabla dhcptab.

dhtadm(1M)

pntadm

Se utiliza para efectuar cambios en las tablas de red DHCP que asignan ID de cliente a direcciones IP y, de foram opcional, asocian información de configuración con direcciones IP.

pntadm(1M)

dhcpconfig

Se usa para configurar y desconfigurar servidors DHCP y agentes de reenvío BOOTP. También se utiliza para convertir a un formato de almacén de datos distinto y para importar y exportar datos de configuración DHCP.

dhcpconfig(1M)

in.dhcpd

Daemon del servidor DHCP. El daemon se inicia al iniciarse el sistema. No es conveniente iniciar el daemon del servidor directamente. Utilice DHCP Manager, el comando svcadm o dhcpconfig para iniciar y detener el daemon. El daemon solo se debe llamar directamente para ejecutar el servidor en modo de depuración y para resolver problemas.

in.dhcpd(1M)

dhcpmgr

DHCP Manager, una interfaz gráfica de usuario (GUI) que se utiliza para la configuración y gestión del servicio DHCP. DHCP Manager es la herramienta recomendada para gestionar DHCP de Oracle Solaris.

dhcpmgr(1M)

ifconfig

Se utiliza en el inicio del sistema para asignar direcciones IP a interfaces de red, configurar parámetros de red o ambas funciones. En un cliente DHCP de Oracle Solaris, ifconfig inicia DHCP para obtener los parámetros (incluida la dirección IP) necesarios para configurar una interfaz de red.

ifconfig(1M)

dhcpinfo

Lo utilizan las secuencias de inicio de los sistemas cliente de Oracle Solaris para obtener información (como el nombre de host) para el daemon del cliente DHCP, dhcpagent. También se puede utilizar dhcpinfo en secuencias o en la línea de comandos para obtener valores de parámetros específicos.

dhcpinfo(1)

snoop

Se utiliza para capturar y mostrar el contenido de paquetes que circulan por la red. snoop resulta útil para resolver problemas del servicio DHCP.

snoop(1M)

dhcpagent

El daemon del cliente DHCP, que implementa el extrremo cliente del protocolo DHCP. 

dhcpagent(1M)

Ejecución de comandos DHCP en secuencias

Los comandos dhcpconfig, dhtadm y pntadm están optimizados para su uso en secuencias. En particular, el comando pntadm es útil para crear una gran cantidad de entradas de dirección IP en una tabla de red DHCP. En la siguiente secuencia de ejemplo se utiliza pntadm en modo de proceso por lotes para crear direcciones IP.


Ejemplo 18–1 Secuencia addclient.ksh con el comando pntadm

#! /usr/bin/ksh
#
# This script utilizes the pntadm batch facility to add client entries
# to a DHCP network table. It assumes that the user has the rights to
# run pntadm to add entries to DHCP network tables.

#
# Based on the nsswitch setting, query the netmasks table for a netmask.
# Accepts one argument, a dotted IP address.
#
get_netmask()
{
	MTMP=`getent netmasks ${1} | awk '{ print $2 }'`
	if [ ! -z "${MTMP}" ]
	then
		print - ${MTMP}
	fi
}

#
# Based on the network specification, determine whether or not network is 
# subnetted or supernetted.
# Given a dotted IP network number, convert it to the default class
# network.(used to detect subnetting). Requires one argument, the
# network number. (e.g. 10.0.0.0) Echos the default network and default
# mask for success, null if error.
#
get_default_class()
{
	NN01=${1%%.*}
	tmp=${1#*.}
	NN02=${tmp%%.*}
	tmp=${tmp#*.}
	NN03=${tmp%%.*}
	tmp=${tmp#*.}
	NN04=${tmp%%.*}
	RETNET=""
	RETMASK=""

	typeset -i16 ONE=10#${1%%.*}
	typeset -i10 X=$((${ONE}&16#f0))
	if [ ${X} -eq 224 ]
	then
		# Multicast
		typeset -i10 TMP=$((${ONE}&16#f0))
		RETNET="${TMP}.0.0.0"
		RETMASK="240.0.0.0"
	fi
	typeset -i10 X=$((${ONE}&16#80))
	if [ -z "${RETNET}" -a ${X} -eq 0 ]
	then
		# Class A
		RETNET="${NN01}.0.0.0"
		RETMASK="255.0.0.0"
	fi
	typeset -i10 X=$((${ONE}&16#c0))
	if [ -z "${RETNET}" -a ${X} -eq 128 ]
	then
		# Class B
		RETNET="${NN01}.${NN02}.0.0"
		RETMASK="255.255.0.0"
	fi
	typeset -i10 X=$((${ONE}&16#e0))
	if [ -z "${RETNET}" -a ${X} -eq 192 ]
	then
		# Class C
		RETNET="${NN01}.${NN02}.${NN03}.0"
		RETMASK="255.255.255.0"
	fi
	print - ${RETNET} ${RETMASK}
	unset NNO1 NNO2 NNO3 NNO4 RETNET RETMASK X ONE
}

#
# Given a dotted form of an IP address, convert it to its hex equivalent.
#
convert_dotted_to_hex()
{
	typeset -i10 one=${1%%.*}
	typeset -i16 one=${one}
	typeset -Z2 one=${one}
	tmp=${1#*.}

	typeset -i10 two=${tmp%%.*}
	typeset -i16 two=${two}
	typeset -Z2 two=${two}
	tmp=${tmp#*.}

	typeset -i10 three=${tmp%%.*}
	typeset -i16 three=${three}
	typeset -Z2 three=${three}
	tmp=${tmp#*.}

	typeset -i10 four=${tmp%%.*}
	typeset -i16 four=${four}
	typeset -Z2 four=${four}

	 hex=`print - ${one}${two}${three}${four} | sed -e 's/#/0/g'`
	 print - 16#${hex}
	 unset one two three four tmp
}

#
# Generate an IP address given the network address, mask, increment.
# 
get_addr()
{
	typeset -i16 net=`convert_dotted_to_hex ${1}`
	typeset -i16 mask=`convert_dotted_to_hex ${2}`
	typeset -i16 incr=10#${3}

	# Maximum legal value - invert the mask, add to net.
	typeset -i16 mhosts=~${mask}
	typeset -i16 maxnet=${net}+${mhosts}

	# Add the incr value.
	let net=${net}+${incr}

	if [ $((${net} < ${maxnet})) -eq 1 ]
	then
		typeset -i16 a=${net}\&16#ff000000
		typeset -i10 a="${a}>>24"

		typeset -i16 b=${net}\&16#ff0000
		typeset -i10 b="${b}>>16"

		typeset -i16 c=${net}\&16#ff00
		typeset -i10 c="${c}>>8"

		typeset -i10 d=${net}\&16#ff
		print - "${a}.${b}.${c}.${d}"
	fi
	unset net mask incr mhosts maxnet a b c d
}

# Given a network address and client address, return the index.
client_index()
{
	typeset -i NNO1=${1%%.*}
	tmp=${1#*.}
	typeset -i NNO2=${tmp%%.*}
	tmp=${tmp#*.}
	typeset -i NNO3=${tmp%%.*}
	tmp=${tmp#*.}
	typeset -i NNO4=${tmp%%.*}

	typeset -i16 NNF1
	let NNF1=${NNO1}
	typeset -i16 NNF2
	let NNF2=${NNO2}
	typeset -i16 NNF3
	let NNF3=${NNO3}
	typeset -i16 NNF4
	let NNF4=${NNO4}
	typeset +i16 NNF1
	typeset +i16 NNF2
	typeset +i16 NNF3
	typeset +i16 NNF4
	NNF1=${NNF1#16\#}
	NNF2=${NNF2#16\#}
	NNF3=${NNF3#16\#}
	NNF4=${NNF4#16\#}
	if [ ${#NNF1} -eq 1 ]
	then
		NNF1="0${NNF1}"
	fi
	if [ ${#NNF2} -eq 1 ]
	then
		NNF2="0${NNF2}"
	fi
	if [ ${#NNF3} -eq 1 ]
	then
		NNF3="0${NNF3}"
	fi
	if [ ${#NNF4} -eq 1 ]
	then
		NNF4="0${NNF4}"
	fi
	typeset -i16 NN
	let NN=16#${NNF1}${NNF2}${NNF3}${NNF4}
	unset NNF1 NNF2 NNF3 NNF4

	typeset -i NNO1=${2%%.*}
	tmp=${2#*.}
	typeset -i NNO2=${tmp%%.*}
	tmp=${tmp#*.}
	typeset -i NNO3=${tmp%%.*}
	tmp=${tmp#*.}
	typeset -i NNO4=${tmp%%.*}
	typeset -i16 NNF1
	let NNF1=${NNO1}
	typeset -i16 NNF2
	let NNF2=${NNO2}
	typeset -i16 NNF3
	let NNF3=${NNO3}
	typeset -i16 NNF4
	let NNF4=${NNO4}
	typeset +i16 NNF1
	typeset +i16 NNF2
	typeset +i16 NNF3
	typeset +i16 NNF4
	NNF1=${NNF1#16\#}
	NNF2=${NNF2#16\#}
	NNF3=${NNF3#16\#}
	NNF4=${NNF4#16\#}
	if [ ${#NNF1} -eq 1 ]
	then
		NNF1="0${NNF1}"
	fi
	if [ ${#NNF2} -eq 1 ]
	then
		NNF2="0${NNF2}"
	fi
	if [ ${#NNF3} -eq 1 ]
	then
		NNF3="0${NNF3}"
	fi
	if [ ${#NNF4} -eq 1 ]
	then
		NNF4="0${NNF4}"
	fi
	typeset -i16 NC
	let NC=16#${NNF1}${NNF2}${NNF3}${NNF4}
	typeset -i10 ANS
	let ANS=${NC}-${NN}
	print - $ANS
}

#
# Check usage.
#
if [ "$#" != 3 ]
then
	print "This script is used to add client entries to a DHCP network"
	print "table by utilizing the pntadm batch facilty.\n"
	print "usage: $0 network start_ip entries\n"
	print "where: network is the IP address of the network"
        print "       start_ip is the starting IP address \n"
        print "       entries is the number of the entries to add\n"
	print "example: $0 10.148.174.0 10.148.174.1 254\n"
	return
fi

#
# Use input arguments to set script variables.
#
NETWORK=$1
START_IP=$2
typeset -i STRTNUM=`client_index ${NETWORK} ${START_IP}`
let ENDNUM=${STRTNUM}+$3
let ENTRYNUM=${STRTNUM}
BATCHFILE=/tmp/batchfile.$$
MACRO=`uname -n`

#
# Check if mask in netmasks table. First try
# for network address as given, in case VLSM
# is in use.
#
NETMASK=`get_netmask ${NETWORK}`
if [ -z "${NETMASK}" ]
then
	get_default_class ${NETWORK} | read DEFNET DEFMASK
	# use the default.
	if [ "${DEFNET}" != "${NETWORK}" ]
	then
		# likely subnetted/supernetted.
		print - "\n\n###\tWarning\t###\n"
		print - "Network ${NETWORK} is netmasked, but no entry was found  \n
              in the 'netmasks' table; please update the 'netmasks'  \n
              table in the appropriate nameservice before continuing. \n 
              (See /etc/nsswitch.conf.) \n" >&2
		return 1
	else
		# use the default.
		NETMASK="${DEFMASK}"
	fi
fi

#
# Create a batch file.
#
print -n "Creating batch file "
while [ ${ENTRYNUM} -lt ${ENDNUM} ]
do
	if [ $((${ENTRYNUM}-${STRTNUM}))%50 -eq 0 ]
	then
		print -n "."
	fi

	CLIENTIP=`get_addr ${NETWORK} ${NETMASK} ${ENTRYNUM}`
	print "pntadm -A ${CLIENTIP} -m ${MACRO} ${NETWORK}" >> ${BATCHFILE}
	let ENTRYNUM=${ENTRYNUM}+1
done
print " done.\n"

#
# Run pntadm in batch mode and redirect output to a temporary file.
# Progress can be monitored by using the output file.
#
print "Batch processing output redirected to ${BATCHFILE}"
print "Batch processing started."

pntadm -B ${BATCHFILE} -v > /tmp/batch.out 2 >&1

print "Batch processing completed."

Archivos que utiliza el servicio DHCP

En la tabla siguiente se enumeran los archivos asociados con DHCP de Oracle Solaris.

Tabla 18–2 Archivos y tablas utilizados por los daemons y comandos DHCP

Nombre de archivo o tabla 

Descripción 

Página de comando man 

dhcptab

Término genérico para la tabla que contiene la información o configuración de DHCP registrada en forma de opciones con valores asignados y luego agrupadas en forma de macros. El nombre de la tabla dhcptab y su ubicación los determinan el almacén de datos que se utiliza para la información DHCP.

dhcptab(4)

Tabla de red DHCP 

Asigna direcciones IP a ID de cliente y opciones de configuración. Las tablas de red DHCP se nombran según la dirección IP de la red, como 10.21.32.0. No hay ningún archivo llamado dhcp_network. El nombre y la ubicación de las tablas de red DHCP los determina el almacén de datos utilizado para la información de DHCP.

dhcp_network(4)

dhcpsvc.conf

Almacena opciones de inicio para el daemon DHCP e información para el almacén de datos. Este archivo no debe editarse de forma manual. Utilice el comando dhcpconfig para modificar las opciones de inicio.

dhcpsvc.conf(4)

nsswitch.conf

Especifica la ubicación de las bases de datos de servicios de nombres y el orden en que se debe buscar en los servidores de nombres diversos tipos de información. El archivo nsswitch.conf se lee para obtener información de configuración precisa al configurar un servidor DHCP. El archivo se ecnuentra en el directorio /etc.

nsswitch.conf(4)

resolv.conf

Contiene información que se emplea para resolver consultas de DNS. Durante la configuración del servidor DHCP se consulta este archivo para obtener información acerca del dominio DNS y del servidor DNS. El archivo se ecnuentra en el directorio /etc.

resolv.conf(4)

dhcp.interfaz

Indica que se debe utilizar DHCP en la interfaz de red del cliente especificada en el nombre de archivo dhcp.interfaz. Por ejemplo, la existencia de un archivo denominado dhcp.qe0 indica que se debe utilizar DHCP en la interfaz qe0. El archivo dhcp.interfaz puede contener comandos que se pasan como opciones al comando ifconfig, que a su vez se utiliza para iniciar DHCP en el cliente. El archivo se encuentra en el directorio /etc de los sistemas cliente DHCP de Oracle Solaris.

No hay página de comando man específica, consulte dhcp(5)

interfaz.dhc

Contiene los parámetros de configuración obtenidos de DHCP para la interfaz de red especificada. El cliente guarda la información de configuración actual en /etc/dhcp/interfaz.dhc cuando se termina el permiso de la dirección IP actual. Por ejemplo, si se usa DHCP en la interfaz qe0, dhcpagent guarda la información de configuración en /etc/dhcp/qe0.dhc. La siguiente vez que se inicia DHCP en la interfaz, el cliente solicita utilizar la información guardada si el permiso no ha caducado. Si el servidor DHCP deniega la solicitud, el cliente inicia el proceso estándar de negociación de permiso DHCP.

No hay página de comando man específica, consulte dhcpagent(1M)

dhcpagent

Establece valores de parámetros para el daemon de cliente dhcpagent. La ruta al archivo es /etc/default/dhcpagent. Para más información acerca de los parámetros consulte el archivo /etc/default/dhcpagent o la página de comando man dhcpagent(1M).

dhcpagent(1M)

DHCP inittab

Define diversos aspectos de códigos de opciones DHCP, como el tipo de datos, y asigna etiquetas mnemónicas. Para más información acerca de la sintaxis del archivo consulte la página de comando man dhcp_inittab(4).

En el cliente, la información del archivo /etc/dhcp/inittab la utiliza dhcpinfo para proporcionar información más significativa a los lectores humanos de la información. En el sistema servidor DHCP, este archivo lo utiliza el daemon DHCP y las herramientas de gestión para obtener información de opciones DHCP.

El archivo /etc/dhcp/inittab sustituye al archivo /etc/dhcp/dhcptags utilizado en versiones anteriores. En Información de opciones DHCP hallará más información acerca de esta sustitución.

dhcp_inittab(4)

Información de opciones DHCP

Historicalmente, la información de opciones DHCP se ha guardado en diversos lugarres, como la tabla dhcptab del servidor, el archivo dhcptags del cliente y tablas internas de diversos programas. En la versión 8 de Solaris y posteriores, la información de opciones se ha consolidado en el archivo /etc/dhcp/inittab. Para información detallada acerca del archivo consulte la página de comando man dhcp_inittab(4).

El cliente DHCP de Oracle Solaris utiliza el archivo inittab de DHCP para sustituir al archivo dhcptags. El cliente utiliza este archivo para obtener información acerca de los códigos de opciones recibidos en un paquete DHCP. Los programas in.dhcpd, snoop y dhcpmgr del servidor DHCP utilizan también el archivo inittab.

Cómo determinar si su sitio se ve afectado

La mayor parte de sitios que utilizan DHCP de Oracle Solaris no se ven afectados por el cambio al archivo /etc/dhcp/inittab. Su sitio se verá afectado si cumple la totalidad de los criterios siguientes:

Al actualizarse, el registro de actualización le notifica que su archivo dhcptags e ha modificado y que deberá efectuar cambios en en el archivo inittab de DHCP.

Diferencias entre los archivos dhcptags y inittab

El archivo inittab contiene más información que el archivo dhcptags. Además, inittab utiliza una sintaxis distinta.

A continuación se muestra un ejemplo de una entrada de dhcptags:

33 StaticRt - IPList Static_Routes

33 es el código numérico que se pasa en el paquete DHCP. StaticRt es el nombre de la opción. IPList indica que el tipo de datos de StaticRt debe ser una lista de direcciones IP. Static_Routes es un nombre más descriptivo.

El archivo inittab consta de registros de una línea en los que se describe cada opción. El formato es similar al que define los símbolos en dhcptab. En la tabla siguiente se describe la sintaxis del archivo inittab .

Opción

Descripción

nombre_opción

Nombre de la opción El nombre de la opción debe ser único dentro de la categoría de la opción y no superponerse con los nombres de otras opciones en las categorías Standard, Site y Vendor. Por ejemplo, no puede haber dos opciones en Site que se llamen igual, y no se debe crear una opción de Site con el mismo nombre de una opción de Standard.

categoría

Identifica el espacio de nombres al que pertenece la opción. Debe ser uno de los siguientes: Standard, Site, Vendor, Field o Internal.

código

Identifica la opción cuando se envía a la red. En la mayor parte de casos, el código identifica la opción de forma unívoca, sin necesidad de categoría. Sin embargo, en el caso de las categorías internas como Field o Internal, un código se puede utilizar con otra finalidad. Es posible que el código no sea único a nivel global. El código debe ser único dentro de la categoría de la opción, y no superponerse con los códigos en los campos Standard y Site.

type

Describe los datos asociados con esta opción. Los tipos válidos son IP, ASCII, Octet, Boolean, Unumber8, Unumber16, Unumber32, Unumber64, Snumber8, Snumber16, Snumber32 y Snumber64. Para números, la inicial indica si el número tiene signo (S) o no (U). Los dígitos al final indican cuántos bits hay en el número. Por ejemplo, Unumber8 es un número sin signo de 8 bits. El tipo no distingue mayúsculas de minúsculas.

granularidad

Describe cuántas unidades de datos componen un valor completo para esta opción.

máximo

Describe cuántos valores completos se permiten para esta opción. 0 indica un número infinito.

consumidores

Describe qué programas pueden utilizar esta información. Consumidores debe establecerse en sdmi, donde:

s

snoop

d

in.dhcpd

m

dhcpmgr

i

dhcpinfo

A continuación se muestra un ejemplo de entrada de inittab:

StaticRt - Standard, 33, IP, 2, 0, sdmi

En esta entrada se describe una opción denominada StaticRt. La opción está en la categoría estándar y el código de opción es el 33. Los datos previstos son probablemente una cantidad infinita de pares de direcciones porque el tipo es IP, la granularidad es 2 y el máximo es infinito (0). Los consumidores de esta opción son sdmi: snoop, in.dhcpd, dhcpmgr y dhcpinfo.

Conversión de entradas de dhcptags en entradas de inittab

Si ha agregado anteriormente entradas en su archivo dhcptags, deberá agregar las entradas correspondientes en el nuevo archivo inittab si quiere continuar usando en su sitio las opciones agregadas. En el ejemplo siguiente se muestra cómo exoresar una entrada de ejemplo de dhcptags en el formato inittab.

Supongamos que se ha agregado la siguiente entrada de dhcptags para faxes conectados a la red:

128 FaxMchn - IP Fax_Machine

El código 128 significa que la opción debe estar en la categoría Site. El nombre de la opción es FaxMchn, y el tipo de datos es IP.

La entrada correspondiente de inittab podría ser:

FaxMchn SITE, 128, IP, 1, 1, sdmi

La granularidad de 1 y el máximo de 1 indican que en esta opción se espera una sola dirección IP.