JINSテックブログ
🎉

遠隔地からVPNを利用せずにRaspberry PiにSSH

に公開

はじめに

この投稿は、2025年JINSのアドベントカレンダー12日目の記事です。

JINS4年生のうちだです。この前AWSのre:Inventに行ってきたのですが、それが人生初の日本国外でした。

NFC出社ロガー

弊社の通勤費は定期代での支給でなく、出社した日数分、事前申請された通勤ルートにかかる費用を支給するようになっております。
リモートと出社を状況に応じて組み合わせて働いている社員が多く、毎度申請をするのが面倒です。
全員分の面倒の総量は膨大です。
その状況を何とかするために、Raspberry PiとNFCリーダーを組み合わせた出社ロガーを開発しました。
そのログを1ヶ月に1回労務に提出することで、全員分の通勤費申請が完了します。

NFC出社ロガーが設置されている場所の写真

ところで。。。。

弊社の業務端末にはCato Cloudが常時接続されており、オフィスネットワークは一般家庭と同様にVPN接続が張られていないため、オフィス外からのアクセスが困難な状況です。

オフィスに出社していない時に、出社ロガーに異常が生じた場合、リモートでメンテナンスをする必要があるので、それを実現できるように検討と実装をする必要がありました。

インターネットからエッジデバイスに接続する方法

インターネットからエッジデバイスに接続する方法は、いくつかの方法が考えられます。
(各セクションにあるMermaidの図はイメージ図です。実際の構成とは異なる場合があります。)

1. VPNソフトウェアを利用する方法

Tailscale

手軽に導入できるものの中では一番イケてるVPNソフトウェアだと思います。
令和最新版!
P2P型なので専用サーバーを用意する必要がありません。もちろん穴あけも不要。
私の業務端末に常時接続のVPNソフトウェアが入っているため、これを入れるとルートテーブル周りの自動生成が競合するので今回は利用に適さないと判断。
プライベート端末ではこれを利用しています。

SoftEther

VPNソフトウェアの重鎮
様々なプロトコルに対応しているので便利です。自宅にもSoftEtherのサーバーがあります。
SoftEtherのTCP/UDPプロトコルでの接続は穴あけ不要で使いやすいですが、最近のルーターでよく利用されるSymmetric NATとは相性が悪いのか不安定なことがあります。

今回はTailscaleと同じ理由で利用に適さないと判断しました。

2. 管理エージェント経由で接続する

AWS Systems Manager(Session Manager)

クラウド内のインスタンスや、オンプレミス環境のサーバー、仮想マシンにインストールすると、そのマシンの情報を色々見れるすごいヤツ。
機能の1つにリモートでそのマシンのシェルにアクセスできる、Session Managerという機能があります。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.html#features
今回はこれを採用します。
他のクラウドサービスにも同様の機能が存在する可能性があります。

3. 番外編

LinuxサーバーにSSHポートフォワード

エッジデバイスからパブリックIPを持つLinuxサーバにSSHポートフォワードし、そのサーバーを踏み台としてエッジデバイスにアクセスする方法。
LinuxサーバーはEC2でもECSでもVPSでも物理サーバーでも何でも良いです。

非常に古くからある基本的な方法であり、IT歴の長い方であれば検討したことがあるかもしれません。
切断時の再接続や自動起動をさせる設定やスクリプトを書くのが面倒なのと、今どきこれ系の用途にパブリックのエンドポイントを用意するのは好ましくないので不採用です。

Raspberry Pi Connect

割と良さげですが、色々社内申請する必要がありそうだったので、今回は利用を断念しました。
プライベートで使ってみたいですね。

Systems ManagerをRaspberry Piに入れる

AWS側でやること

今回は、AWSコンソールから手作業でやります。

  1. AWS Systems Manager > ハイブリットアクティベーション に移動
  2. アクティベーションを作成するボタンを押す
  3. 必要項目を入力する
    ハイブリットアクティベーション
  4. 作成後、Activation CodeActivation IDが表示されるのでメモする
    Activation Code表示画面

ラズパイ側でやること

32bitOSと64bitOSで、エージェントのダウンロードURLが異なるので注意です。

# 1. 作業ディレクトリの作成
mkdir ~/tmp/ssm

# 2. Systems Managerのパッケージをダウンロード
# 64bitOSの場合
curl https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/debian_arm64/amazon-ssm-agent.deb -o ~/tmp/ssm/amazon-ssm-agent.deb
# 32bitOSの場合
curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm/amazon-ssm-agent.deb -o ~/tmp/ssm/amazon-ssm-agent.deb

# 3. インストール
sudo dpkg -i ~/tmp/ssm/amazon-ssm-agent.deb

# 4. アクティベーション
sudo systemctl stop amazon-ssm-agent
sudo -E amazon-ssm-agent -register -code "<Activation Code>" -id "<Activation ID>" -region "ap-northeast-1"
sudo systemctl start amazon-ssm-agent

# 5. エージェントの自動起動の有効化
sudo systemctl enable amazon-ssm-agent

遠隔地に持っていってから悲しむことがないよう、一度再起動してエージェントが自動起動するかの確認をすることをおすすめします。

AWS側から見えるか確認する

正常に登録されていれば、Systems Manager > フリートマネージャー の一覧に、miから始まるノードIDで表示されているはずです。
Systems Managerのフリートマネージャーの画面

これで、Systems Managerにラズパイが登録されました。

インスタンスティアの設定を変更する

オンプレミスのインスタンスにSession Managerで接続するためには、インスタンスティア設定をアドバンスト階層に変更する必要があります。
企業の管理下のアカウントで行う場合、費用影響がありますので、責任者に確認の上実施することを推奨します。

  1. 設定 > インスタンスティアの設定を変更 ボタンを押す
    インスタンスティアの設定を変更する画面に行くボタン

  2. 確認して設定をアドバンスト階層に変更する
    スタンダード階層からアドバンスト階層への変更を確認 画面

接続

AWSコンソール上から接続することができます。
AWSコンソール上からラズパイに接続するボタン
AWSコンソール上のSession Manager

AWS CLIから接続することもできます。

aws ssm start-session --target <mi-********> --region ap-northeast-1 --profile <profile>"

SSHのConfigに書いておくしておくと便利です

# SSH over Session Manager
host raspi-nfc-ssm
  HostName <mi-******>
  User <username>
  # 1. Windowsの場合はこっち
  ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p --profile <profile>"
  # 2. Linux Macの場合はこっち
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile <profile>"

↑の設定をすると以下のように接続できます

ssh raspi-nfc-ssm

接続できましたか?お疲れ様でした!

最後に

弊社はベトナムの店舗に受け取りBOXを置いておりますが、それのメンテナンスを日本からするためにもこの仕組みを利用しています。
自前でVPN等を設定するよりも、圧倒的に少ない設定項目でリモートアクセスを実現できるのでおすすめの方法です。

明日は@kanikanikanikaniさんの「生成AI活用と内なるAI活用」の記事です。

JINSテックブログ
JINSテックブログ

Discussion