ISC DHCP

ISC DHCP Server
フリーのDHCPサーバとして利用される事もあるソフトウェア。
DNSサーバのBINDで有名なISCが開発を行っている。

近年、後継のKEA DHCPに取って代わるとアナウンスされているが、
failoverなどの未実装機能が多い為、安定するまではISC DHCPの方が良いと思われる。

インストール

1. ビルド・インストール
事前にソースコードをダウンロードしておく。
必要に応じてビルドオプションを付与させる必要があるが、
今回は稼働テストなので出来る限り多くのオプションを付与しておく。

$ tar zxvf dhcp-4.3.4.tar.gz
$ cd dhcp-4.3.4
$ ./configure --prefix=/usr/local/dhcp-4.3.4 \
              --enable-dependency-tracking   \
              --enable-maintainer-mode       \
              --enable-early-chroot          \
              --enable-failover              \
              --enable-execute               \
              --enable-tracing               \
              --enable-ipv4-pktinfo          \
              --enable-dhcpv4o6              \
              --enable-dhcpv6
$ make
$ make install
$ cd /usr/local
$ ln -s /usr/local/dhcp-4.3.4 dhcp



2. 起動オプションの設定
DHCPサーバを実行するユーザ・グループの設定や、
DHCP DISCOVERを待ち受けるインターフェースを指定する。

$ vi /etc/sysconfig/dhcpd
--------------------------------------------------
PROG="dhcpd"
USER="dhcpd"
GROUP="dhcpd"
INTERFACE="eth0"
CONFIG="/usr/local/dhcp/etc/dhcpd.conf"
OPTION=""
==================================================
PROG      = バイナリ名
USER      = 実行ユーザ
GROUP     = 実行グループ
INTERFACE = パケット待ち受けインターフェース
CONFIG    = 設定ファイルPATH
OPTION    = DHCPサーバの追加起動オプション



3. 起動スクリプトの作成
ソースコードには起動スクリプトが同梱されていないので自作する必要がある。
今回は従来通りのinitスクリプトで起動を行う。
サービスの実行ユーザ設定などは、上記のsysconfigファイルで行い、
initスクリプトはプロセスの起動・停止に特化したスクリプトとする。

$ vi /etc/init.d/dhcpd
--------------------------------------------------
#!/bin/sh
#
# dhcpd           This shell script takes care of starting and stopping
#                 dhcpd (DHCP server).
#
# chkconfig: 345 55 45
# description: dhcpd is a Dynamic Host Configuration Protocol Server
# probe: true

# Program configuration
. /etc/sysconfig/dhcpd

RUNDIR="/var/run/${PROG}"
PIDFILE="${RUNDIR}/${PROG}.pid"
LEASEFILE="${RUNDIR}/${PROG}.lease"
LOCKFILE="/var/lock/subsys/${PROG}"

EXEC="/usr/local/dhcp/sbin/${PROG}"
ARGS="-user ${USER} -group ${GROUP} -cf ${CONFIG} -pf ${PIDFILE} -lf ${LEASEFILE}"

# Make running directory
if [ ! -e ${RUNDIR} ] ;then
    mkdir ${RUNDIR}
    chown ${USER}.${GROUP} ${RUNDIR}
    chmod 750 ${RUNDIR}
    touch ${LEASEFILE}
    chown ${USER}.${GROUP} ${LEASEFILE}
fi

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f ${EXEC} ]           || exit 0
[ -f ${CONFIG} ]         || exit 0

# See how we were called.
case "$1" in
    start)
        # Start daemon.
        echo -n "Starting ${PROG}: "
        if [ -e ${LOCKFILE} ] ;then
            echo "${PROG} running"
            exit 0
        else
            daemon ${EXEC} ${ARGS} ${OPTION} ${INTERFACE}
            echo
            touch ${LOCKFILE}
        fi
        ;;
    stop)
        # Stop daemon.
        echo -n "Shutting down ${PROG}: "
        killproc -p ${PIDFILE}
        rm -f ${LOCKFILE}
        echo
        ;;
    restart)
        $0 stop
        $0 start
        exit $?
        ;;
    *)
        echo "Usage: ${PROG} {start|stop|restart}"
        exit 1
esac

exit 0