元パチ屋店員NWエンジニアの技術ブログ

元パチ屋店員NWエンジニアが技術のアウトプット化を目的に、好き勝手な事を書いてるブログです

Raspberry Piを使って自宅PCをリモート起動してみた

f:id:hayato-ota-rf:20170915014710j:plain

外出先で何か検証を行う時、簡単ものであればクラウドとかVPSで事足りるんだけど、それなりのスペックが必要な検証はちょっとしんどい・・・

その点、自宅PCのスペックはというと

プロセッサ:Intel Core i7 950

メモリ:11 GB RAM

SSD:128 GB

私の用途では結構なオーバスペックなPCちゃんなので、こいつを使わないのは勿体無いよね!

けど、電源ユミットが750Wもあるので常時つけっぱだと電気代がががが

あんまりパーツに負荷も掛けたくないし・・・

色々ググったりした結果、Wake on LANといったリモート起動を可能にする技術があるみたいなので、レッツトライ!

要件

・外出先から自宅PCをリモート起動

・外出先から自宅PCをリモート操作

・出来る範囲でセキュリティは高めに

設計

リモート起動方法

・アクセスルータに外部からWebログインし、そこからマジックパケットを送信

セキュリティ的に却下

 

・アクセスルータにマジックパケットをポートフォワードさせる

セキュリティ的に却下

 

Raspberry PiSSHし、そこからマジックパケットを送信

ラズパイなら電気代しれてるし、一回SSHを挟むからセキュリティもなんぼか高いと思うので、この方法を採用

アクセスルータのグローバルIPの特定方法

・固定IP取得

月額1000円もするから却下

 

・アクセスルータ指定のダイナミックDNSを使用

いずれも有料なので、却下

DynDNSは昔は無料だったらしいです・・・

 

・Route53を使用

ホストゾーンと独自ドメインを持っているので、使わないともったいない!

なのでこの方法を採用

Raspberry PiSSHする方法

・アクセスルータにSSH通信をポートフォワードさせる

これが一番手っ取り早い

リモート操作方法

Raspberry PiSSHポートフォワードさせてSSL-VPN確立後、RDP

クライアント側に特定のソフトを入れる必要もないし、レスポンスも一番良いと思うので、この方法を採用したかったんですが

Windows10 HomeはRDPサーバになることができないだと・・・

初めて知ったわ

Gitに海賊版RDPサーバソフトみたいなのもあったけど、WindowsUpdateのせいで今は使えないみたい

まあ使えたとしてもバックドアとか仕込まれてても文句言えないから、セキュリティ的にあれだけど

Proへのアップグレードには13824円もかかるし・・・

ぐぬぬ

 

Chrome リモートデスクトップやTeam Viewer等の、一旦別NW経由してリモートアクセスするソフトを使用

せっかくRaspberry PiSSHまでしてるのに、この方法を使用するのはなんだかな・・・

 

Raspberry PiSSHポートフォワードさせてSSL-VPN確立後、VNC

大学のサーバ構築の授業で使ってたから、その名残でこの方法を採用

構成図

f:id:hayato-ota-rf:20170915010517j:plain

構築手順

Raspberry Piの初期設定

今使ってるRaspberry Pi借り物だから、初期設定済んでるんだよね~

ここの手順は自分の買った時に、追記します

↓はメモ

SSH用ユーザを作成

sudo adduser hayato

※useraddではホームディレクトリが作成されない

 

sudo グループに追加

sudo gpasswd -a hayato sudo

Raspberry PiとRoute53の連携

1.Raspberry Piにログイン

 

2.AWS CLIをインストール

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

5で作成したjsonファイルがあるディレクトリを指定

・ZONEID

対象のゾーンIDを指定

f:id:hayato-ota-rf:20170907034825p:plain

・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

00 00 * * * /home/hayato/Route53/dyndns.sh

@reboot /home/hayato/Route53/dyndns.sh

動作確認の為、1分毎実行にしてからログ確認しといたほうがいいかも

*/1 * * * * /home/hayato/Route53/dyndns.sh

正常に動作している場合は下記のようなログが出力されます

Sep 20 20:02:01 raspberrypi2 CRON[19858]: (hayato) CMD (/home/hayato/Route53/dyndns.sh)

正常動作を確認できたら、動作確認用のcronは削除しときましょう 

③アクセスルータのポートフォワード設定

アクセスルータのベンダや型番によって設定画面が違うと思うので、下記の手順は参考程度と捉えて下さい

 

1.Raspberry Piと自宅PCのIPを固定

ホストに直接設定してもいいけど、DHCPで固定したほうが楽な気がする

f:id:hayato-ota-rf:20170920231931j:plain

2.IPv6が有効になっていないか確認

IPv6接続サービスが有効になってると、どうあがいてもアクセスルータのWAN側に到達できません

私はここで○そハマリました

 

3.ポートフォワードの設定

BUFFALOのアクセスルータだと、ポート変換といった名前みたいです

念の為、WAN側のポートは22番以外にしといた方が良いと思います

まあ鍵認証使うのであれば問題はないんですが、BOTのブルードフォースアタックがなんとなく気に入らないので私は変えときました(笑)

f:id:hayato-ota-rf:20170920232209j:plain

4.外部からRaspberry PiSSH出来るか確認

今回はAWSLinuxサーバからRaspberry Piにアクセスしてみます

f:id:hayato-ota-rf:20170920233544p:plain

SSHのセキュリティ設定

1.SSH鍵認証設定

webkaru.net

2.SSHのパスワード認証禁止設定

sudo vi /etc/ssh/sshd_config

PasswordAuthentication yes → PasswordAuthentication no に変更

SSHの設定を反映

service ssh restart

Wake on LANの設定(Windows10)

Wake on LANはOSやデバイスの相性によって、どうあがいても上手くいかないことがあります

ちなみに私はスリープからの復帰しか無理でした(笑)

まあスリープ状態を復帰させてリモートログインできるなら、まあよしとしましょう

 

1.ネットワークアダプタの設定

バイスマネージャから使用してるNICドライバーのプロパティを開いて、↓の画像のように設定されているか確認

f:id:hayato-ota-rf:20170921001526j:plain

2.電源設定

コントロールパネル→電源オプションの左ペインにある電源ボタンの動作設定を選択をクリックし、高速スタートアップのチェックを外す

私はスリープからの復帰しか無理だったので、チェック入れたままにしています

f:id:hayato-ota-rf:20170921002226p:plain

3.BIOSの設定

BIOSの設定はベンダとバージョンによって設定項目がまちまちなので、自分が使っているBIOSに合う設定を頑張って見つけて下さい(笑)

例↓

f:id:hayato-ota-rf:20170921002717j:plain

マジックパケット送信スプリクト作成

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.インストール及び初期設定

centossrv.com

2.クライアント側のTeraTermにポートフォワードの設定

f:id:hayato-ota-rf:20170921040202p:plain

3.VNC接続テスト

f:id:hayato-ota-rf:20170921040227p:plain

結果

Raspberry Piを使った検証なのに、全然IoT関係ないという

しかもVNCよりChrome リモートデスクトップの方が早いやんけ!

VNCェ・・・

Windows10 Proが欲しいです(^q^)

おまけ

自宅PCをスリープ放置してると、予期せぬスリープ解除問題に遭遇することがあります

その場合の解消方法はこちら

deaimobi.com

参考サイト

eng-entrance.com

inamuu.com

qiita.com

qiita.com

qiita.com

ryoichi0102.hatenablog.com

qiita.com

raptor-falcon.hatenablog.com

*1: COUNT + 1