おうちサーバーに外出先からアクセスしたい → SSH 逆転送しよう

うちでは、IR リモコンモジュールと Raspberry Pi を使った簡単なサーバーがあります。
ブラウザを介してエアコンを操作できるというものです。
リモコンが不要になるので、どこかへ消えたリモコンを探す必要もありません。
その辺にあるスマートフォンなどを使えば良いだけですからね。

これが外出先からでも使えるようになったら、もっと便利。

そこで、外出先から見られるサーバー(以下、🐠外サバ🐠)を介して家のサーバー(以下、🐟家サバ🐟)へアクセスできるようにしました。
今回は、その方法を簡単に紹介します。

実現方法

SSH のポート転送を使います。

SSH のポート転送でよく使われるのは、ssh ... -L ... とするリモートホストのポートにアクセスできるポートをローカルホストに開けるものだと思います。
今回の話であれば、🐠外サバ🐠からこの機能を使えば nginx を介して🐟家サバ🐟へアクセスできます。

しかし、🐠外サバ🐠は固定 IP アドレスが多いでしょうが、🐟家サバ🐟はそうではありません。
そういう場合、何かの方法で🐟家サバ🐟の IP アドレスを知る必要があり、面倒です。

そこで、逆方向のポート転送を使います。

ssh ... -R ... とするもので、ローカルホストのポートにアクセスできるポートをリモートホストに開けます。

手順

🐠外サバ🐠は sshd が起動していれば何でもかまいませんが、AWS の EC2 サーバーを使って試しています。

SSH ポート転送

🐟家サバ🐟のアプリがポート 8282 を使用、🐠外サバ🐠 example.com ではポート 4141 を使用するものとします。
この場合、↓のようにします。

  • ExitOnForwardFailure 転送失敗時に終了する
  • ServerAliveInterval 30 秒毎に応答確認する
  • -N リモートのコマンドを実行しない (対話シェルを出さない)
  • -R 逆ポート転送設定

これで、🐠外サバ🐠内で 4141 にアクセスすることで🐟家サバ🐟の 8282 にアクセスできるようになります。

ポート転送をサービス化

これでポート転送はできますが、いちいちコマンドを打つのは面倒なので systemd の *.service ファイルを書いてサービス化します。
念のため、何らかの理由でコマンドが終了したら自動で再起動するようにします。
以下の内容を🐟家サバ🐟の /etc/systemd/system/ec2ssh.service に保存します。

  • Restart → コマンドが終了したら自動でリスタートする
  • RestartSec=30 → コマンド終了から 30 秒したらリスタートする

あとは、systemctl --user daemon-reload で ↑の ec2ssh.service を読み込み、systemctl start ec2ssh で開始します。
また、systemctl enable ec2ssh で今後自動で起動するようにもします。

注意

SSH のデフォルト設定では、🐠外サバ🐠の 4141 に外部から直接アクセスはできません。
単純にアクセスできるようにするには、/etc/ssh/ssh_configGatewayPorts の設定を yes にする必要があります。
他にも nginx 越しにアクセスするなどの方法などが考えられます。

他の方法

今回の方法以外でも、AWS Route 53 の API を使うのも良いと思います。
🐟家サバ🐟の IP アドレスが変わる度に、ドメインの A レコードを書き換えるだけです。
私には常時起動している EC2 のサーバがあり、家のネットワーク機器の設定が面倒だったので今回の方法を取りました。

まとめ

スマートホンから家のエアコンを操作できると、帰宅前に冷房をつけたりできます。
帰宅したら家が灼熱地獄だった、ということがなくなり快適です。
逆に、切りわすれたエアコンにも対応できます。
素晴らしいですね。

最後に、SSH とか一切関係ありませんが、↓の体毛にアクセスできることを報告します。

ねこ

Comments are closed, but you can leave a trackback: Trackback URL.