プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

QNAP TS-251+ の設定(UPSおよび他NASとの連携)

昨年10月頃に購入した、 QNAP TS-251+ にやっとUPSをつないだので、その経緯をまとめてみました。

QNAP の NAS は USBでUPSを接続して、簡単に停電時の電源断などの設定ができます。このとき、自分をマスターにして、ネットワーク経由で他のNASをUPSと連動させることもできます。1台のUPSに複数の機器を接続しているときに有効ですね。ちなみに、他社製のNASでも類似の機能はよくあります。

なので、TS-251+ にUPSを繋げて、既存のNETGEARのReadyNASと連動させればいいんじゃないの?と簡単に考えて、設定したのですがこれがどうもうまくいきません。 久しぶりにドはまりしました。何とかして連携させるようにしたので、その顛末をまとめておきます。

の前に、やりたいことをまとめるとこうなります

同じUPSについないでいる2台のNASを連動させたい

  • UPS : APC ES 550G
  • QNAP TS-251+
  • NETGEAR ReadyNAS Ultra2

ところで、NAS の UPS 機能、自社シリーズしか対応していないというのが多いような印象ですが、これなんとかならないですかね? > 各メーカーさん

NUTについて

ReadyNAS (Ultra2) は古い機種なので、同じようなことで悩んでいる先人がきっといるはず、ということで、ググってみると、一応それなりに情報が出てきました。 基本的には、QNAP も ReadyNAS も NUT (Network UPS Tools) というのを元に、これらの機能を実現しているようです。NUT自体はオープンソースのようです(ライセンスGPL2、こちらで言及)。

なので、NUTの設定さえなんとかなれば、なんとかなるんじゃないかという甘い期待を持ちつつ、いろいろと調べていきました。

実現方法

どちらのNASも一方をマスターにして、その他のNASをスレーブ(ネットワーク経由でUPSを監視)として動作させることができます。 結論からすると、今回の場合、最終的に実現したのは、

  • QNAP : master
  • ReadyNas : slave

として動作させることでした。

基本的な設定方法としては、

http://www.ryanbibbey.com/2014/10/26/setup-nas-remote-ups-monitoring/

https://community.netgear.com/t5/New-to-ReadyNAS/Duo-V2-Remote-UPS-monitoring-sorted-v-5-3-7/td-p/862527

に従っています。

QNAP 側の設定

まず、UPSを TS-251+ に接続します。 この状態で、NASにログインすると、外部機器が接続されました』というダイアログが表示されます。

f:id:junichim:20170224112426p:plain

『外部デバイス設定を表示する』を選択するとUPSの設定画面が表示されます。 正しく接続できていれば、画面下部に、UPSのバッテリー残量などの情報が表示されます。

f:id:junichim:20170224102228p:plain

表示されていない場合は、接続に問題ないか、TS-251+ で使えるUPSかどうか、などを調べてみてください。

まずは、TS-251+ 側でUPSを設定します。

f:id:junichim:20170224102900p:plain

このとき、必ず『ネットワークUPSサポートを有効にする』にチェックを入れて、通知先になるNAS(スレーブとして動作するReadyNAS)のIPアドレスを入力しておきます(ちょっと面倒ですが、GUIからは、個別のIPアドレスでの入力になります)。

次に、SSH経由でログインします。NUT関係の設定は、 /etc/config/ups にあります。 upsd.users ファイルを開き、masterに接続する際のユーザー情報を修正します。

[admin]
                password = 123456
                allowfrom = localhost
                actions = SET
                instcmds = ALL
                upsmon master           # or upsmon slave

とある、allowfromを

                allowfrom = ALL

のように、ローカルホスト外からでも接続できるように変更しておきます。

設定を変更したら、

upsd -c reload

として、変更後の設定を読み込ませておきます。

ReadyNAS (Ultra2) 側の設定

まず、SSHでログインします。

ReadyNAS のNUT関係の設定は、 /etc/nut にあります。 upsmon.conf ファイルを開き

MONITOR UPS@localhost 1 monuser pass master

の行を

MONITOR qnapups@ts-251+のIPアドレス 1 admin 123456 slave

と変更します。

『qnapups』がUPS名で、QNAPの /etc/config/ups/ups.conf で定義されている名前になります。 『admin 123456』がネットワーク経由で接続する際のユーザー名とパスワードで、QNAP の /etc/config/ups/upsd.users で定義されています。

QNAP側のUPSの機能として、これらの名前を変更することができないようです。なお、ReadyNAS側は、UPS名が UPS で固定です。これが、メーカー間の連動ができない一因ですかね。

次に、 /etc/init.d/readynas_startup を開いて

if [ "$ENABLE_REMOTE_UPS" = "1" ]; then
  if [ -s /etc/frontview/ups.conf ]; then              
    . /etc/frontview/ups.conf                          
    UPSID="`upsc UPS@$UPS_SERVER 2>$DBG|awk -F': ' '/ups.mfr:|ups.model:/ { if($1==\"ups.mfr\") printf $2 \" \"; else print $2; }'`"
    if /sbin/upsmon -p &>$DBG; then                                                                                      
      echo "${UPSID}!!OK" >/var/log/frontview/ups.log
    else                                             
      echo "${UPSID}!!FAIL" >/var/log/frontview/ups.log
    fi                                                 
  else                              
    echo "Unknown UPS!!FAIL" >/var/log/frontview/ups.log
  fi                                                    
fi                    

の部分を

if [ "$ENABLE_REMOTE_UPS" = "1" ]; then
  if [ -s /etc/frontview/ups.conf ]; then              
    . /etc/frontview/ups.conf                          
    # change for qnap nas    
    #UPSID="`upsc UPS@$UPS_SERVER 2>$DBG|awk -F': ' '/ups.mfr:|ups.model:/ { if($1==\"ups.mfr\") printf $2 \" \"; else print $2; }'`"
    UPS=`awk '/^MONITOR/ { print $2 }' /etc/nut/upsmon.conf`                                                                         
    UPSID="`upsc $UPS 2>$DBG|awk -F': ' '/ups.mfr:|ups.model:/ { if($1==\"ups.mfr\") printf $2 \" \"; else print $2; }'`"
    if /sbin/upsmon -p &>$DBG; then                                                                                      
      echo "${UPSID}!!OK" >/var/log/frontview/ups.log
    else                                             
      echo "${UPSID}!!FAIL" >/var/log/frontview/ups.log
    fi                                                 
  else                              
    echo "Unknown UPS!!FAIL" >/var/log/frontview/ups.log
  fi                                                    
fi                    

と変更します。

(たぶん)ReadyNAS起動時に、 upsc を使って、接続先となるUPSの情報を取得して、/var/log/frontview/ups.log に書き込んでいる処理になります。 この際に、UPS名が固定だったのを、設定ファイルの内容を反映するようにしました。

このままでは、リモートUPSの設定が有効ではないので、 /etc/default/services を開いて

ENABLE_REMOTE_UPS=0

ENABLE_REMOTE_UPS=1

と変更します。 また、 /etc/frontview/ups.conf を開いて

UPS_SERVER= ts-251+のIPアドレス

と、リモートUPSサーバーのIPアドレスを指定しておきます(upsmon.conf のIPアドレスと同じです)。 なお、下記設定ファイル

  • /etc/nut/upsmon.conf
  • /etc/default/services
  • /etc/frontview/ups.conf

は管理画面から設定を行うと書き換えられるので、その点には注意してください。

ここまで、設定したらいったん再起動します。 設定に問題がなければ、ReadyNAS の管理画面にログインすると UPS のアイコンがグリーンに点灯していると思います(マウスを重ねるとバッテリー残量などの情報も見れます)。

ここまでくれば、最後は動作テストです。 UPSの電源ケーブルを抜いて、しばらく待つと、TS-251+, ReadyNAS Ultra ともにシャットダウンしました。問題ないようですね。

実は、現在手元にあるNASだと、最初に示したリンク先の設定方法(/etc/init.d/ups-monitor を使う方法)では、GUIのアイコンにUPSの情報が反映されませんでした。 一連の動作を見ていたら、/var/log/frontview/ups.log が正しく作られないようです。 詳細なところは不明だったのですが、上記の readynas_startup スクリプト中に ups.log を作成するところがあったので、ここを修正したら、動くようになったという次第です。

(参考)うまくいかなかった方法など

上記とは逆に、

  • QNAP : slave
  • ReadyNAS : master

で構成することも考えられます。ネット上にもいくつか参考となる情報があり、

https://forum.qnap.com/viewtopic.php?t=81908 https://forum.qnap.com/viewtopic.php?f=182&t=60166

上記の方法でやろうとしたのですが、今のReadyNAS には、dummy-ups ドライバが入っていなくて断念しました。

nasxxx:/etc/nut# ls /lib/nut/
hidups  newhidups  snmp-ups  usbhid-ups
nasxxx:/etc/nut# 

なお、dummy-ups ドライバーを使う場合は、下記の様に起動に失敗するときがあるそうです。

http://serverfault.com/questions/655797/nut-ups-dummy-driver-in-repeater-mode-for-synology-nas

次善の方法として、upsutilを切って、upsmonで起動する というのも試しました。 upsmonを起動できるとあるので、upsutil をkill後起動してみたが、 いつの間にやら、upsutilのプロセスが立ち上がってました。

https://xn3.wiki/qnap/qnap-upsmon http://www.mtom.cz/url/Linux/QNAP+a+NUT

あと、upsmonについては起動できているようで、マスター側(ReadyNAS側)のログに接続成功が出ていたのですが、QNAP側のGUIにはUPSのステータスなどが表示されませんでした。 ということで、この方法は断念しました。

なお、参考までに、upsutilをapcupsdに入れ替える記事というのがあったので、

http://itarou.blogspot.jp/2010/05/ts-419papcupsd.html

これを参考にして、 upsutil を upsmon に入れ替えれば実現できるかもしれません(やってないのでわかりませんが)。

その他にも、TS-251+ では docker/vm が動かせるので、 USB パススルーを使って仮想マシン側にUPSを管理さえればいいんじゃないか、とも思ったのですが、どうもうまくUSB(UPS)のパススルーが設定できなかったので実現できませんでした。

(参考)バージョンなど

QNAP TS-251+ NUT 2.6.5 Readynas Ultra2 NUT 2.0.5

ReadyNas 側の設定内容

  • 設定ファイルの場所:/etc/nut
  • UPS名 (ups.confのセクション名): UPS
  • ユーザー定義 (upsd.users) : monuser, pass

QNAP側の設定内容

  • 設定ファイルの場所:/etc/config/ups
  • UPS名 (ups.confのセクション名): qnapups
  • ユーザー定義 (upsd.users) : admin, 123456

wget https エラーへの対応

先日書いた

blog.mori-soft.com

の作業を行っている際に、ルータを再起動しました。ま、固定IPではないので、当然割り当てられているグローバルIPアドレスが変わってしまいます。 いまの環境では、AWS上においてある開発作業用のサーバーは自宅からしかアクセスしないので、IPアドレスで制限をかけています。設定時の記事は下記になります。

blog.mori-soft.com

このサーバーにアクセスしようとしたら、なぜかできません。よくあるタイムラグかな?と思い、調べてみると自宅のIPアドレスをddnsで更新しているのが失敗しているようです。

blog.mori-soft.com

(上記記事を書いたときは、ReadyNas Duo で動作させてましたが、 今は Readynas Ultra2 で動かしています)

原因

なんでだろうと思い、調べてみると、どうも中間証明書がないことが原因のようです。 ブラウザ(Windows10, Firefox)で更新用のページにアクセスすると、問題なく表示できます。この状態で証明書を表示すると、中間証明書を使っていることが分かりました。

f:id:junichim:20170110132238p:plain

以前の状態はわからないのですが、どうもこれが怪しそうです。ちょっとネットを調べてみると、wgetの場合、中間証明書は自分で指定しないといけないようです。

ということで、 RapidSSL の中間証明書をダウンロードして、設定してみます。調べてみると、こちらから入手できるようです。

www.geotrust.co.jp

このSHA-2(SHA-256)の証明書の部分をファイル(下記では、RapidSSL_SHA256.pem というファイル)に保存して、wgetで指定してみます。

ultra2:~/ddns/# wget --ca-certificate=RapidSSL_SHA256.pem -O - 'https://ieserver.net/cgi-bin/dip.cgi'
--2017-01-10 13:16:50--  https://ieserver.net/cgi-bin/dip.cgi
Resolving ieserver.net... 61.197.187.238
Connecting to ieserver.net|61.197.187.238|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `STDOUT'

(以下、略)

お、できました。やっぱり、中間証明書がないことが原因だったようです。 あとは、自動更新スクリプトでこのファイルを使うように指定して、問題解決となりました。

めでたし、めでたし。

オープンリゾルバ対策

ネットワーク周りでちょっと調べ物をしていた時、オープンリゾルバ というキーワードが出てきました。 気になったので、調べてみると外部からアクセス可能な(再帰)DNSサーバーのことで、これを踏み台にして DDoS 攻撃を行うことがあるとのことです。

オープンリゾルバ(Open Resolver)に対する注意喚起 - JPNIC

で、この記事を読むと、ブロードバンドルータもオープンリゾルバになっている可能性がある、とのことでしたので、今更ですが対策を取りました。

まずは現状把握ということで、オープンリゾルバ確認サイトというのがあるので、それで状況をチェックします。

オープンリゾルバ確認サイト

オープンリゾルバ確認サイト公開のお知らせ

何も対策してないけど、大丈夫そうでした。

とはいえ気になったので、一応、ルータ (マイクロリサーチ NetGenesis MR-GL1000) のサポートページを見ると、オープンリゾルバ対策するにはファイアウォールのフィルタ設定を追加しろ、とあります。

DNSオープンリゾルバ対策につきまして|株式会社マイクロリサーチ

http://www.mrl.co.jp/support/nwginfo/firewall/doc/dns.html

あれ?大丈夫なんじゃないの? 気になったので、他のオープンリゾルバ確認サイトでもチェックしましたが、大丈夫そうです。

どういうことだろうか?

いろいろとネットを見ると、(他の機種ですが)ルータの設定によって、オープンリゾルバになる場合があるという記述がありました。 ひょっとしたら、これに該当するのかも?と思いましたが、残念ながら、マイクロリサーチのWebサイトでは情報を見つけられませんでした。

埒が明かないので、最終手段としてメーカーさんのサポートに電話してみたところ、現在の設定内容だと、オープンリゾルバにはなっていないとのことでした(たぶん、設定内容によっていろいろと条件があるのでしょうから、中途半端に書いて混乱するのは避けたいので、詳しくは割愛しておきます)。なるほど、それで確認サイトだと大丈夫と出てたのか、一安心。確認サイトを信頼して良かったようです。

将来、設定内容を変更した時に、この内容を忘れてるかもしれないので、(現時点では不要ですが)フィルタだけ設定しておきました。