彷徨えるフジワラ

年がら年中さまよってます

nwdiag にルーティング表示機能を追加

テキストベースでネットワーク構成図を作成する手段が無いものかと色々探したところ、 nwdiag が良さそうな感じだったのですが、 残念なことにパケットのルーティング周りに関して図示する機能がありませんでした。

blockdiag.com

他に良さそうなものがなかったのと、 それっぽい用途向けと思われる route ステートメントが途中まで実装されていた状態だったので、 nwdiag にルーティングを図示する機能を追加してみました。

github.com

pull request が受理されるまでは pip install git+https://github.com/flying-foozy/nwdiag@make-route-statement-available 等で私の公開リポジトリ経由でインストールしてください。

機能追加版の nwdiag を使うことで、 以下のようなテキスト記述から:

diagram {
    inet [shape = cloud];
    inet -- router;

    network internal {
        address = "192.168.0.0/24";

        router [address = "192.168.0.1"];
        client01 [address = "192.168.0.101"];
        client02 [address = "192.168.0.102"];
    }

    route {
        client02 -> router -> inet;
        inet -> router -> client01 [path = "rb", color = "blue"];
    }
}

以下のような図を生成できます。

f:id:flying-foozy:20191112212655p:plain

ルーティングの描画は "la" (Left-Above), "lb" (Left-Below), "ra" (Right-Above), "rb" (Right-Below) の4通りの値のいずれかを path 属性に指定することで、 ネットワーク接続線に対する描画の相対位置を指定できます。

他にも、色(color)/強調の有無(thick)/線種(style)/ ネットワーク描画からのパディング(pad)が指定可能です。

diagram {
    inet [shape = cloud];
    inet -- router;

    network {
        router;
        client01;
        client02;
    }

    route {
        client02 -> client01 [path = "rb", pad = 4,        color = "green"];
        client01 -> router   [path = "lb",          thick, color = "blue"];
        router -> client01   [path = "ra",                 color = "maroon"];
        client01 -> client02 [path = "la", pad = 4,        style = "dotted"];
        inet -> router       [             pad = 1];
    }
}

f:id:flying-foozy:20191112212721p:plain