Guide d'administration système : services IP

Chapitre 18 Commandes et fichiers DHCP (référence)

Ce chapitre décrit les relations entre les commandes DHCP et les fichiers DHCP. Il n'explique pas, cependant, comment utiliser les commandes.

Ce chapitre contient les informations suivantes :

Commandes DHCP

Le tableau suivant présente les commandes prévues pour gérer le protocole DHCP sur votre réseau.

Tableau 18–1 Commandes utilisées dans DHCP

Commande 

Description 

Page de manuel 

dhtadm

Permet d'apporter des modifications aux options et macros dans le fichier dhcptab. Cette commande est particulièrement utile dans les scripts que vous créez pour automatiser les changements de vos informations DHCP. Associez la commande dhtadm à l'option -P et traitez la sortie avec la commande grep de manière à rechercher des valeurs d'option particulières dans la table dhcptab.

dhtadm(1M)

pntadm

Permet d'apporter des modifications aux tables de réseau DHCP établissant la correspondance entre ID de client et adresses IP et éventuellement d'associer les données de configuration aux adresses IP.

pntadm(1M)

dhcpconfig

Permet de configurer des serveurs DHCP et les agents de relais BOOTP et d'annuler la configuration lorsque cela est nécessaire. Cette commande sert également à effectuer une conversion vers un autre format de magasin de données et à importer/exporter les données de configuration DHCP.

dhcpconfig(1M)

in.dhcpd

Correspond au démon du serveur DHCP exécuté au démarrage du système. Il est déconseillé de lancer directement le démon du serveur. Pour démarrer ou arrêter le démon, vous pouvez au choix utiliser le gestionnaire DHCP, la commande svcadm ou la commande dhcpconfig. Faites appel directement au démon uniquement lorsque vous souhaitez exécuter le serveur en mode de débogage en vue de résoudre des problèmes.

in.dhcpd(1M)

dhcpmgr

Correspond au gestionnaire DHCP, interface graphique (IG) utilisée spécialement pour configurer et gérer le service DHCP. Nous vous recommandons d'utiliser le gestionnaire DHCP en tant qu'outil d'administration du service DHCP Oracle Solaris.

dhcpmgr(1M)

ifconfig

Permet d'attribuer des adresses IP aux interfaces réseau et/ou de configurer les paramètres d'interface réseau au démarrage du système. Sur un client DHCP Oracle Solaris, la commande ifconfig permet de démarrer le service DHCP pour obtenir les paramètres nécessaires (y compris l'adresse IP) à la configuration d'une interface réseau.

ifconfig(1M)

dhcpinfo

Permet aux scripts de démarrage système des systèmes clients Oracle Solaris d'obtenir un certain nombre d'informations (comme le nom de l'hôte) à partir du démon du client DHCP dhcpagent. Vous pouvez également utiliser la commande dhcpinfo dans des scripts ou depuis la ligne de commande afin d'obtenir les valeurs des paramètres qui vous intéressent.

dhcpinfo(1)

snoop

Permet de capturer et d'afficher le contenu des paquets transmis sur le réseau. snoop est très pratique pour résoudre les problèmes liés au service DHCP.

snoop(1M)

dhcpagent

Correspond au démon client DHCP prévu pour implémenter le côté client du protocole DHCP. 

dhcpagent(1M)

Exécution des commandes DHCP au sein de scripts

Les commandes dhcpconfig, dhtadm et pntadm sont optimisées pour les scripts. La commande pntadm est notamment utile pour créer un grand nombre d'entrées d'adresses IP dans une table de réseau DHCP. L'exemple de script suivant utilise la commande pntadm en mode de traitement par lots pour générer des adresses IP.


Exemple 18–1 Script addclient.ksh avec la commande 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."

Fichiers utilisés par le service DHCP

Le tableau suivant présente les différents fichiers associés au service DHCP Oracle Solaris.

Tableau 18–2 Fichiers et tables utilisés par les démons et les commandes DHCP

Nom du fichier ou de la table 

Description 

Page de manuel 

dhcptab

Terme générique désignant la table des données de configuration DHCP stockées sous forme d'options avec des valeurs attribuées, lesquelles sont ensuite regroupées dans des macros. Le nom de la table dhcptab et son emplacement sont déterminés par le magasin de données réservé aux informations DHCP.

dhcptab(4)

Table de réseau DHCP 

Établit la correspondance entre les adresses IP et les ID de client et les options de configuration. Les tables de réseau DHCP sont nommées d'après l'adresse IP du réseau (10.21.32.0, par exemple). Il n'existe aucun fichier appelé dhcp_network. Le nom et l'emplacement des tables de réseau DHCP sont fonction du magasin de données utilisé pour les informations DHCP.

dhcp_network(4)

dhcpsvc.conf

Stocke les options de démarrage du démon DHCP et les informations du magasin de données. Il est interdit d'éditer ce fichier de façon manuelle. Servez-vous de la commande dhcpconfig pour changer les options de démarrage.

dhcpsvc.conf(4)

nsswitch.conf

Indique l'emplacement des bases de données de services de noms et l'ordre de recherche des services de noms pour différents types d'information. Le fichier nsswitch.conf est consulté lors de la configuration d'un serveur DHCP dans le but d'obtenir des informations de configuration précises. Il figure dans le répertoire /etc.

nsswitch.conf(4)

resolv.conf

Contient les informations permettant la résolution des requêtes DNS. Ce fichier est consulté lors de la configuration du serveur DHCP pour vérifier le domaine DNS et le serveur DNS. Il figure dans le répertoire /etc.

resolv.conf(4)

dhcp.interface

Implique l'utilisation du service DHCP sur l'interface réseau du client spécifiée dans le nom du fichier dhcp.interface. La présence d'un fichier appelé dhcp.qe0 indique, par exemple, que le service DHCP doit être utilisé sur l'interface qe0. Le fichier dhcp.interface peut éventuellement contenir des commandes transmises en tant qu'options à la commande ifconfig, laquelle permet de démarrer DHCP sur le client. Le fichier se trouve sous le répertoire /etc sur les systèmes clients DHCP Oracle Solaris.

Aucune page de manuel spécifique, voir dhcp(5)

interface.dhc

Contient les paramètres de configuration obtenus à partir de DHCP pour l'interface réseau indiquée. Le client met en mémoire cache les données de configuration actuelles dans le fichier /etc/dhcp/interface.dhc dès que cesse le bail de l'adresse IP de l'interface. En cas d'utilisation du service DHCP sur l'interface qe0, par exemple, dhcpagent met en mémoire cache les données de configuration dans /etc/dhcp/qe0.dhc. Lors du prochain démarrage du service DHCP sur l'interface, le client adresse une requête au serveur DHCP afin d'exploiter la configuration mise en mémoire cache (à condition que le bail n'ait pas expiré). Si le serveur DHCP rejette la requête, le client lance le processus standard de négociation du bail DHCP.

Aucune page de manuel spécifique, voir dhcpagent(1M)

dhcpagent

Définit les valeurs des paramètres pour le démon client dhcpagent. Le chemin d'accès au fichier est /etc/default/dhcpagent. Pour plus d'informations sur les paramètres, reportez-vous au fichier /etc/default/dhcpagent ou à la page de manuel dhcpagent(1M).

dhcpagent(1M)

DHCP inittab

Définit des aspects des codes d'options DHCP, tels que le type de données, et assigne des étiquettes comme mnémoniques. Pour plus d'informations sur la syntaxe du fichier, voir la page de manuel dhcp_inittab(4).

Au niveau du client, les informations provenant du fichier /etc/dhcp/inittab sont utilisées par dhcpinfo pour aider les utilisateurs à mieux comprendre la signification des informations. Au niveau du système du serveur DHCP, c'est le démon DHCP et les outils de gestion qui utilisent ce fichier pour obtenir des informations relatives aux options DHCP.

Le fichier /etc/dhcp/inittab remplace le fichier /etc/dhcp/dhcptags utilisé dans les versions précédentes. Pour en savoir plus à ce sujet, reportez-vous à la section Informations relatives aux options DHCP.

dhcp_inittab(4)

Informations relatives aux options DHCP

Auparavant, les informations ayant trait aux options DHCP étaient stockées à différents endroits, y compris la table dhcptab du serveur, le fichier dhcptags des clients et les tables internes de divers programmes. À partir de la version Solaris 8, ces informations sont systématiquement consolidées dans le fichier /etc/dhcp/inittab. Pour plus d'informations sur ce fichier, reportez-vous à la page de manuel dhcp_inittab(4).

Le client DHCP Oracle Solaris utilise le fichier DHCP inittab pour remplacer le fichier dhcptags. Il se sert de ce fichier pour obtenir des informations sur les codes d'options reçus dans un paquet DHCP. Les programmes in.dhcpd, snoop et dhcpmgr sur le serveur DHCP utilisent également le fichier inittab.

Vérification de l'impact éventuel du commutateur sur votre site

La plupart des sites utilisant le service DHCP Oracle Solaris ne sont pas concernés par le basculement vers le fichier /etc/dhcp/inittab. Votre site est concerné si vous remplissez toutes les conditions suivantes :

Lors de la mise à niveau, le journal de mise à niveau vous signale que le fichier dhcptags avait subi des modifications et que vous devez, par conséquent, apporter des changements au fichier DHCP inittab.

Différences entre les fichiers dhcptags et inittab

Le fichier inittab contient plus d'informations que le fichier dhcptags. Le fichier inittab utilise également une syntaxe différente.

Voici à quoi ressemble une entrée dans le fichier dhcptags :

33 StaticRt - IPList Static_Routes

33 est le code numérique transmis dans le paquet DHCP. StaticRt est le nom de l'option. IPList indique que le type de données pour StaticRt doit correspondre à une liste d'adresses IP. Static_Routes représente la version descriptive du nom.

Le fichier inittab se compose d'enregistrements d'une seule ligne décrivant chaque option. Le format est similaire à celui prévu pour définir les symboles dans dhcptab. Le tableau suivant décrit la syntaxe du fichier inittab .

Option

Description

nom-option

Nom de l'option. Le nom de l'option doit être unique dans sa catégorie et ne doit pas entrer en conflit avec les autres noms d'option dans les catégories Standard, Site et Fournisseur. Vous ne pouvez pas, par exemple, définir deux options Site ayant le même nom. Il n'est pas non plus permis de créer une option Site avec un nom identique à celui d'une option Standard.

catégorie

Identifie l'espace de noms auquel l'option appartient. Il existe cinq possibilités : Standard, Site, Vendor (Fournisseur), Field (Champ) ou Internal (Interne).

code

Identifie l'option lors de sa transmission sur le réseau. Dans la plupart des cas, le code identifie sans ambiguïté l'option, au sein d'une même catégorie. Cependant, dans le cas des catégories internes telles que Champ ou Interne, il peut avoir une autre signification. Le code ne doit pas nécessairement être unique au sens général du terme. Il lui suffit de remplir les conditions suivantes : être unique au sein de la catégorie de l'option et ne pas être en conflit avec les codes des catégories Standard et Site.

type

Décrit les données associées à cette option. Les types autorisés sont : IP, ASCII, Octet, Boolean, Unumber8, Unumber16, Unumber32, Unumber64, Snumber8, Snumber16, Snumber32 et Snumber64. Dans le cas de nombres, l'initiale U ou S indique respectivement qu'il s'agit d'un nombre non signé ou signé. Les chiffres de fin indiquent le nombre de bits de codage du nombre. Unumber8 signale, par exemple, un nombre non signé à 8 bits. Le type ne respecte pas la casse.

granularité

Décrit le nombre d'unités de données nécessaires pour représenter une valeur entière pour cette option.

maximum

Décrit le nombre de valeurs entières autorisées pour cette option. 0 indique un nombre infini.

consommateurs

Décrit les programmes susceptibles d'exploiter ces informations. Vous êtes tenu de configurer les consommateurs au format sdmi, où :

s

snoop

d

in.dhcpd

m

dhcpmgr

i

dhcpinfo

Voici à quoi ressemble une entrée inittab :

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

Cette entrée décrit une option appelée StaticRt. L'option se trouve dans la catégorie Standard et son code est 33. Les données attendues correspondent à un nombre potentiellement infini de paires d'adresses IP car le type est IP, la granularité est 2 et le nombre maximum est infini (0). Les consommateurs de cette option sont sdmi : snoop, in.dhcpd, dhcpmgr et dhcpinfo.

Conversion d'entrées dhcptags au format inittab

Si vous aviez ajouté précédemment des entrées à votre fichier dhcptags, vous devez insérer les entrées correspondantes dans le nouveau fichier inittab pour continuer à utiliser les options ajoutées à votre site. L'exemple suivant montre la façon dont une entrée dhcptags peut être exprimée au format inittab .

Supposons que vous ayez ajouté l'entrée dhcptags suivante pour des télécopieurs reliés au réseau :

128 FaxMchn - IP Fax_Machine

Le code 128 signifie que l'option doit appartenir à la catégorie Site. Le nom de l'option est FaxMchn et le type de données est IP.

L'entrée inittab correspondante pourrait ressembler à la suivante :

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

La granularité (1) et le maximum (1) indiquent qu'une adresse IP est attendue pour cette option.