マンション共有回線環境を乗り越えて自宅PCへアクセスしよう【番外編】

2021年12月9日

基本的に前編後編でうまくいくんですが、リモート PC 側の SSH トンネル(ローカルフォワード)を作り直したり色々としているうちに、リモートデスクトップで接続すると「内部エラー」なるものに出くわしました。原因は、恐らくですが、リモートフォワード接続側の無通信が続いたことによある自動切断だと思います。 どこで切断さされているかわからないのですが、sshd に ClientAliveInterval という機能があるようなので、そちらで対応してみました。ついでに、サーバ側の接続がわかりやすくなるように、リモートフォワード、ローカルフォワードいずれも SSH ユーザ及び、接続先のポートを全部わけてみてます。

最終的な構成

色んな接続が混在するので、サーバ側の SSH セッションがわけわからなくなり、強制切断しようにもどれがどやら、、みたいになったので、以下のように、トンネル作るユーザおよびポートをぜんぶ別々にしてみてます。

最終構成

sshd を複数ポートで起動する

VPS 側の作業です。/etc/ssh/sshd_config の内容を変更します。単純に Port を複数書けば、そのポートで LISTEN してくれるようです。また、冒頭にあった自動切断防止のために、 ClientAliveInterval と ClientAliveCountMax を設定してみます。120秒毎に3回応答確認をする、という設定です。編集後、sshd をリスタートします

sudo vi /etc/ssh/sshd_config
# -------《ファイル編集 ここから》------
Port 22
Port 4022
Port 5022
ClientAliveInterval 120
ClientAliveCountMax 3
# -------《ファイル編集 ここまで》------
sudo /etc/init.d/ssh restart

sshd_config の差分は以下のような感じです。

sshd_config の修正

リスタート後に sshd の受信ポート(=LISTENポート)を確認するとこんな感じになってます。

sudo netstat -ant -p `cat /run/sshd.pid` | egrep 0.0.0.0:[0-9]+
sshd の複数ポート起動

VPS 側のファイアウォール定義も忘れないように。WebARENA Indigo の場合は「ファイアウォールを設定する(Indigo)」にやり方についての記載があります。

こんな感じに定義して、、、

ファイアウォール設定(1)

こんな感じにインスタンスに紐づけます。

ファイアウォール設定(2)

SSH トンネル用ユーザの作成

これも VPS 側の作業です。同じ秘密鍵を使うようにするので、公開鍵情報もすべてコピーしています。

sudo adduser sshuser1
sudo cp -r /home/ubuntu/.ssh /home/sshuser1/
sudo chown -R sshuser1:sshuser1 /home/sshuser1/.ssh

sudo adduser sshuser2
sudo cp -r /home/ubuntu/.ssh /home/sshuser2/
sudo chown -R sshuser2:sshuser2 /home/sshuser2/.ssh

ユーザ作成したら、それぞれの PC から SSH 接続できるかは確認しておいてください。ssh-agent への秘密鍵登録が必要ですが、詳細は前編を参照してください。

ssh sshuser1@***.***.***.***
ssh sshuser2@***.***.***.***

SSH トンネルの作成

自宅PCからの SSH リモートフォワード接続は、ユーザ sshuser1 、ポート 5022 を使います。伏字は、VPS のグローバルアドレスです。

cmd.exe /c start ssh -fnN -p 5022 -R 43389:127.0.0.1:3389 sshuser1@***.***.***.***

こちらのセッションを VPS 側で確認すると以下のような感じです。コマンドは lsof を利用しています。ポートで絞れるのは便利です。

sudo lsof -nPR -i :5022
SSH リモートフォワード

外出先のリモートPCからの SSH ローカルフォワード接続は、ユーザ sshuser2 、ポート 4022 を使います。

cmd.exe /c start ssh -fnN -p 4022 -L 53389:127.0.0.1:43389 sshuser2@***.***.***.***

こちらのセッションは以下のような状態です。

SSH ローカルフォワード

リモート PC 上のリモートデスクトップからの接続は同じです。localhost:53389 へ向かって接続すれば、自宅 PC につながるはずです。このときの VPS 上のセッションは以下の通り。リモートフォワード(sshuser1)と、ローカルフォワード(sshuser2)が、ポート 43389 を経由して、ポート 46378 でつながっているのがわかりますね。

リモートデスクトップ接続

SSH トンネルの終了

ポートを分けたので切断がしやすくなります。リモート PC 側ならば、以下のコマンドを実行すれば、自 PC 内も、VPS 上のプロセスも綺麗に落とせます。 ClientAliveInterval=120 を付けたので、taskkill するだけでも2分すれば VPS 上のセッションもなくなると思います。VPS 上のプロセス強制終了も ssh.exe に直接コマンドを渡して一発でできるようにしてみました。.bat にしても良いですね。

taskkill /f /im ssh.exe
ssh.exe ubuntu@***.***.***.*** "sudo lsof -t -i :4022 | grep -v `cat /run/sshd.pid` | xargs sudo kill -9"

自宅 PC 側は上記のポートを :5022 に変更すれば同じことができます。

理屈上はこれで大丈夫のはず、、、これでしばらく使ってみます。