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:
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
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.
#! /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." |
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. | |
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. | |
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. | |
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. | |
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. | |
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). | |
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. |
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.
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:
Tiene previsto actualizarse desde una versión de Oracle Solaris más antigua que Solaris 8.
Ha creado anteriormente nuevas opciones de DHCP.
Ha modificado el archivo /etc/dhcp/dhcptags y desea conservar los cambios.
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.
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 .
Descripció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.
Identifica el espacio de nombres al que pertenece la opción. Debe ser uno de los siguientes: Standard, Site, Vendor, Field o Internal.
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.
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.
Describe cuántas unidades de datos componen un valor completo para esta opción.
Describe cuántos valores completos se permiten para esta opción. 0 indica un número infinito.
Describe qué programas pueden utilizar esta información. Consumidores debe establecerse en sdmi, donde:
snoop
in.dhcpd
dhcpmgr
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.
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.