マンション共有回線環境を乗り越えて自宅PCへアクセスしよう【後編】
前回では、マンション共有回線の自宅 PC へアクセスするための踏み台として VPS を用意しました。その続きになります。
【2021.12.08 追記】
本記事の最終形を番外編として書きました。そちらも併せてみてください。
SSH リモートフォワードによるサービスの公開
「SSH ポートフォワーディングでリモートデスクトップ接続」で利用した SSH のポートフォワーディングは、ローカルフォワード( -L オプション)でした。これは SSH クライアント側に、SSHサーバ側にあるサービスへ転送するためのポートを開き(LISTEN)、その通信を SSH クライアント側から SSH サーバー側にフォワードするというものです。
それに対して、もうひとつリモートフォワード( -R オプション)という機能があります。これはローカルフォワードとは逆に、SSH サーバ側に、SSH クライアント側にあるサービスへ転送するためのポートを開き(LISTEN)、その通信を SSH サーバ側から SSH クラアント側にフォワードするものです。 これを使って、ローカルにあるサービスへ引き込むことができます。
最初に自宅 PC 側のリモートデスクトップサービスを有効化しておきます。やり方は「SSH ポートフォワーディングでリモートデスクトップ接続」に書いています。
次に以下のコマンドで踏み台 VPS に対してリモートフォワードで SSH 接続します。
ssh -R 43389:127.0.0.1:3389 ubuntu@***.***.***.***
この状態で VPS 側でLISTEN ポートを確認してみましょう。別のプロンプトから ssh 接続して “netstat -ant" を実行します。以下のように、ポート 43389 で LISTEN していることがわかります。

ここまでで理屈上は、インターネット上からリモートデスクトップ接続できるようになります。ここまでを図示にすると以下の通りです。事項では、リモート PC と VPS 間もセキュアな接続を行うように

もし VPS に公開したサービスを直接外部から利用できるようにするためには注意が必要です。デフォルトでは、127.0.0.1 つまりローカルホストのみからのアクセスしか許容していないからです。
これを一般公開するためには、sshd の設定を変更する必要があります。具体的には GatewayPorts です。このデフォルト値が “no" であるために、LISTEN がローカルホストのみになっているのです。そこで “/etc/ssh/sshd_config" で “GatewayPorts" を “yes" に設定して sshd を再起動します。ファイルの編集を含め管理者権限が必要なので sudo をつけてください。あと、バックアップと差分確認もお忘れなく。一連のコマンドは以下の通りです。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
sudo vi /etc/ssh/sshd_config
# ...《ファイル編集:GatewayPorts yes》
diff /etc/ssh/sshd_config /etc/ssh/sshd_config.org
sudo /etc/init.d/ssh restart
その上で、再度、リモートフォワードで SSH 接続後に LISTEN ポートを確認してみます。

これで 43389 ポートの LISTEN が全アドレス向け( 0.0.0.0 )になりました。
あと、VPS のファイアウォール設定で、インバウンドで ポート 43389 の許可設定が別途必要です。VPS を提供している業者によって設定方法は違いますが、WebARENA Indigo の場合は「ファイアウォールを設定する(Indigo)」を参照してください。
ただし、事項で説明しますが、今回この VPS の 43389 ポートに直接アクセスすることは行いませんので、ファイアウォールの設定は不要です。
SSH ローカルフォワードでリモートデスクトップ接続
SSH リモートフォワードだけでは、リモート PC と VPS との間がいまひとつセキュアではありません。ここも SSH のローカルフォワードを使って転送すれば、すべて SSH トンネル経由の接続になりますし、sshd_config の設定変更も VPS のファイアウォールの設定も不要になります。図示すると以下のイメージですね。

要領としては 「SSH ポートフォワーディングでリモートデスクトップ接続」と同じです。リモート PC からは以下のように接続します。
ssh -L 55389:127.0.0.1:43389 ubuntu@***.***.***.***
あとは、リモートPC上で、localhost:55389 に対してリモートデスクトップ接続すれば、VPS を経由して自宅PCにつながります。

まとめ
自宅 PC への接続までのおさらい
リモートフォワードもローカルフォワードも SSH トンネルを作ることが目的で実際にその接続でコマンド実行はしませんので、以下のオプションを利用して起動するのがよいと思います。
- -f :バックグランドで実行する
- -n :標準入力からの読み込みを禁止します。
- -N :リモートコマンドを無効にする
これを踏まえておさらいすると、まず外出前に自宅PCで以下を実行しておきます。ショートカットとかを作っておけば便利かと思います。伏字は VPS のグローバルアドレスです。( SSH リモートフォワード接続)
cmd.exe /c start ssh -fnN -R 43389:127.0.0.1:3389 ubuntu@***.***.***.***
次に、外出先のリモートPCをインターネットに接続した状態で以下を実行します。こちらもショートカットイメージです。( SSH ローカルフォワード接続)
cmd.exe /c start ssh -fnN -L 53389:127.0.0.1:43389 ubuntu@***.***.***.***
この状態でリモート PC 上のリモートデスクトップから localhost:53389 へ接続します。これで自宅 PC につながるはずです。
SSH ポートフォワード接続の終了方法
終了方法なんですが、バックグラウンド実行になっているので、強制的するしかありません。自宅PCおよびリモートPCいずれも以下のコマンドですべての SSH 接続を強制終了できます。
taskkill /f /im ssh.exe
実行イメージは以下の通り。SSH 接続が複数あれば一度に切断されますので注意してください。

ただ、これだけでは VPS 側に SSH 接続が残ったままになっちゃうんですよね、、、恐らく ClientAliveInterval あたりの設定ではと思うのですが・・・(力尽きたので調査してません😅)
なので、 VPS に普通に SSH 接続でログインして、以下のコマンドで sshd の掃除を行います。このコマンドを発行するために接続している SSH も切断します。尚、自宅 PC 、リモート PC の両方で前述の taskkill を実行したあとに行ってください。
pgrep sshd | grep -v `cat /run/sshd.pid` | xargs sudo kill -9
再接続後に以下のコマンドで自身の SSH 接続以外がなくなっていれば掃除は完了です。
sudo lsof -i :22 -n

最後に
SSH リモートフォワードについては、似たようなことがローカルフォワードでできることもあり「どこで利用するんだろう」と疑問を持つ方が多いように思いますが、まさに今回の共同回線の自宅 PC へのアクセスのように簡単に外部公開できないような環境へ通信を引き込むために利用するわけですね。(リバースプロキシ 的なイメージでしょうか)
今回、そのために VPS を新たに契約したわけなんですが、そもそもこのブログが利用している「お名前.com」のレンタルサーバを使いたかったのです。この記事の通り SSH 接続もできますし。ですが、ここのレンタルサーバは root を取れないうえに、SSH ポートフォワードは禁止されてるようなのです。これが許可されれば一番安上がりなんですけどね・・・・まあ、そういう経緯で、最安 VPS を探したということなんです。
終了の仕方がどうにもスマートではないので、また良い感じのを見つけたら更新します。
あ、最後に。ほんとうに外出先から接続してみるときは、自宅 PC の電源が自動で切れないようにしておくことは忘れないようにしてくださいね(笑)
【2021.12.08 追記】
サーバ側のプロセスが残ってしまう件、恐らく sshd_config の ClientAliveInterval ではないかと思われます。これがデフォルト値 0 でクライアント側との通信確認は行わない設定だからずっと残るのかな、と。こちらの設定は番外編にも書いてますので併せてごらんください。
ディスカッション
コメント一覧
まだ、コメントがありません