おうちサーバがアクセス不能になっていた

 出社していて、おうちサーバにアクセスできなくなっていたのに気がついた。

ルータがハングアップ?もしくはapacheのハングアップ?

 以前使っていたAterm WG8400は時折ハングアップするので、ハングアップしていたらリブートするスクリプトをcronで走らせていた。Aterm WG1800HS4になってからはそのスクリプトは止めている、というか、同じスクリプトではリブートできない。
 帰宅して、ローカルで接続してみたらちゃんと表示できる。これでapacheのハングアップの線は消えた。
 Atermをゲートウェイにしているおうちサーバにログインして外部にpingを打ってみたらちゃんと返ってくる。これでルータのハングアップの線も消えた。

ルータがなにかブロックしている?

 新しいルータなので未知のセキュリティ設定が残っているかと思ったけど、それらしきものはなし。

apacheの設定がおかしい?

 設定を変えたわけでもないので、この線は薄い。cron-aptしているので知らない間に重要な仕様変更を伴うバージョンアップが適用された可能性がないわけではないが。

ポート設定のミス?

 apacheのログを見てみる。ルータを交換して以降80番ポートのアクセス記録しかない。ああ、httpsは443番を開けなならんかったんやった。Aterm WG1800の443番を開けていたのは確認していたけど、「443番ってずいぶん前にwindowsの穴があったポートやな。なんで開けてたんやろう」と思って閉じたままやった。さっそく開けてみる。
 だがしかし、状況は同じ、

旧ルータに戻してみる

 Aterm WG1800に戻してみた。状況変わらず。ということはルータの設定が原因ではないということ。

IOデータのルータをゲートウェイにしてみる

 Atermの接続を切って、ぷららv6エクスプレスIPoE接続に使用しているIOデータのルータをPPPoE接続にしてみる。状況変わらず。

MyDNSの反映が遅い?

 ログを再度見てみる。IPアドレス直打ち(apacheでdenyしている)やDynDNSのドメインであるkazz.mine.nuのアクセスは普通に来ている。ということはMyDNSで更新しているkazz.redの反映が遅い?
 スマートフォンからhostコマンドを打ってみる。やはりkazz.redとkazz.mine.nuではIPアドレスが違う。ついにたどり着いたか?これまでMyDNSは迅速に反映されていたのに。

MyDNSのサイトを訪問

 障害情報でも出ていないかと思ってMyDNSのサイトを訪問してみる。特にそれらしき告知はない。
 ログインしてマイページをいろいろ見ていて衝撃の事実を発見。そこに登録されているIPアドレスが現在のIPアドレスと違う。ということはIPアドレスの告知に失敗している。スクリプトに問題ありか。

スクリプトの不具合発見

 コマンドラインからスクリプトを実行してみる。エラーが出た。このエラー、見たことがある。IPアドレスが更新された時にroot宛に送られてくるメールと同じ(IPアドレスが変更されていない時は来ない)。

sh: 1: -4: not found
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   743    0   743    0     0   1259      0 --:--:-- --:--:-- --:--:--  1257

 不気味なメールだけど、なぜ来るのか疑問に思いつつも、原因が思い当たらず放置していた。
 改めて考えるに、curlコマンドで更新を伝えている時のエラーと思われる。オプションに付けている -4 がコマンド扱いされているし、-s オプションが無視されてverboseになっている。
 スクリプトの中のcurl部分を直接コマンドラインで実行してみる。なんか複数行扱いされとるような。
 ここにいたってやっとで不具合に気がつく。curlに投げさせているurlの中の&をシェルがコマンドつなぎの&と解釈していたんだった。ああ、凡ミス。
 Atermを交換する時に、グローバルIPアドレスの取得方法をルータの設定ページから拾うのではなく、ifconfig.ioから取得するように変更した。

$ip_current= rtrim(`curl https://ifconfig.io -4 -s`);

 それまではfile_get_contentsでMyDNSに告知していたけど、上記の変更の時にこの行もcurlコマンドを実行するように書き換えたんだった。
 修正後のスクリプトの該当行は以下。

$ret = `curl "https://www.mydns.jp/directip.html?MID=${account}&PWD=${password}&IPV4ADDR=$ip_current" -s |grep "IP address notify OK."`;

 ``の中を””でくくってエラー問題は解決。
 更新してみたらすぐに反映された。ただで使わせてもらっているのに疑ってごめんなさい、MyDNS様。

おまけ

 ついでに、apacheのログの設定を変更して、IPアドレスでアクセスしてきたものを別ファイルに保存するようにした。
 一連の作業後にIOデータのルータのぷららv6エクスプレスの上流接続が不安定になったが、次第に安定してきた。
 IOデータのルータのwifiの一つが不安定で「インターネット接続なし」になる。スマートフォンを見たらIPアドレスが192.168.10.台と別セグメントになっていた。ルータ内のDHCPサーバでなく他のDHCPサーバに接続しているもよう。念のためAtermの設定を見たらDHCPサーバ機能が生きていて、割り当てセグメントが192.168.10.台だった。オフにしたら正常につながるようになった。上記のv6エキスプレス不調の時にAtermでつないでみた時の設定変更が元に戻ってなかったか。このせいでスマートコンセントの一つがオフラインになって、再設定もできなくなっていた。ハードウェア故障かと諦めていた。
 IPアドレス告知が正しくできていない間でもいくつかkazz.redへのアクセス(IPアドレス直打ちではないやつ)があったのはなんでや(ローカルからのアクセスはエラーだけしか記録していない)。