Traffic Analyticsを利用することでNSGフローログで取得したNSGを通るトラフィックに関する情報を分析することができます。
この機能を利用して、いろんな宛先に対するトラフィック量を測定してみました。
また、測定するにあたってトラフィック測定用のクエリも作成してみました。
Traffic Analyticsを設定する
Traffic AnalyticsはNSGフローログの設定の中で設定することが可能です。

新しくNSGフローログを作成する際には、「Traffic Analytics を有効にする」にチェックを入れて作成してください。

仕組みとしては、Traffic Analyticsを有効化にするとストレージアカウントに格納されるNSGフローログのJSONファイルをLogAnalytics上でクエリを用いて分析できるようになります。
トラフィック量を測定する
今回は以下の2つのトラフィックの値を測定してみました。
- 特定の宛先IPアドレスに対するトラフィック量
- インターネット向け通信のトラフィック量
NSGフローログが格納されているLogAnalyticsのログからクエリを用いて検索します。
NetWork Watcherのページの中になる [Traffic Analytics] の画面からもクエリに遷移できます。

ログ検索の画面を開き、「AzureNetworkAnalytics_CL」と入力すると、NSGフローログの情報が出力されます。

今回はそれらの出力結果の項目の中から [InboundBytes_d] と [OutboundBytes_d] を利用してトラフィック量を測定していきます。
![[InboundBytes_d] と [OutboundBytes_d]について](https://bonjiri-blog.com/wp-content/uploads/analyze-nsg-flow-log-with-traffic-analytics-and-measured-traffic-volume-005-800x447.png)
特定の宛先IPアドレスに対するトラフィック量
以下のクエリを実行すると「特定の宛先IPアドレスに対するトラフィック量」を確認できます。
今回は特定の宛先IPアドレスとして(10.2.0.4)を利用してみました。
AzureNetworkAnalytics_CL
| where SubType_s == 'FlowLog'
| where FASchemaVersion_s == '2'
| where DestIP_s == ('10.2.0.4')
| extend TotalOutTraffics_Bytes = tolong(OutboundBytes_d + InboundBytes_d)
| summarize TotalOutTraffics_Bytes = sum(TotalOutTraffics_Bytes) by FlowIntervalStartTime_t
「TotalOutTraffics_Bytes」という列に合計のトラフィック量(Bytes)が表示され、今回は6/6_3:00:00(UTC) ~ 6/6_3:10:00(UTC) の間に 2,568,623,982Bytes 流れたことが分かります。

クエリの解説
#2行目
where SubType_s == 'FlowLog'
[SubType_s]が「FlowLog」という値である結果だけを指定し、
フローログの結果だけが表示されるようにしています。
[SubType_s]には、他に「Schema」「StatusMessage」「Topology」「SchemaStatusMessage」などといった値があるため、これらの中からフローログの情報が格納されている「FlowLog」だけを抜き出すためにソートをかけています。
#3行目
where FASchemaVersion_s == '2'
[FASchemaVersion_s]が「2」という値である結果だけを指定し、
フローログのバージョンが2のログのみを出力するようにしています。
#4行目
where DestIP_s == ('10.2.0.4')
[DestIP_s]が「10.2.0.4」と一致する値である結果だけを指定し、
特定の宛先IPに対する結果のみを出力するようにしています。
#5行目
extend TotalOutTraffics_Bytes = tolong(OutboundBytes_d + InboundBytes_d)
既存のデータに存在する [OutboundBytes_d] と [InboundBytes_d] を足した値を「TotalOutTraffics_Bytes」という新たな項目として作成します。
#6行目
summarize TotalOutTraffics_Bytes = sum(TotalOutTraffics_Bytes) by FlowIntervalStartTime_t
5行目で作成した「TotalOutTraffics_Bytes」を [FlowIntervalStartTime_t] と関連させながら出力します。
また、[FlowIntervalStartTime_t] はフローログの取得間隔に依存します。
今回は取得間隔を10分ごとに設定したので、[FlowIntervalStartTime_t] も10分ごとに出てくる結果となっています。

インターネット向け通信のトラフィック量
次にAzureからインターネットに出ていく通信量を測定してみます。
AzureNetworkAnalytics_CL
| where SubType_s == 'FlowLog' and (FASchemaVersion_s == '2')
| where DestIP_s !startswith ('10.')
| where DestIP_s !startswith ('192.168.')
| where DestIP_s !startswith ('172.')
| extend TotalOutTraffics_Bytes = tolong(OutboundBytes_d + InboundBytes_d)
| summarize TotalOutTraffics_Bytes = sum(TotalOutTraffics_Bytes) by FlowIntervalStartTime_t
クエリ自体は先ほどとほとんど同じですが、3~5行目で
【「DestIP_s」としてプライベートIPのアドレス帯から始まるもの以外を表示させる】
という条件を追加することで、宛先がプライベートIPアドレス以外の通信 = 宛先がパブリックIPの通信を表示させるようにしています。

上記のクエリで表示される結果はNSGフローログを適用しているすべてのトラフィックの量が表示されます。
もしNSGごとのトラフィック量を出したい場合には、「NSGList_s」の項目でNSGを指定することでNSGごとのトラフィック量の測定も可能かと思います。
| where NSGList_s contains ('/[※NSGが所属するRG名]/[※NSG名]')
また、上記のトラフィック量の単位は[Byte]でしたが、【[Byte]の値を8倍する】という計算を加えることで[bit]単位の結果表示もできます。
※1 Byte(バイト) = 8 bit(ビット)
AzureNetworkAnalytics_CL
| where SubType_s == 'FlowLog' and (FASchemaVersion_s == '2')
| where DestIP_s !startswith ('10.')
| where DestIP_s !startswith ('192.168.')
| where DestIP_s !startswith ('172.')
| extend TotalOutTraffics_Bytes = tolong(OutboundBytes_d + InboundBytes_d)
| extend TotalOutTraffics_bit = tolong(OutboundBytes_d + InboundBytes_d)*8
| summarize TotalOutTraffics_Bytes = sum(TotalOutTraffics_Bytes), sum(TotalOutTraffics_bit) by FlowIntervalStartTime_t
8行目で「TotalOutTraffics_bit」という項目を追加しているので、「TotalOutTraffics_bit」という列も追加されて結果表示されます。

「172.」から始まるプライベートアドレスの定義には注意が必要
少し経ってから気づいたのですが、
172から始まるIPアドレス帯は「172.16.0.0~172.31.255.255」となるので、
上述のように「172.から始まるものはプライベートアドレス帯とする」と扱うと、一部のパブリックIPを含んでしまいます。
なので、厳密にインターネット向けの通信のみに絞るのであれば、以下のように第二オクテットの部分まで絞り込む必要があるかと思います。
| where DestIP_s !startswith ('172.16.')
| where DestIP_s !startswith ('172.17.')
| where DestIP_s !startswith ('172.18.')
| where DestIP_s !startswith ('172.19.')
| where DestIP_s !startswith ('172.20.')
| where DestIP_s !startswith ('172.21.')
| where DestIP_s !startswith ('172.22.')
| where DestIP_s !startswith ('172.23.')
| where DestIP_s !startswith ('172.24.')
| where DestIP_s !startswith ('172.25.')
| where DestIP_s !startswith ('172.26.')
| where DestIP_s !startswith ('172.27.')
| where DestIP_s !startswith ('172.28.')
| where DestIP_s !startswith ('172.29.')
| where DestIP_s !startswith ('172.30.')
| where DestIP_s !startswith ('172.31.')
さいごに
Traffic Analyticsで取得できる情報のうち、今回はトラフィック量に焦点をあてていろいろ試してみました。
他にもフロー数などTraffic Analyticsを利用して取得できる情報はありますので、どんな情報があるのか、どんな加工ができるのかなど試してみたいと思います。