Raspberry Piを使って自宅PCをリモート起動してみた
外出先で何か検証を行う時、簡単ものであればクラウドとかVPSで事足りるんだけど、それなりのスペックが必要な検証はちょっとしんどい・・・
その点、自宅PCのスペックはというと
私の用途では結構なオーバスペックなPCちゃんなので、こいつを使わないのは勿体無いよね!
けど、電源ユミットが750Wもあるので常時つけっぱだと電気代がががが
あんまりパーツに負荷も掛けたくないし・・・
色々ググったりした結果、Wake on LANといったリモート起動を可能にする技術があるみたいなので、レッツトライ!
要件
・外出先から自宅PCをリモート起動
・外出先から自宅PCをリモート操作
・出来る範囲でセキュリティは高めに
設計
リモート起動方法
・アクセスルータに外部からWebログインし、そこからマジックパケットを送信
セキュリティ的に却下
セキュリティ的に却下
・Raspberry PiにSSHし、そこからマジックパケットを送信
ラズパイなら電気代しれてるし、一回SSHを挟むからセキュリティもなんぼか高いと思うので、この方法を採用
アクセスルータのグローバルIPの特定方法
・固定IP取得
月額1000円もするから却下
・アクセスルータ指定のダイナミックDNSを使用
いずれも有料なので、却下
DynDNSは昔は無料だったらしいです・・・
・Route53を使用
ホストゾーンと独自ドメインを持っているので、使わないともったいない!
なのでこの方法を採用
Raspberry PiにSSHする方法
これが一番手っ取り早い
リモート操作方法
・Raspberry PiにSSHポートフォワードさせてSSL-VPN確立後、RDP
クライアント側に特定のソフトを入れる必要もないし、レスポンスも一番良いと思うので、この方法を採用したかったんですが
Windows10 HomeはRDPサーバになることができないだと・・・
初めて知ったわ
Gitに海賊版RDPサーバソフトみたいなのもあったけど、WindowsUpdateのせいで今は使えないみたい
まあ使えたとしてもバックドアとか仕込まれてても文句言えないから、セキュリティ的にあれだけど
Proへのアップグレードには13824円もかかるし・・・
・Chrome リモートデスクトップやTeam Viewer等の、一旦別NW経由してリモートアクセスするソフトを使用
せっかくRaspberry PiにSSHまでしてるのに、この方法を使用するのはなんだかな・・・
・Raspberry PiにSSHポートフォワードさせてSSL-VPN確立後、VNC
大学のサーバ構築の授業で使ってたから、その名残でこの方法を採用
構成図
構築手順
①Raspberry Piの初期設定
今使ってるRaspberry Pi借り物だから、初期設定済んでるんだよね~
ここの手順は自分の買った時に、追記します
↓はメモ
SSH用ユーザを作成
sudo adduser hayato
※useraddではホームディレクトリが作成されない
sudo グループに追加
sudo gpasswd -a hayato sudo
②Raspberry PiとRoute53の連携
1.Raspberry Piにログイン
sudo pip install awscli
3.認証情報の設定
aws configure --profile Route53
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: us-east-1
Default output format [None]:
4.設定の確認
aws configure list --profile Route53
5.作業ディレクトリを作成
mkdir /home/hayato/Route53
6.jsonファイルを作成
vi /home/hayato/Route53/dyndns.tmpl
{
"Changes":
[
{
"Action": "UPSERT",
"ResourceRecordSet":
{
"Name": "{%HOST%}.raptor-aws.net.",
"Type": "A",
"TTL": 300,
"ResourceRecords":
[
{
"Value": "{%IP%}"
}
]
}
}
]
}
※パラメータ補足
・"Action": "UPSERT"
レコードに対して行うアクションを指定
UPSERT=更新
CREATE=作成
DELETE=削除
・"Name": "{%HOST%}.raptor-aws.net."
FQDNを指定
・"Value": "{%IP%}"
IPを指定
7.シェルスクリプトを作成
vi /home/hayato/Route53/dyndns.sh
#!/bin/bash
#VariableDefine
PROFILE=Route53
ROUTE53_PATH=/home/hayato/Route53/
ZONEID=XXXXXXXXXXX
IP=$(curl -s inet-ip.info)
HOSTNAME=$(hostname)
#filecreate
sed -e "s/{%IP%}/${IP}/g;s/{%HOST%}/${HOSTNAME}/g" ${ROUTE53_PATH}dyndns.tmpl > ${ROUTE53_PATH}${HOSTNAME}.json
#CLI
aws route53 change-resource-record-sets --profile ${PROFILE} --hosted-zone-id ${ZONEID} --change-batch file://${ROUTE53_PATH}${HOSTNAME}.json
・PROFILE
CLIで使用するプロファイルを指定
・ROUTE53_PATH
・ZONEID
対象のゾーンIDを指定
・IP
グローバルIPを調べるコマンド
・HOSTNAME
サーバ名を指定
8.シェルスプリクトの動作確認
sh /home/hayato/Route53/dyndns.sh
設定ファイル等に誤りがなければ、次のような結果が返ってきます
{
"ChangeInfo": {
"Status": "PENDING",
"SubmittedAt": "2017-09-06T17:34:26.414Z",
"Id": "/change/C21B4F9LM6BATC"
}
}
しばらくするとRoute53のレコードが更新されます
9.シェルスプリクトの権限設定
sudo chmod 755 /home/hayato/Route53/dyndns.sh
10.cronの設定
アクセスルータがISPから割当られているグローバルIPの変動頻度はよく分かりませんが、一日一回と再起動時にレコード更新でいいかな?
crontab - e
動作確認の為、1分毎実行にしてからログ確認しといたほうがいいかも
*/1 * * * * /home/hayato/Route53/dyndns.sh
正常に動作している場合は下記のようなログが出力されます
正常動作を確認できたら、動作確認用のcronは削除しときましょう
③アクセスルータのポートフォワード設定
アクセスルータのベンダや型番によって設定画面が違うと思うので、下記の手順は参考程度と捉えて下さい
1.Raspberry Piと自宅PCのIPを固定
ホストに直接設定してもいいけど、DHCPで固定したほうが楽な気がする
2.IPv6が有効になっていないか確認
IPv6接続サービスが有効になってると、どうあがいてもアクセスルータのWAN側に到達できません
私はここで○そハマリました
3.ポートフォワードの設定
BUFFALOのアクセスルータだと、ポート変換といった名前みたいです
念の為、WAN側のポートは22番以外にしといた方が良いと思います
まあ鍵認証使うのであれば問題はないんですが、BOTのブルードフォースアタックがなんとなく気に入らないので私は変えときました(笑)
4.外部からRaspberry PiにSSH出来るか確認
今回はAWSのLinuxサーバからRaspberry Piにアクセスしてみます
④SSHのセキュリティ設定
1.SSH鍵認証設定
2.SSHのパスワード認証禁止設定
PasswordAuthentication yes → PasswordAuthentication no に変更
SSHの設定を反映
service ssh restart
⑤Wake on LANの設定(Windows10)
Wake on LANはOSやデバイスの相性によって、どうあがいても上手くいかないことがあります
ちなみに私はスリープからの復帰しか無理でした(笑)
まあスリープ状態を復帰させてリモートログインできるなら、まあよしとしましょう
1.ネットワークアダプタの設定
デバイスマネージャから使用してるNICドライバーのプロパティを開いて、↓の画像のように設定されているか確認
2.電源設定
コントロールパネル→電源オプションの左ペインにある電源ボタンの動作設定を選択をクリックし、高速スタートアップのチェックを外す
私はスリープからの復帰しか無理だったので、チェック入れたままにしています
3.BIOSの設定
BIOSの設定はベンダとバージョンによって設定項目がまちまちなので、自分が使っているBIOSに合う設定を頑張って見つけて下さい(笑)
例↓
⑥マジックパケット送信スプリクト作成
1.Raspberry Piにログイン
2.wakeonlanのインストール
sudo apt-get install wakeonlan
3.スクリプトの作成
vi wakeonlan.sh
#!/bin/bash
IP="192.168.11.X"
COUNT="0"
MAC="XX:XX:XX:XX:XX:XX"
wakeonlan -i ${IP} -p9 ${MAC}
wakeonlan -i ${IP} -p9 ${MAC}
wakeonlan -i ${IP} -p9 ${MAC}
while :
do
ping ${IP} -c 1 >> /dev/null
if [ $? -eq 0 ] ;then
echo "${IP} : OK"
break
else
wakeonlan -i ${IP} -p9 ${MAC}
COUNT=$*1
if [ $COUNT -eq 3 ] ;then
echo "${IP} : NG"
break
fi
fi
done
成功の時のコマンド結果は↓のようになる
Sending magic packet to 192.168.11.X:9 with XX:XX:XX:XX:XX:XX
Sending magic packet to 192.168.11.X:9 with XX:XX:XX:XX:XX:XX
Sending magic packet to 192.168.11.X:9 with XX:XX:XX:XX:XX:XX
192.168.11.X : OK
一回目の3発で起動しなかった場合は、もう3発繰り返して
それでも駄目な時のコマンド結果は↓のようになる
Sending magic packet to 192.168.11.X:9 with XX:XX:XX:XX:XX:XX
Sending magic packet to 192.168.11.X:9 with XX:XX:XX:XX:XX:XX
Sending magic packet to 192.168.11.X:9 with XX:XX:XX:XX:XX:XX
Sending magic packet to 192.168.11.X:9 with XX:XX:XX:XX:XX:XX
Sending magic packet to 192.168.11.X:9 with XX:XX:XX:XX:XX:XX
Sending magic packet to 192.168.11.X:9 with XX:XX:XX:XX:XX:XX
192.168.11.X : NG
⑦VNCの設定
1.インストール及び初期設定
2.クライアント側のTeraTermにポートフォワードの設定
3.VNC接続テスト
結果
Raspberry Piを使った検証なのに、全然IoT関係ないという
しかもVNCよりChrome リモートデスクトップの方が早いやんけ!
VNCェ・・・
Windows10 Proが欲しいです(^q^)
おまけ
自宅PCをスリープ放置してると、予期せぬスリープ解除問題に遭遇することがあります
その場合の解消方法はこちら
参考サイト
*1: COUNT + 1