ことの成り行き
昨夜、さくらVPSで動かしているLinuxサーバーへのSSH接続に際して、Open IPv6 DDNSサービスを使ってセキュリティ強化していることを記しましたが、その後に残っていた課題(手間を減らしたい)というところを自動化して手抜きする事にしました。
先の記事にも記しましたが、私が使っているWindowsパソコンは、使わないときはスリープさせています。使う時にスリープから復帰させているので、IPv6アドレスの割当が変更になります。つまりその都度、Open IPv6 DDNSサービスに通知してIPv6アドレスを更新してやらなければ、VPSにアクセスすることが出来ません。
必要に応じてWebブラウザを起動して、DDNS更新用の指定URL(お気に入りに登録済)にアクセスして更新していますが、この手間を省きたいと考えていました。年末年始休暇のうちに済ませておいてこれから先、ちょっとでも横着しようと思って対策することにしました。
仕組みを考える
ある程度の仕組みを考えておく必要があります。
まず、毎回Webブラウザを起動して、お気に入りからワンクリックするのが手間ですから、Webブラウザでなく、BATファイルでコマンド実行できる仕組みを使いたいです。Linux系だとhttp接続できる「wget」や「curl」なんかが思い浮かびましたが、最近はWindows10にも備わっている「curl」を使えるんじゃないかなという気がします。
それをタスクスケジューラでスリープ復帰時に実行させます。トリガーはスリープ復帰イベントが使えるとベストだと思っています。
検証1:Webブラウザの代わりにcurlでアクセスしてみる
Windowsパソコンからコマンドプロンプトを起動してcurlコマンドを実行してみました。
C:\Users\sasapurin>curl http://ddnsapi-v6.open.ad.jp/api/renew/?XXXXXXXXXXXXXXXXXX
RESULT:OK
RESULT_JA:正常に処理されました。
RESULT_EN:The request has successfully completed.
RESULT_SIZE:458
#Key,Fqdn,Hostname,IPv6,UpdateHostFqdn,UpdateHostIPv6,Mail,Create,LastRenew,LastQuery,NumRenew,NumQuery,CreateSrcIP,LastRenewSrcIP
XXXXXXXXXXXXXXXXXX,sasapurin.i.open.ad.jp,sasapurin,2405:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:3e10,update-XXXXXXXXXXXXXXXXXX.i.open.ad.jp,2409:11:XXXX:422:XXXX:XXXX:XXXX:XXXX,sasapurin@hogehoge.com,20180106_141517,20230101_001545,20230101_113401,722,6743204,2405:XXXX:XXXX:0:XXXX:XXXX:XXXX:XXXX,XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:3e10
Code language: PHP (php)
私のDDNS更新専用URLはさすがにここに晒すわけにはいかないので、IPv6アドレスと一緒にXXXXでマスクしておきます。内容的には伝わると思うので普通の人にはそんなアドレスはどうでも良いでしょうけど(普通ではない人もネット上には多いので・・)。
どうやらcurlコマンドでも上手く動作する様です。curlがWindowsで使える様になったのは本当に便利ですね。色々とメリットがあります。最も肝となる検証が上手く出来たので次に進むことができます。
検証2:イベントビューアでスリープ復帰情報を探す
Windowsにはイベントビューアというログ情報を残す機能があります。エラー情報から一般情報まで記録されるので、スリープからの復帰情報も残っていると考えました。もし予想通りにイベント情報が残っているのであれば、この種のイベントを使って、タスクスケジューラーのトリガー条件にできるのではないかと考えました。
案の定、「システムは低電力状態から再開しました。」というPower-Troubleshooterイベントがログに残っていました。直感的にこれは使えそうだと思いました。
ここで入手できる情報を上手く使うことが出来れば、タスクスケジューラーによる自動実行のトリガーにできそうです。
検証3:タスクマネージャに登録する
タスクマネージャに新規でタスクを追加します。ここで最も重要なのはタスク実行のトリガーを指定するところになります。既にイベントビューアーで入手した情報を設定して行きます。具体的には下記の3つだけなので大したことでは無いんですけどね。
- ログ名:システム
- ソース:Power-Troubleshooter
- イベントID:1
あとは実行するコマンドを、BATファイル等にしておき、タスクで指定するだけです。
試してみながらBATファイル(IPv6Update_curl.bat)を下記の様な内容にしました。
powershell sleep 30
curl http://ddnsapi-v6.open.ad.jp/api/renew/?XXXXXXXXXXXXXXXXXX
timeout -T 10
Code language: JavaScript (javascript)
curlコマンドの実行前にsleep 30秒を入れたのは、PCが省電力モードから復帰直後に自動実行されると、ネットワーク接続がまだ整っていないらしく、更新に失敗するということが分かったからです。30秒も要らないと思うので、徐々に短くして行こうと思います。
timeout 10秒を入れたのは、視覚的にIPv6 DDNSが更新されたことを認識出来た方が良いかなと思った訳で、5秒位でも十分かも知れません。この辺りは使いながらストレスを感じない値にチューニングして行こうと思います。
最後に
以前から面倒くさいな、改善させなきゃ、と思っていたことが、貴重なお正月休みのお陰で解決させることが出来ました。Windows PCで作業をしようと思ってスリープから復帰させるだけでVPSへの接続準備も開始されますから手間がかかりません。
考えてみればPCを起動した時には実行されないので、トリガー条件にPC起動時という条件を追加しておいた方が良さそうだと今気づきました。
使っていきながら秒数など若干の調整は必要だろうと思っていますが、毎回毎回同じ手間をかけるのも無駄だったので、時間のとれる時に対策しておくのは先々有益なんじゃないかと思っています。あとはWindowsパソコンと、VPSサーバーの時刻をしっかりNTPで正確に合わせておけば、秒読みレベルでも正確になるのでDDNSが反映されるタイミングが掴めてストレスレスに使えます。
個人的な好みでNTPは、NICTを使っています。Webブラウザでアクセスするとズレも確認できて便利です。もちろんVPSとWindowsパソコンの両方でNICTのNTPに同期して時刻を合わせています。常時1秒以内のズレの範囲に収まっていれば快適に使えます。
コメント