ブログ

中継サーバーを経由してターゲットの装置へSSH接続する方法

at_shinya.matsumoto
2023年3月31日 10時22分

本ブログはLTEや無線LAN等を搭載したArmadilloを経由して、本来直接外部からSSH接続できない装置へ
SSH接続する方法をご説明します。

全体の構成

クライアントから直接SSH接続できない装置Aに対して、中継サーバー(Armadillo)を経由してSSH接続します。
今回はクライアント~中継サーバーへはwifiで接続していますが、LTEを使用する事も可能です。

本ブログでは中継サーバーにArmadillo-IoT G3Lを使用して説明します。
クライアントと中継サーバーの接続はArmadillo-IoT G3Lの無線LANのアクセスポイントを使用します。
アクセスポイント化の設定はこちらを参照下さい。

《注意事項》
 クライアントからLTE経由でArmadillo-IoT G3LやArmadillo-IoT A6E(Cat.1モデル)にアクセスする場合、
 デフォルト設定では外部から直接アクセスが出来ません。製品マニュアルを参考にファイアウォールの
 設定変更を行ってください。

本ブログで実施する事

1.sshのインストール~設定(公開鍵認証)
2.sshの設定
3.1回のコマンドで中継サーバーを通じてターゲットサーバーにsshアクセス

本ブログではsshでログインするユーザーは"test_user"として記載します。
rootでのログインは禁止とします。(後にrootログイン禁止設定をします)

実施手順

1.sshのインストール~設定(公開鍵認証)

まだSSH接続できない為、それぞれ個別にコンソールで下記を準備する。
 ・クライアント:openssh-serverのインストール、鍵の作成
 ・中継サーバー:openssh-serverのインストール、鍵の作成
 ・ターゲットサーバー:openssh-serverのインストール

openssh-serverをインストール
$ apt-get update && apt-get upgrade -y
$ apt-get install openssh-server

鍵作成(本ブログではrsaのみ作成)
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test_user/.ssh/id_rsa):   //Enterを押す
Enter passphrase (empty for no passphrase):        //パスワード入力
Enter same passphrase again:            //パスワード入力
Your identification has been saved in /home/test_user/.ssh/id_rsa.   //作成された秘密鍵
Your public key has been saved in /home/test_user/.ssh/id_rsa.pub.  //作成された公開鍵(後にサーバーに配置する)

この状態で既にパスワード入力でSSHログインは出来る様になっています。
次に作成した公開鍵をサーバーに配置します。

SCPコマンドで公開鍵を鍵情報をサーバーへ渡す(クライアント⇒中継サーバー 10.0.0.1は適宜変更)
パスワードを聞かれる為、中継サーバーのtest_userのパスワードを入力する
$ scp ~/.ssh/id_rsa.pub test_user@10.0.0.1:~/.ssh/authorized_keys

中継サーバーにSSHログインする:パスワード入力(直接中継サーバーへログインでも可)
$ ssh test_user@10.0.0.1

中継サーバーの公開鍵と.sshディレクトリの権限を変更します。
権限はtest_userがread可能な最低限の権限とする
※test_userがファイルアクセス出来ないとPermission deniedで弾かれ、ログイン出来ない

ファイルの権限の変更例(chmodで700/744,600/644等を設定)
$ chmod 700 /home/test_user/.ssh
$ chmod 600 /home/test_user/.ssh/authorized_keys

確認として、現在のtest_user権限で下記をアクセス出来ればOK
(アクセス出来ない場合はsuでroot権限に切り替えて再度変更)
$ cat  /home/test_user/.ssh/authorized_keys

2.sshの設定

鍵の設定が完了したら次はsshdの設定(/etc/ssh/sshd_config)を変更します。

/etc/ssh/sshd_config を変更する(以下は設定例)
$ vi /etc/ssh/sshd_config
<以下変更点のみ>
Port 30022                 //外部からアクセスされることを想定してポートを変更
HostKey /etc/ssh/ssh_host_rsa_key     //ホスト認証における秘密鍵のパス
PermitRootLogin no              //root権限でのログイン禁止
PubkeyAuthentication yes          //公開鍵認証を有効化
AuthorizedKeysFile      .ssh/authorized_keys //公開鍵の保存場所指定
PasswordAuthentication no        //パスワード認証の禁止
PermitEmptyPasswords no        //空パスワードの禁止
ChallengeResponseAuthentication no   //チャレンジ&レスポンス禁止

設定が完了したらsshdを再起動して動作確認します。
ここまでの設定を間違えているとSSH接続が出来なくなります。
その場合は vi /etc/ssh/sshd_config の PasswordAuthentication を yes に変更で
パスワードでログインできるようになる為、再度設定をご確認下さい。

$ su      //rootに切り替え
# systemctl restart sshd
# exit  //rootから抜ける
$ exit  //sshから抜ける

次にクライアントから中継サーバーに公開鍵認証でssh接続できるか確認します。
パスワード不要でログイン出来れば完了です。

sshでログイン(パスワード不要)
$ ssh test_user@10.0.0.1

次に、中継サーバーとターゲットサーバーで上記と同様に公開鍵の配置、sshdの設定を
行います。(同じ手順の為、割愛)

以上で、クライアント⇒中継サーバー⇒ターゲットサーバーと2段階でSSH接続が出来ます。

sshでログイン(パスワード不要) ※IPは適宜変更
$ ssh test_user@10.0.0.1
$ ssh test_user@192.168.3.84

3.1回のコマンドで中継サーバーを通じてターゲットサーバーにsshアクセス

毎回2度ログインする事は面倒である為、1コマンドでSSH接続出来る様にします。
まず、クライアントの公開鍵(~/.ssh/id_rsa.pub)をターゲットサーバーのauthorized_keysに
追加書き込みを行います。

次にクライアント側で下記の設定ファイルを作成します。

$ cat ~/.ssh/config
Host target_server
  HostName 192.168.3.84    //ターゲットサーバーIP
  User test_user      //ターゲットサーバーのtest_user
  IdentityFile ~/.ssh/id_rsa 
  ProxyCommand ssh -W %h:%p -i ~/.ssh/id_rsa -p 30022 test_user@10.0.0.1   //中継サーバー設定

以上で、下記コマンドで一括で接続できるようになります。

ターゲットサーバーにSSH接続
$ ssh target_server

以上で完了となります。