Linux - AutoSSH

着信接続のない環境への接続

定義

KCMサーバー: Keeper Connection Managerを実行するインスタンス。

リモートエンドポイント: KCMサーバーからはまだ直接アクセスできない、データ着信手段のない保護されたネットワーク内のWindowsインスタンス。

KCMサーバーのインストール

Keeper Connection Managerインスタンスを設定していない場合は、任意のクラウド環境内の任意のインスタンスでDocker自動インストールの手順を行います。このサービスがKCMサーバーになります。

リバーストンネルの設定

以下の手順は、クラウドのKCMサーバーからネットワークへの着信手段がない内部リモートエンドポイントへの接続を確立する方法となります。

(1) KCMサーバーのインバウンドSSHを許可

KCMサーバーで、リモートサーバーからKCMインスタンスへのインバウンドSSHポート22接続が解放されていることを確かにします。リバーストンネルを設定するために、リモートサーバーからKCMインスタンスへのアウトバウンド接続を確立します。

(2) リモートエンドポイントでSSH鍵を生成

リモートエンドポイントで、エンドポイントからKCMサーバーへのアウトバウンド接続を確立するために使用するSSH鍵のペアを作成します。

ssh-keygen -t ed25519

これにより、秘密鍵と公開鍵の2つのファイルが作成されます。 秘密鍵はそのままにして、.pubファイルだけをKCMサーバーにコピーします。

ここで、公開鍵ファイルの内容をKCMサーバーディレクトリの特殊なファイルに追加する必要があります。 /.sshディレクトリを確認し、「authorized_keys」という名前のファイルがまだない場合は、このファイルを作成します。 公開鍵ファイルid_ed25519.pubからテキストを抽出して、そのテキストをKCMサーバーの~/.ssh/authorized_keysファイルにコピーします。

テキストは以下の形式となります。

ssh-ed25519 AAAAC3NzaC1lZDI1nScLLwc3wsBH localuser@localhost

authorized_keysファイルを~/.ssh/authorized_keysとして保存します

(3) リモートエンドポイントからKCMサーバーへのSSH接続を確認

これで、パスワードプロンプトなしで (鍵を使用して)、リモートサーバーからKCMサーバーにSSH接続できるようになりました。

$ ssh username@demo.kcmdemo.com

Last login:Mon Jul  4 20:28:10 2022 from ip-10-0-1-7.my.remote
[centos@kcmdemo.com ~]$ exit

(4) リモートエンドポイントにautosshをインストール

Linuxプログラムのautosshは、永続的なSSHトンネルを作成するためのヘルパーユーティリティです。autosshのインストールはプラットフォームによって異なりますが、一般的なインストールコマンドは以下のようになります。

sudo yum install autossh

ソースからビルドするには、以下の手順を行います (Amazon Linux 2 AMIの場合)。

$ sudo yum install gcc
$ wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz
$ tar -xf autossh-1.4e.tgz
$ cd autossh-1.4e
$ ./configure
$ make
$ sudo make install

(5) KCMサーバーでGatewayPorts設定を更新

KKCMサーバーで、SSHプロセス (sshd) を変更して、リモートホスト (guacdのDockerコンテナなど) が転送ポートに接続できるようにする必要があります。デフォルトでは、sshdはリモートポート転送をループバックアドレスにバインドします。GatewayPortsの値を「clientspecified」に設定すると、クライアントは転送されたポートのバインド先のアドレスを選択できます。

  • /etc/ssh/sshd_configファイルを編集します

  • GatewayPorts行を以下のように更新します

GatewayPorts clientspecified
  • sshdを再起動します

sudo service sshd restart

(6) 永続的なリバースSSHトンネルを作成するコマンド

KCMサーバーからリモートサーバーへのSSH接続を確立するには、まずリモートサーバーから開始される永続的なリバーストンネルを作成する必要があります。

リモートエンドポイントで、以下のようなパラメータを使用して、autosshをバックグラウンドで実行します。プライベートSSH鍵へのフルパスが指定されています。これで、autosshがバックグラウンドで実行され、インスタンスが実行されている限り、トンネルはアクティブ状態を維持します。

必要なポート (HTTP/HTTPS/SSH) 以外のすべてのポートでインバウンド接続をブロックするためのファイアウォールを必ず設置してください。また、以下のコマンドの0.0.0.0をKCMサーバーのIPに変更してください。

autossh -f -M 0 -N -o "ServerAliveInterval 30" \
  -o "ServerAliveCountMax 3" \
  -R 0.0.0.0:9000:localhost:22 \
  -i /home/ec2-user/.ssh/id_ed25519 \
  user@kcm.server.xyz

これで、リモートサーバーとKCMサーバー間のリバーストンネルが確立されました。

接続を確認するために、トンネルで定義したポート (この場合、ポート9000) でローカルホストを使用して、KCMサーバーからリモートサーバーへのSSHセッションを確立できるようになりました。

KCMサーバーから、以下のコマンドを使用して接続をテストできます。

ssh -i /path/to/key -p 9000 username@localhost

(7) docker-composeを更新してホストを参照

この手順は、dockerインストールにのみ適用されます。

Dockerインストール環境では、host.docker.internalという特殊なホスト名を使用して、Keeper Connection Managerホストインスタンスへの接続を確立できます。

これを設定するには、以下に示すように、/etc/kcm-setup/docker-compose.ymlファイルのguacdセクションを更新して、「extra_hosts」パラメータを追加します。

    guacd:
        image: keeper/guacd:2
        restart: unless-stopped
        environment:
            ACCEPT_EULA:"Y"
        volumes:
            - "common-storage:/var/lib/guacamole:rw"
        extra_hosts:
            - "host.docker.internal:host-gateway"

Docker環境を更新して、変更を反映させます。

sudo ./kcm-setup.run stop
sudo ./kcm-setup.run upgrade

(8) 目的のリモートサーバーへの接続を作成

リバースSSHトンネルが設定されて、Dockerコンテナがリバーストンネルにアクセスできるようになりましたので、Keeper Connection Managerインターフェースから簡単に接続を作成できるようになりました。

この例では、host.docker.internalのホスト名とポート9000を参照するだけの新しい接続を作成できます。

いつものように、適切な認証パラメータがリモートサーバーの接続に入力されていることを確かにします。この場合、リバースSSHトンネルを確立してリモートサーバーにアクセスしています。

接続を保存し、「My Connections」 (接続) か「Home」 (ホーム) 画面に戻ってから、作成したばかりの接続をクリックして、正常にルーティングされたことを確認します。

さらに接続を作成

リバースSSHトンネリングを使用してさらに接続を確立したい場合は、別のポート(9001、9002など)で手順6を繰り返します。そのうえで、Keeper Connection Manager内で接続を作成する場合は、指定したポート番号でhost.docker.internalを参照します。

参考資料

以下はこの設定に関して役に立つ情報が掲載されているオンライン参考資料となります。

Last updated