0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

XymonのEnable/Disable機能がリバースプロキシ環境で使えないのを直す

Last updated at Posted at 2020-04-26

注意:スカイホビット越川のシステム監視ブログ https://ameblo.jp/skyhobbit/entry-12592619048.html と同じ内容です。

XymonにはEnable/Disable という監視を一時停止する機能がありますが、それが使えなくなる事象がありました。
AmazonLinux 2環境のXymon 4.3.30。
Enable/Disable画面の Select what to Disable で「Apply」をクリックしても、なにも反応がありません。

このとき Apache のエラーログには

error_log
AH01215: 日付 Enadis POST that is not coming from self or svcstatus (referer=http://example.com/xymon-seccgi/enadis.sh). Ignoring.: /home/xymon/cgi-secure/enadis.sh, referer: http://example.com/xymon-seccgi/enadis.sh

とのエラーメッセージが出力されています。
EnadisとはEnable/Disableの略ですね。POSTはhttpのPOSTのことではなく投稿との意味。
Enable/Disableの投稿は自分自身かsvcstatusからは許可されていないとのことです。
リバースプロキシを使って転送している環境なので使えないと出ているようです。

公式メーリングリストを探すと 2019年9月12日 に René Vermareさんからパッチの投稿がありました。
https://lists.xymon.com/archive/2019-September/046708.html から引用。
(注意:字下げはTABです)

reverse_proxy.patch
--- a/web/enadis.c      2019-07-23 17:29:06.000000000 +0200
+++ b/web/enadis.c      2019-09-11 01:06:33.283642013 +0200
@@ -332,7 +332,8 @@
    int argi, i;
    char *username = getenv("REMOTE_USER");
    char *userhost = getenv("REMOTE_HOST");
-    char *userip   = getenv("REMOTE_ADDR");
+    char *userip   = getenv("HTTP_X_FORWARDED_FOR");
+    if (userip == NULL) userip = getenv("REMOTE_ADDR");
    SBUF_DEFINE(fullmsg);
    char *envarea = NULL;
    int  obeycookies = 1;
--- a/web/acknowledge.c 2019-07-23 17:29:06.000000000 +0200
+++ b/web/acknowledge.c 2019-09-11 01:01:55.493676233 +0200
@@ -374,7 +374,8 @@

    parse_query();
        if (getenv("REMOTE_USER")) {
-            char *remaddr = getenv("REMOTE_ADDR");
+            char *remaddr = getenv("HTTP_X_FORWARDED_FOR");
+            if (remaddr == NULL) remaddr = getenv("REMOTE_ADDR");

            SBUF_MALLOC(acking_user, 1024 + strlen(getenv("REMOTE_USER")) + (remaddr ? strlen(remaddr) : 0));
            snprintf(acking_user, acking_user_buflen, "\nAcked by: %s", getenv("REMOTE_USER"));

変更点を見てもらえばわかりますが、REMOTE_ADDRでIPアドレスを拾っているところをHTTP_X_FORWARDED_FORから拾うように変えています。これで良さそうです。

フロントのリバースプロキシをApacheでやっている場合は、

httpd.conf
ProxyPreserveHost on

で転送先にホスト名を送る必要があります。

このパッチをXymonソースコード群の直下に置いて、reverse_proxy.patchとか適当にファイル名をつけて保存。

$ patch -p1 < reverse_proxy.patch

で適応したら、あとはビルドし直します。

これで解決しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?