現在位置: ホーム / みらくるブログ / GNS3で、仮想ネットワーク環境を構築しよう-11

GNS3で、仮想ネットワーク環境を構築しよう-11

今日は、いよいよ DHCP サーバから VLAN 毎に異なるネットワークのアドレスを配布できるようにしますよ。

お疲れさまです。ニックネーム たいちょう です。

前回は、とりあえずDHCPサーバから端末まで、ルータをとおしてアドレスが振られる所まで確認しました。

今日は、いよいよそれぞれの VLAN に所属している端末にアドレスを振っていきます。

やらなければいけないのは、ゲートウェイアドレスから VLANを判定して、DHCP pool からアドレスを振る、です。

VLAN10 には、192.168.110.0/24 を、VLAN20 には、192.168.111.0/24 を、VLAN30 には、192.168.112.0/24 を振ることができれば成功です。

考えているばかりでは進まないので、パケットを見ることにします。

Server1 のパケットをキャプチャするために、R5 fa0/0 と R2 fa0/1 間の接続線上をクリックして、「capture」をクリックします。
wireshak が立ち上がります。

同じく、

Server2 のパケットをキャプチャするために、R4 fa1/0 と R2 fa1/0 間の接続線上をクリックして、「capture」をクリックします。
wireshak が立ち上がります。

今の設定では、どの VLAN から DHCPREQUESTをかけても、shared-network としてくくったアドレスpoolの中からならどの pool からでもアドレスが振られてしまいます。

PC1 に設定されているIPを一度削除します。

PC1> clear ip

DHCPREQUEST をかけます。

PC1> dhcp
DDORA

アドレスが振られたようです。

まあ、ここまでは前回と同じですね。

wireshark を停止して、パケットを確認します。

Relay agent IP address というところに注目します。

どちらのパケットも、192.168.110.254 になっていました。
このアドレスは、サブインタフェースのアドレスになります。

ということは、PC2 からの DHCPREQUESTには、192.168.111.254 が、PC3 からの DHCPREQUEST には、192.168.112.254 が入っていると予想できます。

今回の目的である、VLAN 毎にネットワークを分ける、ということを実現するためには、この Relay agent IP address を見て、DHCP サーバの方でネットワークを振
り分けて行けばよさそうです。

今日のところは、ここまで降りて行くのではなくて、大きな塊の何番目から何番目のパケットが何だったらどう、という設定にしてみます。

ISC DHCP の設定には、class というのがあります。プログラムにおけるクラスではなくて、設定の塊のようなものです。
class には名前をつけることができます。このような名前をつけてみます。

class vlan10
class vlan20
class vlan30

クラスは、グローバル設定になります。一番上に書くと良いと思います。
class の記述のなかで、match if というステートメントが使えます。

ISC DHCP は、RFC にもとづいて作られています。
以下を斜め読みしておきます。
https://tools.ietf.org/html/rfc3046

ここで、パケットを読みます。

wireshark で先程取得したパケットを開いて、Bootp flags: 0x0000 (Unicast)
のところをクリックすると、該当個所が青く反転します。
Relay agent IP address: 192.168.110.254 (192.168.110.254) のところをクリックすると、該当箇所が白くなります。
c0 a8 6e fe これは、16進数ですので、10進数に直すと、 192 168 110 254 になりますよね。

ここで、この白いところが、青く反転したところの位置を把握します。
24番目のブロックから4バイト分になっています。

これを、ISC DHCP の文法に翻訳すると、packet(24,4) となります。

packet(24,4) のままで設定する場合は、binary の値と直接比較します。

match if (packet(24,4)) = c0:a8:6e:fe;

ただ、これだと人間には分かりにくい(頭の中で瞬時に変換できる人を除いて)ので、10進数に変換します。

match if (binary-to-ascii(10,8, ".", packet(24,4)) = "192.168.110.254");

これに基づいて、設定に入ります。

軽くデバッグしたいので、ログを表示させてみます。

log (info, "vlan10 matched!");

/etc/dhcp/dhcpd.conf (両方のサーバで設定します)

------------------------------------
...(snip)...
#### GLOBAL DECLARATION ####
class "vlan10" {
    match if (packet(24,4)) = c0:a8:6e:fe;
    match if (binary-to-ascii(10,8, ".", packet(24,4)) = "192.168.110.254");
    log (info, "vlan10 matched!");
};
class "vlan20" {
    match if (packet(24,4)) = c0:a8:6f:fe;
    match if (binary-to-ascii(10,8, ".", packet(24,4)) = "192.168.111.254");
    log (info, "vlan20 matched!");
};
class "vlan30" {
    match if (packet(24,4)) = c0:a8:70:fe;
    match if (binary-to-ascii(10,8, ".", packet(24,4)) = "192.168.112.254");
    log (info, "vlan30 matched!");
};
#### END GLOBAL DECLARATION ####
...(snip)...
subnet 192.168.0.0 netmask 255.255.0.0 {
    pool {
       failover peer "test";
       range 192.168.110.1 192.168.110.10;
        allow members of "vlan10";
    }
    pool {
       failover peer "test";
       range 192.168.111.1 192.168.111.10;
        allow members of "vlan20";
    }
    pool {
       failover peer "test";
       range 192.168.112.1 192.168.112.10;
        allow members of "vlan30";
    }
}
...(snip)...
----------------------------------

では、PC1-PC3 の現在設定しているIPアドレスをクリアして、DHCPREQUESTをかけてみます。
期待する結果としては、PC1には、192.168.110.1-10 、PC2には、192.168.111.1-10、PC3には、192.168.112.1-10 が振られれば成功です。

PC1> clear ip
PC1> dhcp
DDORA

どうやらアドレスが振られたみたいです。
サーバ Server1 のログを見てみます。
前の実験で PC1 に192.168.110.7が振られていたみたいで、それを除いたので、110だけ8 になりました。
兎も角、成功したので、ホッとしました。

dhcpd: vlan20 matched!
dhcpd: DHCPDISCOVER from 00:50:79:66:68:01 via 192.168.111.254
dhcpd: DHCPOFFER on 192.168.111.6 to 00:50:79:66:01 (PC21) via 192.168.111.254
dhcpd: vlan20 matched!
dhcpd: DHCPREQUEST for 192.168.111.6 to 00:50:79:66:68:01 (PC21) via 192.168.111.254
dhcpd: DHCPACK on 192.168.111.6 to 00:50:79:66:68:01 (PC21) via 192.168.111.254

dhcpd: vlan10 matched!
dhcpd: DHCPDISCOVER from 00:50:79:66:68:00 (PC11) via 192.168.110.254
dhcpd: DHCPOFFER on 192.168.110.8 to 00:50:79:66:00 (PC11) via 192.168.110.254
dhcpd: vlan10 matched!
dhcpd: DHCPREQUEST for 192.168.110.8 to 00:50:79:66:68:00 (PC11) via 192.168.110.254
dhcpd: DHCPACK on 192.168.110.8 to 00:50:79:66:68:00 (PC11) via 192.168.110.254

dhcpd: vlan30 matched!
dhcpd: DHCPDISCOVER from 00:50:79:66:68:02 (PC31) via 192.168.112.254
dhcpd: DHCPOFFER on 192.168.110.6 to 00:50:79:66:02 (PC31) via 192.168.112.254
dhcpd: vlan30 matched!
dhcpd: DHCPREQUEST for 192.168.110.6 to 00:50:79:66:68:02 (PC31) via 192.168.112.254
dhcpd: DHCPACK on 192.168.110.6 to 00:50:79:66:68:02 (PC31) via 192.168.112.254

今回、Server2 は、アドレスを振っていませんでした。
Server1 は、pool の後半 6-10 を受け持ったようです。

PC1-3 で、DORA という表示が出ますけど、頭文字を表していたようですね。
うまくいかないときは、DDDD となるので、わかりやすいです。

どうでしたか?

今日は、failover 機能はとくに活用しませんでしたけど、Server1 がダウンすると、どうなるのでしょうかね。
次回にでもやりますか。

ISC DHCP は、もっともっと色々な設定が出来ますよ。

Asianux Server 7 == MIRACLE LINUX V7 には、ISC DHCP パッケージが入っていますし、サポートもありますので、検討してみてくださいね。

評価版ダウンロードはこちらです。

では、今回はこの辺で。次回もおたのしみに。

ニックネーム たいちょう でした。

タグ: