🎨

NW図 as Code(8) nwdiagで自宅LANを管理

2022/06/17に公開

はじめに

皆さん、自宅にIPアドレスを持つ機器って何台持っていますか?
それ管理していますか?

セグメントの数もそんなにないでしょうし、正直ExcelとかCSVで管理するだけでもいいような気もしますが、出来心でnwdiagで自宅LANを可視化してみました。

自宅ネットワーク図

一部型番を省略したり台数を減らしたりしていますが、こんな感じになりました。

コード

カスタマイズしてご自分の家庭のNW図を描いてみたい方はこちら

@startuml
!include <office/Devices/cell_phone_iphone_stand_alone>
!include <office/Servers/file_server>
!include <office/Devices/ip_gateway>
!include <office/Devices/modem>
!include <office/Servers/server_generic>
!include <office/Servers/virtual_server>
!include <office/Devices/device_laptop>
!include <office/Concepts/globe_internet>
!include <office/Devices/nic>
<style>
nwdiagDiagram {
  network {
    BackGroundColor #ffffff
    LineColor black
    FontSize 12
  }
  server {
    BackGroundColor #ffffff
    LineColor black
    LineThickness 1.0
    FontSize 12
  }
  arrow {
    FontColor red
    FontStyle bold
    LineColor black
    FontSize 15
  }
  group {
    BackGroundColor #f8c6bd
    LineColor black
    LineThickness 2.0
    FontSize 12
  }
}
</style>
nwdiag {
    internet [ description = "<$globe_internet>\nInternet", shape = label];
    internet -- broadband_router;
    broadband_router [ address = "(Global IP)" ];
    network lan0{
        address = "192.168.0.0/24";
        broadband_router [description = "<$ip_gateway>\nBroadband Router\nAterm", address = ".1"];
        cisco [description = "<$ip_gateway>\ncisco router", address = ".254"];
    }
    network GigaSwitch{
        address = "192.168.1.0/24";
        cisco [address = ".1"];
        wifi_ap [description = "<$modem>\nWifi AP", address = ".210"];

        desktop_winPC [ description = "<$server_generic>\nWinPC", address = ".139(DHCP)"];
        nas [ description = "<$file_server>\nQNAP", address = ".21"];
        esxi [ description = "<$server_generic>\nesxi01"];
    }
   network wifi{
        address = "192.168.1.0/24";
        wifi_ap [address = "(AP mode)"];
        macbook [description = "<$device_laptop>\nMacBook", address = ".130(DHCP)"];
        echoshow [description = "EchoShow", address = ".235(DHCP)"];
        googlehome [description = "GoogleHome", address = ".129(DHCP)"];
        firetv [description = "FireTV", address = ".131(DHCP)"];
        iphone [description = "<$cell_phone_iphone_stand_alone>\niPhone", address = ".248(DHCP)"];
    }

    network Management_Network{
        address = "192.168.1.0/24";
        esxi;
        centos01  [ description = "<$virtual_server>\ncentos01", address = ".253(DHCP)"];
        ubuntu01 [ description = "<$virtual_server>\nubuntu01", address = ".254(DHCP)"];
        ubuntu02 [ description = "<$virtual_server>\nubuntu02", address = ".251(DHCP)"];
        vmkernel [description = "<$nic>\nvmkernel", address = ".31"];
    }
    group {
        description = "esxi01"
        centos01;
        ubuntu01;
        ubuntu02;
        vmkernel;
    }
    network VMnetwork{
        address = "172.16.0.0/24";
        centos01 [ address = ".10"];
        ubuntu01 [ address = ".11"];
        ubuntu02 [ address = ".12"];
    }
}
@enduml

考えたこと

真面目にネットワーク図を描くのであれば、物理ネットワーク図、論理ネットワーク図を原則分けて描いた方がいいと普段は思っています。

ただ一方で、小規模なネットワークであればまぜこぜにしてもいいのでは、という気もしています。
nwdiagは機器数が増えると横長になって見にくくなるという課題があります。「192.168.1.0/24」は論理的には1つのネットワークですが、これを物理的な分割を考えて、「Gigabit L2スイッチの有線192.168.1.0/24」、「無線APのワイヤレス192.168.1.0/24」、「ハイパーバイザ内の仮想192.168.1.0/24」に分けることで横長になりすぎないようにする、各機器がどこにつながっているのか視覚的に分かりやすくする、ということを目指してみました。

コードの解説

nwdiagには図形のラベルにアイコン(スプライト)を使うことができます。

スプライト一覧
https://plantuml.com/ja/stdlib

今回使ったアイコン
https://github.com/Roemer/plantuml-office

上記ページにある以下のアイコンを使ってみます。

まず、コードの先頭で以下のようにアイコンをincludeしておきます。

!include <office/Devices/ip_gateway>

以下はbroadband_routerというノードを定義しています。
broadband_routerを図にする時の文字列はdescriptionで指定します。
descriptionは"<$ip_gateway>\nBroadband Router\nAterm"という文字列にしています。\nは改行です。

<$ip_gateway>がスプライトです。

        broadband_router [description = "<$ip_gateway>\nBroadband Router\nAterm", address = ".1"];

これでアイコン付きのノードを描くことができます。

ハイパーバイザの中の仮想ノードをどう描くかについてはgroup機能を使用しました。network句の中でノードを定義し、group句にノードを描くことでグルーピングが可能です。

    network Management_Network{
        address = "192.168.1.0/24";
        esxi;
        centos01  [ description = "<$virtual_server>\ncentos01", address = ".253(DHCP)"];
        ubuntu01 [ description = "<$virtual_server>\nubuntu01", address = ".254(DHCP)"];
        ubuntu02 [ description = "<$virtual_server>\nubuntu02", address = ".251(DHCP)"];
        vmkernel [description = "<$nic>\nvmkernel", address = ".31"];
    }
    group {
        description = "esxi01"
        centos01;
        ubuntu01;
        ubuntu02;
        vmkernel;
    }

バグ?

groupはどの順番で定義してもいいはずなのですが、以下のようにgroup定義を一番最後に(network VMNetworkよりも後ろに)持ってきたところ、VMnetworkには接続していないはずのvmkernelからVMnetworkに線が引かれました。
想定外の図が描かれてしまったときはコードを書く順番を変えてみたりするとうまくいくことがあります。

    network Management_Network{
        address = "192.168.1.0/24";
        esxi;
        centos01  [ description = "<$virtual_server>\ncentos01", address = ".253(DHCP)"];
        ubuntu01 [ description = "<$virtual_server>\nubuntu01", address = ".254(DHCP)"];
        ubuntu02 [ description = "<$virtual_server>\nubuntu02", address = ".251(DHCP)"];
        vmkernel [description = "<$nic>\nvmkernel", address = ".31"];
    }
    network VMnetwork{
        address = "172.16.0.0/24";
        centos01 [ address = ".10(DHCP)"];
        ubuntu01 [ address = ".11(DHCP)"];
        ubuntu02 [ address = ".12(DHCP)"];
    }
    group {
        description = "esxi01"
        centos01;
        ubuntu01;
        ubuntu02;
        vmkernel;
    }

まとめ

グループ指定はもう少し大きくしてManagement_Network, VMNetworkまで囲いたかったのですが、やり方が分からず。
セグメントへの接続がたまに変になる、ノードごとに色を変えるとか細かい指定ができない、とやや制限もあるのですが、簡単な図を描くにはPlantUML、nwdiagは便利です。

関連記事

Discussion