Splunk Universal Forwarderからのデータ送信をHTTP Proxyを通す方法

# はじめに

Splunkへのデータ転送は通常、Universal Forwarder（UF）を使いますが、たまに通信上の課題があります。

それは、UFでは独自のTCP通信を使用するためHTTP Proxyを使用できず、HTTP Proxyを介さなければUFからSplunkに到達できない環境にいる場合はデータ転送が行えないことです。
※SOCKS5 Proxyには対応していますので、それが使用可能であれば問題ありません。

そんな中、Universal Forwarder 8.1からhttpoutという機能が追加されています。
この機能を使うことでSplunkのHEC（HTTP Event Collector）を使用したHTTP通信に切り替えられ、HTTP Proxyを利用することができます。
また、ロードバランサーで負荷分散できるようにもなるというメリットもあります。

早速試してみましょう。

https://docs.splunk.com/Documentation/Forwarder/latest/Forwarder/Configureforwardingwithoutputs.conf#Configure_the_universal_forwarder_to_send_data_over_HTTP

# 構成

こんな感じで環境を用意しました。
UF、Splunk Enterpriseはインストールだけした状態とします。
ちなみに、SplunkはEnterpriseで用意していますがSplunk Cloudでも同様に行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/88a795db-a4ae-7ec1-03bc-b41fadca7848.png)


# httpoutを設定しよう

## HECを用意

SplunkでHECを追加します。

1. ヘッダーメニューから設定 > データ入力
1. HTTPイベントコレクターの「新規追加」をクリック
1. 適当に設定
    1. 名前：任意（「UF httpout」など）
    1. ソースタイプ：自動
    1. インデックス：いじらない　※indexもsourcetypeもUF側で指定するため
1. 払い出されたトークン値をメモしておく
1. 再びヘッダーメニューから設定 > データ入力
1. HTTPイベントコレクターをクリック
1. グローバル設定ボタンをクリック
1. 全トークンが「有効」であることを確認（無効だったら有効にしておく）


## httpoutの設定（outputs.conf）

UFでHTTP送信するためのhttpoutの設定を行います。

`$SPLUNK_HOME/etc/system/local/outputs.conf`を開き（なければ新規作成）、以下を追記。

```text:$SPLUNK_HOME/etc/system/local/outputs.conf
[httpout]
httpEventCollectorToken = 払い出したトークン
uri = https://Splunkのホスト名orIPアドレス:8088
```

Splunk CloudのURLとポートはこちら。
https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector#Send_data_to_HTTP_Event_Collector_on_Splunk_Cloud_Platform

なお、通常はCLIで`splunk add forward-server`で送信先を設定しますが上記のhttpout設定だけでOKです。
※もし通常の設定（tcpout）とhttpoutが両方存在しても、httpoutが優先されます。


## Proxyの設定（server.conf）

HTTP Proxyを使用するための設定を行います。

`$SPLUNK_HOME/etc/system/local/server.conf`を開き（なければ新規作成）、以下を追記。

```text:$SPLUNK_HOME/etc/system/local/server.conf
[proxyConfig]
http_proxy = http://ProxyサーバURLまたはIPアドレス:Proxyサーバポート
https_proxy = http://ProxyサーバURLまたはIPアドレス:Proxyサーバポート
```

## UF再起動

設定を反映するために再起動を行います。

`$SPLUNK_HOME/bin/splunk restart`

# 確認

これでHTTPデータ送信が可能になりました。
諸々確認してみます。

## データ取り込み確認

Splunk側でサーチ実行。UFからデータ受信できていることが確認できました。

```go
index=_internal | stats count by host
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/749000d6-f749-565a-5898-7c8b0a9692a9.png)

## 通信データの確認

念のため、ちゃんとProxy経由しているよねということを確認。

Proxyサーバでtcpdumpしてみます。
UF: 10.202.37.190
Proxy: 10.202.37.20
Splunk: 10.202.6.7

UF > Proxy（TCP:3128通信）

```sh:
tcpdump dst port 3128 -nn
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/ec55161a-773e-e337-9c64-fc19bc14baff.png)

Proxy > Splunk（TCP:8088通信）

```sh:
tcpdump dst port 8088 -nn
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/c3c29b43-b347-d622-e1f4-06839e50ef3b.png)

問題なさそうです。

## パフォーマンス確認

UFのスループットはデフォルト256KB/sです。httpoutでも同様に適用されるか確認します。

この上限値はlimits.confのmaxKBpsで定義されています。 

https://docs.splunk.com/Documentation/Splunk/latest/Admin/Limitsconf#.5Bthruput.5D

UFでバカでかファイルを用意してadd monitorします。

```sh
$SPLUNK_HOME/bin/splunk add monitor <バカでかファイルのパス>
```

Splunk側でモニターコンソールから確認すると・・・
※設定 > モニターコンソール > インデックス化 > パフォーマンス > インデックスパフォーマンス：インスタンス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/1d20a40a-1729-42c2-376f-cb3b4f3c7f6a.png)

253 KB/sでています（他に取り込みはしていない）。
だいたい上限値で取り込めています。

UFでmaxKBpsを倍の512にしてみると

```text:$SPLUNK_HOME/etc/system/local/limits.conf
[thruput]
maxKBps = 512
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/57e107bd-efe5-f60d-0fe7-6adf1796720d.png)

きっちり倍になりました。

限界にチャレンジ（ダメ絶対）。

```text:$SPLUNK_HOME/etc/system/local/limits.conf
[thruput]
maxKBps = 0  #上限なし
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/79b1121d-8a0d-e45c-a382-a576d0bded0d.png)

この環境だと3599 KB/sでました。


# まとめ

簡単な設定でHTTP送信に切り替えられました。
もしHTTP Proxyが必須な場合は使えますね。