Lookup の CIDR match を利用してルーティングを検査

`Splunk Version 9.2.1`

簡単なルーティング検査であればさくっと調べる事ができる。
ルーティングループ有無の事前調査などに活用できるかも。 
 (ソースルーティングも可能、ロードバランシングは未対応)

# 必要な情報


<strong>・Lookup1：対象ネットワークの全ルーティングテーブル</strong>
　  - node
　  - dest_network
　  - source_network
　  - next_hop_ip
　  - next_hop_node

<strong>・Lookup2：検査したいパケット</strong>
　  - source_ip
 　 - dest_ip
 　 - 1_node　  (※どのノードからパケットをスタートさせるか)

# サンプル構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789518/10f02d15-00d9-ac59-f9a9-eb4f72b7606d.png)

# Lookup1：対象ネットワークの全ルーティングテーブル

##### ①下記例のようにLookupファイルとして纏める。
　検査したいネットワークのルーティングテーブルを、１つのLookupファイルに纏める。
　ソースルーティングしない場合は、全て 0.0.0.0/0 で良い。(または登録しない、Lookupの条件から外す)
<table>
  <caption>routing.csv</caption>
  <thead>
    <tr>
       <th>node</th> <th>dest_network</th> <th>source_network</th> <th>next_hop_ip</th> <th>next_hop_node</th>
    </tr>
  </thead>
  <tr>
   <td>node1</td> <td>172.16.0.0/24</td> <td>0.0.0.0/0</td> <td>192.168.1.2</td> <td>node3</td>
  </tr>
  <tr>
    <td>node1</td> <td>172.16.1.0/24</td> <td>0.0.0.0/0</td> <td>192.168.1.2</td> <td>node3</td>
  </tr>
  <tr>
    <td>node1</td> <td>192.168.0.0/24</td> <td>0.0.0.0/0</td> <td>connected</td> <td>connected</td>
  </tr>
  <tr>
    <td>node1</td> <td>192.168.1.0/24</td> <td>0.0.0.0/0</td> <td>connected</td> <td>connected</td>
  <tr>
    <td>node2</td> <td>172.16.0.0/24</td> <td>0.0.0.0/0</td> <td>192.168.3.2</td> <td>node4</td>
  </tr>
  <tr>
    <td>...</td> <td>...</td> <td>...</td> <td>...</td> <td>...</td>
  </tr>
</table>

##### ②ルックアップ定義で CIDRを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789518/1e4c8256-4a64-9d2d-da03-c9592db8f1c7.png)

# Lookup2：検査したいパケット
デバッグしたいパケット情報を登録する。

例として3種類のパケットがnode1からスタートした場合、
どのようにルーティングされるか検査する。

<table>
  <caption>packet.csv</caption>
  <thead>
    <tr>
       <th>source_ip</th> <th>dest_ip</th> <th>1_node</th>
    </tr>
  </thead>
  <tr>
    <td>10.0.0.1</td> <td>172.16.0.11</td> <td>node1</td>
  </tr>
  <tr>
    <td>10.0.0.10</td> <td>172.16.0.11</td> <td>node1</td>
  </tr>
  <tr>
    <td>10.0.0.16</td> <td>172.16.1.22</td> <td>node1</td>
  </tr>
</table>

# 各パケットのルーティング結果

パケット毎に、どのノードを経由してルーティングされるか検査できる。
この場合、最後が「connected」だとパケットが目的のネットワークに到達できたことを示す。
それ以外の場合、到達できずに捨てられている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789518/ef4f9855-2019-0ef3-07c0-89503026c493.png)

##### SPL例 (調査したいhop数だけ lookupをコピーしてください)

```ruby:qiita.rb
| inputlookup packet.csv
| lookup routing node AS 1_node dest_network AS dest_ip source_network AS source_ip OUTPUT next_hop_node AS 2_node
| lookup routing node AS 2_node dest_network AS dest_ip source_network AS source_ip OUTPUT next_hop_node AS 3_node
| lookup routing node AS 3_node dest_network AS dest_ip source_network AS source_ip OUTPUT next_hop_node AS 4_node
| lookup routing node AS 4_node dest_network AS dest_ip source_network AS source_ip OUTPUT next_hop_node AS 5_node

| table dest_ip source_ip *_node
```

# 試しにルーティングループさせてみるとこうなる。

Node3 で、宛先 172.16.1.0/24の nexthopを逆(node4 → node1)にしてみると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789518/ac62fedb-f801-cc44-a71a-3cca3d0ea06b.png)

いつまでも node1 ～ node3 間をピンポンして、宛先にたどり着かない様子が確認できる。
以上、現場からルーティングの検査でした！

# 記事終了