# Linux - AutoSSH

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2F6WJfW1YkzJ1CnbRiM98r%2Fimage.png?alt=media&#x26;token=32ed6f6a-8188-42e7-bac4-1df54ea9e301" alt=""><figcaption></figcaption></figure>

## 定義

**KCMサーバー:** Keeperコネクションマネージャーを実行するインスタンス。

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

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

Keeperコネクションマネージャーインスタンスを設定していない場合は、任意のクラウド環境内の任意のインスタンスで[Docker自動インストール](/keeper-connection-manager/jp/installation/auto-docker-install.md)の手順を行います。このサービスが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がバックグラウンドで実行され、インスタンスが実行されている限り、トンネルはアクティブ状態を維持します。

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

```
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を更新してホストを参照

{% hint style="info" %}
この手順は、dockerインストールにのみ適用されます。
{% endhint %}

Dockerインストール環境では、**host.docker.internal**という特殊なホスト名を使用して、Keeperコネクションマネージャーホストインスタンスへの接続を確立できます。

これを設定するには、以下に示すように、`/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コネクションマネージャーインターフェースから簡単に接続を作成できるようになりました。

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

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2FOZn4TiuAfWlwG4HmOjUT%2Fimage.png?alt=media&#x26;token=37891bc4-e69a-432f-bc10-c612c6f0e234" alt=""><figcaption><p>リバースSSHトンネルを使用した接続の作成</p></figcaption></figure>

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

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

### さらに接続を作成

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

### 参考資料

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

{% embed url="<https://www.everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh/>" %}

{% embed url="<https://superuser.com/questions/588591/how-to-make-an-ssh-tunnel-publicly-accessible>" %}

{% embed url="<https://serverfault.com/questions/379344/selecting-interface-for-ssh-port-forwarding>" %}

{% embed url="<https://medium.com/@TimvanBaarsen/how-to-connect-to-the-docker-host-from-inside-a-docker-container-112b4c71bc66>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.keeper.io/keeper-connection-manager/jp/supported-protocols/persistent-reverse-ssh-tunnel/connecting-via-reverse-ssh-tunnel-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
