自宅のPCにどこからでもWindows RDP(リモートデスクトップ)接続できるよう、利用しているインターネットサービスプロバイダーの固定IPアドレスオプションを契約していたのですが、この料金がこの度べらぼうに値上がりしてしまったので、やむなく契約を解除しました。
するとRDP接続はできなくなるのかというと、そんなことはなくて、グローバルIPアドレスさえわかれば接続できるわけです。PCがWOL (Wake On LAN)に対応していれば、外出先からPCの電源を入れることもできます。
まずは自宅のPC内で現在のグローバルIPアドレスを取得する方法です。方法はいろいろありますが、私はCygwinで下記のコマンドを実行して取得する方法をとりました。
dig myip.opendns.com @208.67.222.222 +short
dig
コマンドはbind
をインストールすれば利用できます。
さて、上記コマンドで得られたグローバルIPアドレスを外出先で知ることができるよう、次の2つの方法を考えました。
- グローバルIPをテキストファイルに書き込み、クラウドで同期する
- メール送信する
クラウドで同期
Windowsのタスクスケジューラーで、以下のbashスクリプトがWindows起動時に実行されるように設定します。
#!/bin/bash
dig myip.opendns.com @208.67.222.222 +short > ~/OneDrive/GlobalIP.txt
これでWindows起動時に得られたグローバルIPアドレスが~/OneDrive/GlobnalIP.txt
に書き込まれます。~/OneDrive
がOneDriveで同期されるようになっていれば、外出先からOneDriveに同期されたGlobalIP.txt
ファイルを見ればいいわけです。
メール送信
以下のPowerShellスクリプトを用意します。
$MyName = hostname
$MyIP = dig myip.opendns.com "@208.67.222.222" +short
$From = "起動通知 <送信者メールアドレス>"
$SmtpServer = "メール送信サーバー"
$Port = ポート番号
$User = "メールアカウント名"
$Pass = "メールアカウントのパスワード"
$SMTPClient=New-Object Net.Mail.SmtpClient($SMTPServer,$Port)
$SMTPClient.EnableSsl=$false
$SMTPClient.Credentials=New-Object Net.NetworkCredential($User,$Pass)
$To = "宛先メールアドレス"
$Subject = "$MyName"
$Body = "$MyIP"
$Mail=New-Object Net.Mail.MailMessage($From,$To,$Subject,$Body)
$SMTPClient.Send($Mail)
$SMTPClient
の諸設定は、使用するSMTPサーバーに応じて変更してください。
そしてWindowsのタスクスケジューラーで、このスクリプトがWindows起動時に実行されるように設定します。プログラム/スクリプトにはpwsh.exe
の完全パスを設定し、引数には上記スクリプトの完全パスを設定します。
この方法では、メールアカウントのパスワードをスクリプト内に平文で書くことになるので、セキュリティー的にはちょっと難があります。
スクリプト実行タイミング
グローバルIPアドレスはルーターとISPとの接続が確立したときに決まり、通常、その後その接続が切られるまでは変化しないと思うので、Windowsを起動するたびに毎回実行する必要は無いのですが、負荷的にはぜんぜん大したことないので、まあいいかなと。ルーターを再起動したりするとアドレスが変わってしまうので、そのときは上記のスクリプトを再度実行してやらなければなりません。それを忘れそうで心配なら、タスクスケジューラーで定期的に実行されるよう設定するのもありだと思います。
グローバルIPアドレスが決まったタイミング、すなわち、ルーターとISPとの接続が確立したときに、それをトリガーとしてスクリプトを実行できるといいのですが、そんな方法は(少なくとも私の環境では)ありません。もしいい方法があれば教えてください。