読者です 読者をやめる 読者になる 読者になる

学校の環境でZabbixからslack通知を送れなかった話

家の環境ではZabbixからslackへ通知送れたけど、学校の環境では通知を送れなかったのを解決できたのでメモ

症状

  • slack通知が送れる環境と同様に実装したはずだが、通知を送れない

環境

  • CentOS7 [user: root, centos]
  • Zabbix3.0.5
  • 学校環境ではProxy経由でWANに繋がっている

ゴール

  • Zabbixからslackへアラートを送信する

本題

学校の環境にZabbixを入れてslackへ通知しよう!と思い通知スクリプトを実装
しかし、slack側には何も送られず、Zabbix側では「通知スクリプト実行したよ!」という表記だけ出てしまう

最初はSELinuxかなぁ?パーミッションかなぁ?とか思っていたけど、そもそもその場合はZabbix側でエラーがでる・・・
ということは、実行後にネットワーク部分でエラーがでているのでは?と考えてみた
とりあえず、どこでエラーがでているのか確認も含めて、スクリプト自体を実行することにした

【ユーザー: centos
f:id:yu_ping:20161209110354p:plain

【ユーザー: (sudo -s) root】
f:id:yu_ping:20161209110357p:plain


centos側では問題なく実行出来ているものの、sudo -sしたrootではタイムアウトのエラーが出てしまっている

この状態でコネクションが張れてるか気になったので、今度はhttps://slack.com/に対してcurlをやってみた

【ユーザー: centos
f:id:yu_ping:20161209113401p:plain

【ユーザー: (sudo -s) root】
f:id:yu_ping:20161209104723p:plain

すると、sudo -sしたroot側ではproxyに向けて通信を行っていなかった
centos側にはネットワーク設定にproxyを入れていたものの、/etc/profile.d/配下にproxy.shを作成してない為
sudo -sしたrootではproxyを経由せず通信していたのだ。

これを直せばZabbixから通知を送れるようになるんじゃねえか?!とか思い、/etc/profile.d/配下にproxy.shを作成
以下のような設定で内容を記述した

PROXY="ProxyIPアドレス:ポート番号"

export http_proxy="http://$PROXY"
export https_proxy="http://$PROXY"
export ftp_proxy="http://$PROXY"

変更後、sudo -sし直してcurlをしたところ、ちゃんとProxyを経由して通信する事が出来た。
しかし、これではまだZabbixから通知を送信することは出来なかった。
そこで、Wiresharkを用いてパケットトレースをすることにした。(最初からやれ)

【直接スクリプトを叩いた場合】
f:id:yu_ping:20161209115320p:plain

【zabbixから実行した場合】
f:id:yu_ping:20161209115329p:plain

結果、直接スクリプトを叩いた場合はProxyを経由しているが、Zabbixから実行した場合はProxyを経由してない事がわかった。
ということは、通知スクリプト自体にproxy.shを読み込めば経由してくれるのではないか?!と思い、通知スクリプトの最初に以下を追記した。

source "/etc/profile.d/proxy.sh"

その結果、うまくslackへ通知する事ができた。

f:id:yu_ping:20161209120138p:plain


PS.

通知だけ送れて、ステータスコードが送れない事もあった。
これはsedを用いて改行を置き換えしている部分がただの改行になっていたので、CRの改行を入力してあげるとうまく送信する事ができた。

f:id:yu_ping:20161209120748p:plain