CentOS6.3を用いてDHCPサーバを設定します。ソフトウェアはISC-DHCPになります。これはyumからインストール可能です。
# yum install dhcp # rpm -qa | grep dhcp dhcp-common-4.1.1-31.0.1.P1.el6.centos.1.i686 dhcp-4.1.1-31.0.1.P1.el6.centos.1.i686 |
■DHCPのフロー
DHCPの設定をはじめる前にDHCPパケットがどういったやりとりをするのかメモ書きに残しておきます。DHCPメッセージには以下の種類があります。
メッセージ名
|
意味
|
DHCPDISCOVER | クライアントがサーバを「発見」するためのメッセージ |
DHCPOFFER | サーバからクライアントへの設定値「候補」を通知するメッセージ |
DHCPREQUEST | クライアントが決定したサーバへの取得依頼メッセージ |
DHCPDECLINE | クライアントからサーバへの拒否(エラー)メッセージ |
DHCPACK | サーバからクライアントへの取得正常終了メッセージ |
DHCPNAK | サーバからクライアントへの取得拒否(エラー)メッセージ |
DHCPRELEASE | クライアントからサーバへのリリース要求メッセージ |
DHCPINFORM | IPアドレス取得は行わずオプション取得のみ行う場合にクライアントから送られるメッセージ |
DHCPFORCERENEW | サーバからクライアントへの再構成要求。サーバから能動的に再設定を指示できる。 |
DHCPの新規IPアドレス取得のフローは下記のようになります。
以下はリース延長時のフローです。IPアドレスが新規に割り当てられリース期間を過ぎるとクライアントは延長要求をDHCPサーバに出します。
以下はリりース時のフローです。要は割り当てられたIPをサーバに返却するフローです。リリースされたIPはサーバに再びプールされ再利用されます。
■複数セグメントのDHCPサーバを1台で
DHCP経由でIPアドレスを取得する際のDHCP Discoverについてですが、これはブロードキャストです。従いましてセグメントを越えることはできません。ということはセグメントごとにDHCPサーバが必要ということになります。
実際の運用を考えるとこれは非現実的であり、DHCPで管理したいセグメントをまとめて1台で運用したいものです。そこでセグメントの境目になっているルータもしくはL3SWにてhelperアドレスを設定するのが一般的です。
接続イメージは以下のようになります。
L3 SwitchはDHCP Client1と2からくるDHCP Discoverを10.0.0.1にユニキャスト変換して転送することが可能です。
DHCPサーバではどちらのセグメントからきたDiscoverなのか判断する必要があるのですがそれの判断に使われるのがDHCP Requestメッセージのgiaddrです。
上の図でいうとClient1からDHCP Requestであれば192.168.0.254をgiaddrにセットしClient2からは192.168.1.254をgiaddrにセットして転送します。こうすることでDHCP Serverはどのセグメントなのかを判断することができます。但し、同一セグメントからのDHCP Requestであればgiaddrには何もセットされません。
■実際の設定
実際のdhcpの設定は/etc/dhcp/dhcpd.confに記載します。以下、設定のサンプルです。注意点としてDHCPサーバ自身のeth0などに割り当てているサブネットに関しては必ず定義しておかないと起動時にエラーとなり起動できません。
# vi /etc/dhcp/dhcpd.conf # # DHCP Server Configuration file. # see /usr/share/doc/dhcp*/dhcpd.conf.sample # see 'man 5 dhcpd.conf' # ddns-update-style none; ignore client-updates; not authoritative; subnet 192.168.12.0 netmask 255.255.255.0 { # ルータのアドレスの設定 option routers 192.168.12.1; # ネットマスクを設定 option subnet-mask 255.255.255.0; # ドメイン名を設定 option domain-name "unix-power.net"; # ネームサーバのIPアドレスを設定 option domain-name-servers 192.168.12.1, 192.168.12.100; # クライアントに割り当てるIPアドレスの範囲を指定 range 192.168.12.20 192.168.12.30; # デフォルトリース時間(秒) default-lease-time 3600; # 最大リース時間(秒) max-lease-time 3600; } # クライアントをMacアドレスで定義し、払い出すIPを決め打ちする host client1{ hardware ethernet 00:22:19:ED:26:9C; fixed-address 192.168.12.50; } |
DHCPのオプションでインターフェイスを指定しておきます。
# vi /etc/sysconfig/dhcpd # Command line options here DHCPDARGS=eth0 |
DHCPを起動します。
# /etc/rc.d/init.d/dhcpd start |
これで端末を新たにネットワークに接続した場合、IPが払い出されます。上の設定で登録しているMACアドレスの端末を接続した際のDHCPのログには以下のように記録されます。
dhcpd: DHCPDISCOVER from 00:22:19:ed:26:9c via eth0 dhcpd: DHCPOFFER on 192.168.12.50 to 00:22:19:ed:26:9c via eth0 dhcpd: DHCPREQUEST for 192.168.12.50 (192.168.12.20) from 00:22:19:ed:26:9c via eth0 dhcpd: DHCPACK on 192.168.12.50 to 00:22:19:ed:26:9c via eth0 |
また登録していない端末をつなげた場合は192.168.12.20~30の範囲で払いだされます。設定ファイル上に記載したクライアントのみ接続したいといった場合は以下のオプションを追記することで可能となります。
# vi /etc/dhcp/dhcpd.conf # # DHCP Server Configuration file. # see /usr/share/doc/dhcp*/dhcpd.conf.sample # see 'man 5 dhcpd.conf' # ddns-update-style none; ignore client-updates; not authoritative; subnet 192.168.12.0 netmask 255.255.255.0 { # ルータのアドレスの設定 option routers 192.168.12.1; # ネットマスクを設定 option subnet-mask 255.255.255.0; # ドメイン名を設定 option domain-name "unix-power.net"; # ネームサーバのIPアドレスを設定 option domain-name-servers 192.168.12.1, 192.168.12.100; # クライアントに割り当てるIPアドレスの範囲を指定 range 192.168.12.20 192.168.12.30; # デフォルトリース時間(秒) default-lease-time 3600; # 最大リース時間(秒) max-lease-time 3600; # 登録したMACのみ払い出す deny unknown-clients; } # クライアントをMacアドレスで定義し、払い出すIPを決め打ちする host client1{ hardware ethernet 00:22:19:ED:26:9C; fixed-address 192.168.12.50; } |
■DHCP認証
ネットワーク接続認証の1つの手段としてDHCP認証システムがあります。フリーソフトのISC-DHCPをカスタマイズした製品なんかも世の中には売られておりそれとニアな仕組みを構築してみます。
ISC-DHCPに登録していないMACアドレスはプライベートIP ( 10.0.0.0/24 )を払い出し、登録済みのものについてはグローバルIP (192.168.0.0/24(仮) )を払い出すという仕組みです。まずネットワーク側でL3インターフェイスに認証前と認証後のIPを1つの物理インターフェイスに設定することになります。Catalystの設定例は以下のようになります。
(config)# interface Vlan10 (config-if)# ip address 10.0.0.1 255.255.255.0 # 認証前VLAN (config-if)# ip address 192.168.0.1 255.255.255.0 secondary # 認証後VLAN (config-if)# ip helper-address 10.0.0.10 # 同一DHCPサーバにリレー |
認証後のVLANをセカンダリアドレスとして設定します。こうすることで単一VLAN配下に複数サブネットが稼動 します。ISC-DHCP側の設定で1つの物理インターフェイス上で複数サブネットを定義する場合、shared-networkを用います。
# vi /etc/dhcp/dhcpd.conf # DHCP Server Configuration file. # see /usr/share/doc/dhcp*/dhcpd.conf.sample # see 'man 5 dhcpd.conf' # ddns-update-style none; ignore client-updates; not authoritative; # Macアドレスのリストを読み込む include "/etc/dhcp/mac_list.txt" ; shared-network NETWORK { subnet 10.0.0.0 netmask 255.255.255.0 { # ルータのアドレスの設定 option routers 10.0.0.1; # ネットマスクを設定 option subnet-mask 255.255.255.0; # ドメイン名を設定 option domain-name "unix-power.net"; # ネームサーバのIPアドレスを設定 option domain-name-servers 10.0.0.1, 10.0.0.2; # クライアントに割り当てるIPアドレスの範囲を指定 range 10.0.0.20 10.0.0.100; # デフォルトリース時間(秒) default-lease-time 3600; # 最大リース時間(秒) max-lease-time 3600; # クライアントを制限しない allow unknown-clients; } subnet 192.168.0.0 netmask 255.255.255.0 { # ルータのアドレスの設定 option routers 192.168.0.1; # ネットマスクを設定 option subnet-mask 255.255.255.0; # ドメイン名を設定 option domain-name "unix-power.net"; # ネームサーバのIPアドレスを設定 option domain-name-servers 192.168.0.1, 192.168.0.2; # クライアントに割り当てるIPアドレスの範囲を指定 range 192.168.0.20 192.168.0.100; # デフォルトリース時間(秒) default-lease-time 3600; # 最大リース時間(秒) max-lease-time 3600; # クライアントを制限する deny unknown-clients; } } |
あとは/etc/dhcp/mac_list.txtにグローバルIPを払い出すMacアドレスのリストを以下のように作成します。
# vi /etc/dhcp/mac_list.txt host client1 { hardware ethernet 11:11:11:11:11:11; fixed-address 192.168.0.50; } host client2 { hardware ethernet 22:22:22:22:22:22; fixed-address 192.168.0.51; } host client3 { hardware ethernet 33:33:33:33:33:33; fixed-address 192.168.0.52; } |
このファイルに管理者の方が予め許可するMACアドレスを手動登録しておけばグローバルIPは手動登録したものにしか払い出されないということになります。IPアドレスまで決めうちしなくてよい場合はfixed-addressの項目を削除すればよいです。
これでMacアドレスが登録されていない状態であってもとりあえず組織内であれば接続することができますがグローバルなインターネットへの通信は不可という動作状況になり、それなりのDHCP認証システムになるのではと思います。
ただし、DHCPサーバ側でいくらこういった処理をかけても固定IPを打ってしまえばそれはそれで接続できてしまいます。そういった場合はネットワーク側でも対策が必要になりますが、それに役立つのがDHCP Snoopingです。
DHCP認証はサーバ側とネットワーク側の両側面での対策が必要となります。