マンション共有回線環境を乗り越えて自宅PCへアクセスしよう【番外編】
基本的に前編と後編でうまくいくんですが、リモート 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 の受信ポート(=LISTENポート)を確認するとこんな感じになってます。
sudo netstat -ant -p `cat /run/sshd.pid` | egrep 0.0.0.0:[0-9]+

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

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

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

外出先のリモートPCからの SSH ローカルフォワード接続は、ユーザ sshuser2 、ポート 4022 を使います。
cmd.exe /c start ssh -fnN -p 4022 -L 53389:127.0.0.1:43389 sshuser2@***.***.***.***
こちらのセッションは以下のような状態です。

リモート 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 に変更すれば同じことができます。
理屈上はこれで大丈夫のはず、、、これでしばらく使ってみます。
ディスカッション
コメント一覧
まだ、コメントがありません