#author("2016-05-28T02:12:35+09:00","default:nowsky","nowsky")
#author("2016-05-28T11:38:42+09:00","default:nowsky","nowsky")
*ISC DHCP [#k05403b6]
[[ISC DHCP Server:+https://www.isc.org/downloads/dhcp/]]
フリーのDHCPサーバとして利用される事もあるソフトウェア。
DNSサーバのBINDで有名なISCが開発を行っている。

近年、後継のKEA DHCPに取って代わるとアナウンスされているが、
failoverなどの未実装機能が多い為、安定するまではISC DHCPの方が良いと思われる。
~
*インストール [#k1fee22c]
&size(16){&font(b){0. 事前準備};};
ISC DHCPをビルドするには、autoconf 2.65以上が必要になる。
CentOS6でautoconfをデフォルトのまま使っていた場合、この条件を満たせないので、
事前に最新版のautoconfを導入しておく。
 
この時、インストール先ディレクトリによってはPATH優先度の関係で、
既存のautoconfのPATH(/usr/bin)が優先されてしまい、
追加インストールしたautoconfを参照していない状態になるので注意する
 $ tar zxvf autoconf-2.69.tar.gz
 $ cd autoconf-2.69
 $ ./configure
 $ make && make install
 $ cd /usr/bin
 $ mv autoconf   autoconf.yum-org
 $ mv autoheader autoheader.yum-org
 $ mv autom4te   autom4te.yum-org
 $ mv autoreconf autoreconf.yum-org
 $ mv autoscan   autoscan.yum-org
 $ mv autoupdate autoupdate.yum-org
 $ mv ifnames    ifnames.yum-org
 $ ln -s /usr/local/bin/autoconf
 $ ln -s /usr/local/bin/autoheader
 $ ln -s /usr/local/bin/autom4te
 $ ln -s /usr/local/bin/autoreconf
 $ ln -s /usr/local/bin/autoscan
 $ ln -s /usr/local/bin/autoupdate
 $ ln -s /usr/local/bin/ifnames
~
&size(16){&font(b){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
~
&size(16){&font(b){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サーバの追加起動オプション
~
&size(16){&font(b){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
~
&size(16){&font(b){4. 起動準備};};
実行ユーザの準備やiptablesのポート開放を設定する。
DHCPサーバ宛はUDP:67、DHCPクライアント宛はUDP:68を使う点に注意。
下記の内容は例なので、自環境に合わせてチューニングした上で設定を行う。
 ・実行ユーザ、グループ作成
 ==================================================
 $ groupadd dhcpd
 $ useradd -g dhcpd -d /var/run/dhcpd -s /sbin/nologin dhcpd

 ・起動スクリプト登録
 ==================================================
 $ chmod 755 /etc/init.d/dhcpd
 $ chkconfig --add  dhcpd
 $ chkconfig --list dhcpd
 --------------------------------------------------
 dhcpd    0:off  1:off  2:off  3:on  4:on  5:on  6:off

 ・iptables開放
 ==================================================
 $ iptables -A INPUT -p udp --dport 67 -j ACCEPT
~
&size(16){&font(b){5-1. コンフィグ作成 (シングル構成、別セグメント待受)};};
-[[Man page of dhcpd.conf:+https://linuxjm.osdn.jp/html/dhcp2/man5/dhcpd.conf.5.html]]
-[[dhcpd.conf 覚書:+http://qiita.com/JhonnyBravo/items/e5324715efa9a9264c9d]]
-[[UNIXサーバメモメモ - ISC DHCP設定ファイル:+http://unixservermemo.web.fc2.com/sv/dhcp-conf.htm]]

クライアントセグメントの外にDHCPサーバを設置し、複数セグメントのDHCPサーバを集約管理する時の設定。
DHCPサーバ設置セグメントにDHCPでIPアドレスを払い出さない場合でも、
サーバ自体が所属するサブネットについて設定を入れないと、プログラムが起動しなくなる点に注意する。
 
下記の設定内容では、サーバセグメントにはDHCPで払い出しを行わないが、
サーバを起動させる為に、&font(b){何も払い出さない設定};を追加してある。
 
・DHCPサーバ 構成情報
|ネットワーク    |10.0.0.0/24    |
|インターフェース|eth0 (1NIC構成)|
 
・DHCPクライアント IP払出し情報
|ネットワーク    |10.10.0.0/24            |
|デフォルトルート|10.10.0.254             |
|IP払い出し範囲  |10.10.0.100~10.10.0.200|
|プライマリDNS   |10.0.0.10               |
|セカンダリDNS   |10.0.0.20               |
 
・補足
DHCPクライアントとDHCPサーバが別セグメントになり、DHCP DISCOVERがDHCPサーバまで届かなくなるので、
クライアントのデフォルトルートとなるルータに、[[DHCPリレー設定:+http://www.cisco.com/cisco/web/support/JP/docs/CIAN/IOS/IOSSWRels15_1/CG/001/iad_dhcp_rly_agt.html?bid=0900e4b1825ae5ce#44008]]を入れておく。
 
・設定内容
 $ vi /usr/local/dhcp/etc/dhcpd.conf
 --------------------------------------------------
 ddns-update-style  interim;         #DHCPリース要求時の開放動作設定
 ignore             client-updates;  #DNSサーバエントリ自動更新時のドメイン制御指定
 not                authoritative;   #セグメント設定情報の信頼度
 log-facility       local1;          #ログ出力先
 
 shared-network DHCP {
     subnet 10.0.0.0  netmask 255.255.255.0 {
     }
 
     subnet 10.10.0.0 netmask 255.255.255.0 {
         option routers              10.10.0.254;
         option subnet-mask          255.255.255.0;
         option broadcast-address    10.10.0.255;
         option domain-name-servers  10.0.0.10,10.0.0.20;      #プライマリとセカンダリの間に、カンマを入れる
         range                       10.10.0.100 10.10.0.200;  #始点と終端の間に、スペースを入れる
         default-lease-time          3600;
         max-lease-time              86400;
     }
 }