過去のブログで掲載していた内容です。現在はGhostを使用しておりません。
ブログ始めました。プラットフォームはWordPressではなくGhostを選びました。選んだ理由と構築方法を紹介します。 ブログの構築方法を紹介しますが、まずはブログを始めようと思ったきっかけをお話しようと思います。
過去のブログで掲載していた内容です。現在はGhostを使用しておりません。
ブログ始めました。プラットフォームはWordPressではなくGhostを選びました。選んだ理由と構築方法を紹介します。 ブログの構築方法を紹介しますが、まずはブログを始めようと思ったきっかけをお話しようと思います。
過去にQiitaに投稿した内容のアーカイブです。
ポートの開放することなく、Respberry Piに外からアクセスする、ポートの開放することなく、Respberry Piに外からアクセスする(2020年 AWS編) に続く第3段です。
今回はOpenVPNのクラウドサービス「OpenVPN Cloud」を使います。
OpenVPN Cloud | The Next-Generation Cloud VPN Solution https://openvpn.net/cloud-vpn/
公式サイトから引用すると
A managed service that provides secure networking, over the Internet, between an enterprise’s private networks and remote users in the form of a “VPN in the Cloud”.
DeepLによる翻訳
企業のプライベートネットワークとリモートユーザーの間で、インターネットを介して安全なネットワークを提供するマネージドサービスです。
とのことです。
OpenVPNのサーバー機能をサービス提供してくれますので、Raspberry Piはサーバーではなくクライアントとしてセットアップします。そのため、ポートの開放は不要です。
2020/11時点で3接続までは無料です。10台接続の場合は、$7.50/接続のようです。 https://openvpn.net/cloud-vpn/pricing/
https://cloud.openvpn.net/ にアクセスし、アカウントを作成しましょう。アカウント作成までに必要なものはメールアドレスのみで、クレジットカードなどは必要ありませんでした。
アカウントが作成されたら、管理画面が表示されます。
メニューの「Users」を選択しましょう。
初期状態では、Userは1つ(OpenVPN Cloudアカウントと同じもの)だけですが、プラスボタンでUserが追加できます。 Groupの設定はとりあえず「Default」でも良さそうです。
アカウントが作成できたら、「User Portal URL」に記載のあるURLにアクセスします。(OpenVPN Cloudアカウント作成時に指定したドメインです)
ここに、先程自分で作成したUserでログインします。
ログイン後、クライアントアプリのインストール方法が表示されいます。 WindowsやMac、iOS、AndroidをOpenVPNに接続する方法はこの内容に従ってインストールしましょう。
Linux向けのクライアント設定方法もリンクがあるのですが、armアーキテクチャには対応してなかったので、以下の方法でRaspberry Piの設定をしましょう
もう少しブラウザでの設定が続きます。
ブラウザ上部の「MY DEVICES」を選択します。
作成したデバイスの「Download profile」ボタン(ダウンロードっぽいやつ)を押し、.ovpnファイルをダウンロードします。リージョンはお好きなところを選択してください。
さて、いよいよRaspberry Pi上での設定です。
OpenVPNのインストール OpenVPNのクライアントだけのインストール方法はわからなかったので、サーバーも一緒にインストールしちゃいます。
sudo apt install openvpn -y
OpenVPNのサーバーが起動する設定なので止めます。
sudo systemctl disable openvpn.service
先程ブラウザで入手した.ovpnファイルを/etc/openvpn/client.conf
として保存します。
拡張子も変えてしまいます。
OpenVPNのクライアントだけサービス起動するように設定し、起動します。
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
トンネルインターフェイスが作成されます
pi@raspberrypi:~ $ ip addr show tun0
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 100.96.1.4/28 brd 100.96.1.15 scope global tun0
valid_lft forever preferred_lft forever
inet6 fd:0:0:8100::4/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::a644:7126:6232:c17b/64 scope link stable-privacy
valid_lft forever preferred_lft forever
pi@raspberrypi:~ $
これで、もう一つOpenVPNのクライアントをインストールした環境から接続ができるようになります。
過去にQiitaに投稿した内容のアーカイブです。
外出時に自宅のラズパイが気になることありませんか? ブラウザさえあれば、Azure Cloud Shellからアクセスできますので、紹介します。
IoT Hub デバイス ストリーム
の機能を使います。2020/11/1現在プレビュー状態ですが、誰でも試すことが可能です。
Azure IoT Hub デバイス ストリームによって、さまざまな cloud-to-device 通信シナリオのセキュリティで保護された双方向 TCP トンネルの作成が容易になります。 デバイス ストリームは、デバイスとサービス エンドポイント間のプロキシとして機能する、IoT Hub ストリーミング エンドポイントによって仲介されます。
(画像は公式サイトのものです) https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-device-streams-overview
IoT Hubが仲介することで、通常はファイアーウォールに防がれてアクセスできないRaspberry Piに外部からアクセスできるようになります。
Raspberry Pi 3 Raspberry Pi OS (32-bit) Lite 最新版(2020-08-20)
以下の手順で進めます。
Azure IoT Hubの作成は、Azure Cloud Shellで実行します。
az extension add --name azure-iot
無料のSKUで作成します。 デバイスストリームに対応しているリージョンは限られています。
az iot hub create --name [IoT Hub名] --resource-group [リソースグループ名] --location centralus --sku f1 --partition-count 2
Raspberry PiがIoTデバイス扱いとなりますので、IoT Hubにデバイスを作成します。デバイスIDはraspberrypi
としました。
az iot hub device-identity create --hub-name [IoT Hub名] --device-id raspberrypi
接続文字列は2種類必要です。
デバイス(Raspberry Pi)側で使用する接続文字列
az iot hub device-identity connection-string show --hub-name [IoT Hub名] --device-id raspberrypi --output tsv
サービス(Azure Cloud Shell)側で使用する接続文字列
az iot hub connection-string show --policy-name service --hub-name [IoT Hub名] --output tsv
これで、Azure IoT Hubの設定は完了です。
つづけてRaspberry Piの設定です。 OSをインストールした直後の状態から進めたいと思います。
sudo apt install git cmake libssh-dev libcurl4-openssl-dev uuid-dev -y
パブリックプレビュー用ブランチを使用します。
git clone -b public-preview https://github.com/Azure/azure-iot-sdk-c.git
cd azure-iot-sdk-c
git submodule update --init
azure-iot-sdk-c/iothub_client/samples/iothub_client_c2d_streaming_proxy_sample
にあるiothub_client_c2d_streaming_proxy_sample.c
にデバイス側で使用する接続文字列を指定します。(70行目です)
static const char* connectionString = "[device connection string]";
公式ドキュメントではmake -j
と書いてありますが、メモリ不足で失敗しますので、-j
は外しました。
cd ~/azure-iot-sdk-c/
mkdir cmake
cd cmake
cmake ..
make
makeが成功するとazure-iot-sdk-c/cmake/iothub_client/samples/iothub_client_c2d_streaming_proxy_sample/
にiothub_client_c2d_streaming_proxy_sample
が生成されます
わかり易い場所に移動します。
mkdir ~/bin
cp iothub_client/samples/iothub_client_c2d_streaming_proxy_sample/iothub_client_c2d_streaming_proxy_sample ~/bin/
serviceファイルを作成します。
[Unit]
Description=IoT Hub Client C2D Streaming Proxy
After=network.target
[Service]
ExecStart=/home/pi/bin/iothub_client_c2d_streaming_proxy_sample
WorkingDirectory=/home/pi/bin
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
serviceを有効にして起動します。
sudo mv ~/iothub_client_c2d_streaming_proxy.service.service /etc/systemd/system/
sudo systemctl enable iothub_client_c2d_streaming_proxy.service
sudo systemctl start iothub_client_c2d_streaming_proxy.service
デバイス(Raspberry Pi)側の設定は完了です。
サービス側のサンプルはNode.jsで動作します。Azure Cloud Shellで提供されているNode.jsのバージョンはv8.16.0
ですが、v10以上が必要なので、まずはNode.jsをセットアップします。
wget https://nodejs.org/dist/v10.19.0/node-v10.19.0-linux-x64.tar.gz
mkdir ~/node
tar zxf node-v10.19.0-linux-x64.tar.gz -C ~/node/
cd node
ln -s node-v10.19.0-linux-x64 node
echo 'export PATH=~/node/node/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
wget https://github.com/Azure-Samples/azure-iot-samples-node/archive/streams-preview.zip
unzip streams-preview.zip
mv azure-iot-samples-node-streams-preview/iot-hub/Quickstarts ~/
cd ~/Quickstarts/device-streams-service/
npm install azure-iothub@streams-preview
npm install
Node.jsのプログラムは環境変数を参照するようですので、必要な情報を環境変数にセットします。
IOTHUB_CONNECTION_STRING
にサービス側で使用する接続文字列をセットします。
※Azure CLIで取得して設定するように工夫してみました
echo 'export IOTHUB_CONNECTION_STRING="`az iot hub connection-string show --policy-name service --hub-name [IoT Hub名] --output tsv`"'>> ~/.bashrc
echo 'export STREAMING_TARGET_DEVICE=raspberrypi' >> ~/.bashrc
echo 'export PROXY_PORT=2222' >> ~/.bashrc
source ~/.bashrc
これでサービス(Azure Cloud Shell)側の設定は完了です。
準備は整いましたので、実際に接続してみましょう。 デバイス側はもう特に触りませんので、Azure Cloud Shell上で作業します。
cd ~/Quickstarts/device-streams-service/
node proxy.js &
ssh pi@localhost -p 2222
Node.jsのProxyプログラムはフォアグラウンドで動作する仕組みなのでバックグラウンドで動作させます。 localhost(=Azure Cloud Shell)の2222ポートにSSHで接続することで、デバイス側に接続ができます。
Azure Cloud Shellのインスタンスが停止したあとでも、接続
の手順を行うとデバイス側に接続できます。
AzureのAndroidアプリからもこの通り。 これでいつでもどこでもRaspberry Piにアクセスできますね。
https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-device-streams-overview https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-device-streams-proxy-c https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-device-streams-proxy-nodejs
過去にQiitaに投稿した内容のアーカイブです。
やってみると意外と簡単。 パスワード入力が不要になるので、やって見る価値はあるかと。
デフォルトでは鍵認証が有効になっていないので、設定を変更します。
sudo sed -i 's/#PubkeyAuthentication/PubkeyAuthentication/g' /etc/ssh/sshd_config
sudo sed -i 's/#AuthorizedKeysFile/AuthorizedKeysFile/g' /etc/ssh/sshd_config
sudo systemctl restart sshd.service
pi@raspberrypi4:~ $ ssh-keygen -t rsa -b 4096 -C "moritalous"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/pi/.ssh/id_rsa.
Your public key has been saved in /home/pi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxx
The key's randomart image is:
+---[RSA 4096]----+
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
+----[SHA256]-----+
pi@raspberrypi4:~ $
~/.ssh/
にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成されます。
公開鍵の方をauthorized_keysに登録します。
cat .ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ホスト側で作成したid_rsa(秘密鍵)を持ってきます。
私は~/.ssh/raspberrypi4/
の配下(Windowsの場合は%USERPROFILE%\.ssh\raspberrypi4
)に保存しました。
権限変更はmacの場合のみ。Windowsの場合は不要でした。
chmod 600 ~/.ssh/raspberrypi4/id_rsa
macの場合もWindowsの場合も、IdentityFileの指定は同じです。Windowsだからといって%USERPROFILE%
と書いたり、エスケープ文字が\
(円)になったりしません。
Host raspberrypi4.local
HostName raspberrypi4.local
User pi
IdentityFile ~/.ssh/raspberrypi4/id_rsa
Host raspberrypi3.local
HostName raspberrypi3.local
User pi
IdentityFile ~/.ssh/raspberrypi3/id_rsa
これで、パスワードなしでSSH接続できます。
$ ssh [email protected]
Linux raspberrypi4 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Sun Oct 18 16:26:01 2020 from 192.168.0.8
pi@raspberrypi4:~ $
VSCodeのSSH接続の拡張機能(Remote - SSH)を使った場合もパスワード無しで、接続されます。 わーい EC2の接続に必要な鍵もこうやって管理すればいいんですね。
過去にQiitaに投稿した内容のアーカイブです。
2017年に書いたポートの開放することなく、Respberry Piに外からアクセスするの第2弾です。
自宅に設置したRaspberry Piに外出先からアクセスしたいことってありますよね。 でも、そのためだけにルーターのポートを解放するのも、セキュリティが心配。
今回はAWS Systems Manager Session Managerを使う方法をご紹介します。 SSHもVNCもポートの開放も不要ですよ!
公式サイトによると
Session Manager はフルマネージド型 AWS Systems Manager 機能であり、インタラクティブなワンクリックブラウザベースのシェルや AWS CLI を介して Amazon EC2 インスタンス、オンプレミスインスタンス、および仮想マシン (VM) を管理できます。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html
基本的にはEC2へのログインに使うと便利なものですが、実はSystems Managerはオンプレ環境でも使用でき、Session Manager機能もEC2でなくても利用できるのです。
以下、手順を追って説明します。
IAMロールを作成します。
項目 | 内容 |
---|---|
名称 | SSMServiceRole(任意の名前) |
ポリシー | AmazonSSMManagedInstanceCore(AWS 管理ポリシー) |
信頼関係 | ssm.amazonaws.com |
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-service-role.html
Raspberry PiにSSMエージェントをインストールする際に必要なアクティベーションキーを作成します。
マネジメントコンソールのハイブリッドアクティベーション
メニューから作成します。
項目 | 内容 |
---|---|
インスタンス制限 | 1(任意の数) |
IAM ロール | SSMServiceRole(上の手順で作ったもの) |
デフォルトのインスタンス名 | Raspberry Pi(任意の名前) |
作成したあと、画面上にアクティベーションコード
とアクティベーションID
が表示されるのでメモしておきます。
ここはRaspberry Pi上での作業となります。
mkdir /tmp/ssm
sudo curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm/amazon-ssm-agent.deb -o /tmp/ssm/amazon-ssm-agent.deb
sudo dpkg -i /tmp/ssm/amazon-ssm-agent.deb
sudo service amazon-ssm-agent stop
sudo amazon-ssm-agent -register -code "[activation-code]" -id "[activation-id]" -region "ap-northeast-1"
sudo service amazon-ssm-agent restart
[activation-code]
と[activation-id]
は前の手順でメモしたものを使用します。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-install-managed-linux.html
これで設定は完了です。 設置が完了すると、Session ManagerのマネージドインスタンスのところにRaspberry Piが追加されます。
Session Managerのマネージドインスタンスのところでインスタンスを選択し、アクション
-> Start Session
を選択すると、ブラウザ上でターミナルの画面が表示されます。
これ、ブラウザの画面です。すごいですね。su - pi
とすることでpi
ユーザーへの切り替えもできます。
これでいつでもどこでもRaspberry Piと一緒です。 SSHもVNCも不要です。すごいですね。