SplunkでCIDR（IPアドレス/ネットマスクまたは プレフィックス）からネットワークアドレスを計算

# What's new?

「SplunkのSPL（サーチ文）で、IPアドレスとネットマスク（例： 192.0.2.17/255.255.255.240）や、IPアドレスとプレフィックス（例： 192.0.2.17/28）から、手軽にネットワークアドレスを計算できたらいいのに！」
という願いを叶える、外部コマンドlookupを作成しました。

使い方：
```
（ここに任意のサーチを記載）
| lookup local=t ipcalclookup Address as ここにCIDR表記のIPアドレス値を持つフィールドを記載 OUTPUT Network Netmask Prefix Broadcast
```

* ここでいう「CIDR表記のIPアドレス値」とは、以下のような形式
    * `192.0.2.17/255.255.255.240` （IPアドレス/サブネットマスク）
    * `192.0.2.30/28` (IPアドレス/プレフィックス)
    * `2001:db8:1234::1/64` (IPv6アドレス/プレフィックス)

使用例1：
```
| makeresults
| eval ip="192.0.2.17/255.255.255.240"
| lookup local=t ipcalclookup Address as ip OUTPUT Network Netmask Prefix Broadcast
| table ip Network Netmask Prefix Broadcast
```

![ipcalclookup_result_example1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589834/26cbd987-d654-216f-5ebe-30926bc10bb3.png)

# どう便利なの？

Splunkにはビルドインのeval関数である `ipmask(<mask>,<ip>)`という一見使えそうな関数があるのですが
実はこれがあまり使い勝手が良くないため、代替策としてこの `ipcalclookup` を利用できます。

ipmaskの使用例：
```
| makeresults
| eval ip="192.0.2.17"
| eval Network=ipmask("255.255.255.240",ip)
| table ip Network
```
![ipmask_result_example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589834/24e47d5a-8cb3-d0b7-b588-c7d1266034f2.png)

ipmaskの残念な点：
* 第一引数にフィールド名を渡せない。つまり、マスク値として固定文字列を指定する必要があるため、行ごとにマスク値が異なるようなサーチ結果から、それぞれネットワークアドレスを算出するようなことができない。
* ネットワークアドレスはわかるが、ネットマスク⇔プレフィックスの相互変換ができない。
* IPv6アドレスに対応していない。

今回ご紹介する外部コマンドlookup `ipcalclookup` であれば、以上の残念な点をすべてカバーできます。

使用例2:
```
| makeresults
| eval ip=split("192.0.2.17/255.255.255.240,192.0.2.30/28,2001:db8:1234::1/64",",")
| mvexpand ip
| lookup local=t ipcalclookup Address as ip OUTPUT Network Netmask Prefix Broadcast
| table ip Network Netmask Prefix Broadcast
```

![ipcalclookup_result_example2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589834/ef1e0cf2-c168-1d2a-43f9-f16c73f29227.png)

# 活用例

## ネットマスク⇔プレフィックスの変換
例えば、SNMPで取得したルータやL3スイッチのインタフェース情報は、IPアドレス、ネットマスクの情報を含んでいます。
一方、Splunkのlookupで、CIDRマッチを利用するためには、「IPアドレス/プレフィックス」の形式でルックアップファイルを記載する必要があります。
ネットマスクからプレフィックスへ変換することが容易にできれば、インタフェース情報のログから、CIDRマッチ用のルックアップファイルを自動作成する際のサーチが簡潔になります。

## 同一ネットワークかどうかの識別に利用

たとえば、以下の3つのIPアドレスが、同じネットワークに所属しているかどうか判断する場合、
* 192.0.2.17/28
* 192.0.2.30/28
* 192.0.2.33/28

それぞれのネットワークアドレスを容易に計算できれば、ネットワークアドレスの値の違いで判断することができます。

使用例3:
```
| makeresults
| eval ip=split("192.0.2.17/28,192.0.2.30/28,192.0.2.33/28",",")
| mvexpand ip
| lookup local=t ipcalclookup Address as ip OUTPUT Network
| stats values(ip) as ip by Network
```
![ipcalclookup_result_example3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589834/1589291f-fefb-abf9-6fd9-d5ed8f7a1502.png)

# インストール方法
上記の外部コマンドlookupを利用するには、Splunkbaseから以下の無償Appをご使用中のSplunkのサーチヘッドへインストールします。
インストール後、すぐに上記lookupが使用可能になります。

[Numeral system macros for Splunk](https://splunkbase.splunk.com/app/6595)

https://splunkbase.splunk.com/app/6595

以下の方法でも導入できます。
ご利用中のSplunkの画面から、
「Appの管理」→「他のAppを参照」→「Numeral」で検索→
「Numeral system macros for Splunk」を「インストール」

Splunk.comのユーザー名とパスワード（Splunkダウンロード時に作成したアカウントなど。[無料でここから作成](https://www.splunk.com/en_us/sign-up.html)できます）を入力し、
利用規約に「同意してインストール」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589834/a4cc0c9b-bb62-434e-f7fe-57c390b827d8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589834/d20cd6f5-369f-1a99-9ffc-acc0b2949cd3.png)

---

# 2025/01/21追記
ver3.x.x では新たな機能も追加されました。
下記記事もぜひご確認ください。

https://qiita.com/Joh256/items/91ca48ff18704fcdef51