[OCI] SSHポートフォワーディングしてみた

# はじめに

以前、Oracle Cloud(OCI)で踏み台サーバーやNATゲートウェイの設定や動作を確認しましたが、今回はその環境をベースにポートフォワーディングで、プライベート・サブネットのwebサーバーへの接続を試みます。

[[OCI] 踏み台サーバーからSSHでプライベート・サブネットのインスタンスへの接続と、NATゲートウェイを試してみる](https://qiita.com/cocotaro0202/items/7b115b108bb9f03b90a6)



## お試し環境

ポートフォワーディングはOpenSSHの機能で、SSHセッションの中で他のTCPセッションをトンネリングして通過させることができます。ポートフォワーディングすることで、暗号化されてない通信をSSHを通して安全に通信できたり、プライベート・サブネットにあるWebサーバーやデータベースに接続することが可能です。

下図はポートフォワーディングにより踏み台サーバーを経由してプライベート・サブネットのwebサーバーに接続するための構成です。

![image-20210401154059004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/cbacf32a-176c-4d5d-376c-36310e2c55bf.png)
ポートフォワーディングは多段の構成で使うので各構成要素を、ローカル、リモート、ターゲットと定義しました。それぞれが何に該当するかを頭の中で整理できていると、設定の際に混乱が生じにくいかと思います。

## 前提と準備

- ポートフォワーディングは３種類ありますが、本稿では1, 3を取り上げます。

  1. **ローカル・ポートフォワーディング**
  2. リモート・ポートフォワーディング
  3. **ダイナミック・ポートフォワーディング**        

- 呼称
  - 上記 ポートフォワーディングの設定時に、以下の呼称を使います。

| 呼称 | 図中の表記 | 備考 |
|:--|:--|:--|
|ローカル|My Laptop|wndows10 <br>PowerShell, ブラウザ(Firefox)を使用|
|リモート|踏み台サーバー(bastion01)<br>パブリックIP: 168.138.xxx.xxx|Oracle Linux 7<br>パブリック・サブネットの仮想サーバー|
|ターゲット|webサーバー(private-web01)<br>プライベートIP: 192.168.100.3 |Oracle Linux 7<br>プライベート・サブネットの仮想サーバー<br>nginx セットアップ済み(ポート80)|

- ターゲットについて
  - nginx インストール/設定/起動 確認済み
  - プライベート・サブネットのセキュリティ・リストで イングレス・ルール/エグレス・ルールは設定済み
- リモートについて
  - /etc/ssh/sshd_config  以下の設定済み
    - AllowTcpForwarding 　**yes**
- 疎通テスト

  - リモートからターゲットへのSSH接続(認証)は確認済み
     - [[OCI] 踏み台サーバーからSSHでプライベート・サブネットのインスタンスへの接続と、NATゲートウェイを試してみる](https://qiita.com/cocotaro0202/items/7b115b108bb9f03b90a6)

  - リモートからターゲットへの接続は確認済み
     - リモートから curl http://192.168.100.3:80 発行で、ターゲットのindex.html を表示済み。



# ローカル・ポートフォワーディング

SSHクライアントからリモートへSSH 22ポートを使いトンネリングを行います。ターゲットとなるwebサーバーへのリクエストはリモートのsshd を介してターゲットへ転送されます。



ローカル・ポートフォワーディングは次の書式でおこないます。ローカルのポートは 8081 を使ってみます。

```
ssh -L 8081:ターゲット:80 リモート
```

※ 8081の前にローカルのIPアドレスを記述しますが、省略した場合には **localhost**  が指定されたとみなされます。

例）

```
ssh -L 8081:192.168.100.3:80 opc@168.138.XXX.XXX
```



## ローカル・ポートフォワーディング有効化

PowerShell から上述のsshコマンドを実行します。
![image-20210330143925017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/2547b22a-119b-d1c4-f325-45d2aeca5390.png)
ssh コマンドは正常に実行されポートフォワーディングが有効になりました。



## 動作確認

続いて、ローカルのwebブラウザで **localhost:8081** ポートでリクエストを発行します。

ターゲットのwebサーバーの初期ページが表示されローカル・ポートフォワーディングの正常動作が確認できました。
![image-20210330170843412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/0e925501-eff1-2ea0-52f4-93d580e16271.png)

# ダイナミック・ポートフォワーディング

ダイナミック・ポートフォワーディングは、リモートのsshdがSOCKSプロキシとして振舞います。SOCKSプロキシに対応しているアプリケーションを使いターゲットのIPアドレスやポートを指定して実行します。



ダイナミックフォワーディングは次の書式でおこないます。ローカルのポートは 9999 を使ってみます。

```
ssh -D 9999 リモート
```

※ 9999の前にローカルのIPアドレスを記述しますが、省略した場合には **localhost**  が指定されたとみなされます。

例）

```
ssh -D 9999 opc@168.138.XXX.XXX
```



## アプリケーション(Firefox)の設定

Socks 対応のアプリケーションとしてFirefox（webブラウザ） を使用します。

※ その他のアプリケーションの対応については巻末の参考URLをご覧ください。

Firefox の [オプション]-[ネットワーク設定]-[接続設定] からインターネット接続画面を表示

**手動でプロキシーを設定する** を選択し **SOCKSホスト**の設定(黄色の部分)をします。
![image-20210330173616834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/7ccbaa21-96bb-9926-dc1a-5daa6555d461.png)

## ダイナミック・ポートフォワーディングの有効化

PowerShell から上述のsshコマンドを実行します。
![image-20210330172959383.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/89e53199-f727-b77e-319b-380c783e49cb.png)
ssh コマンドは正常に実行されポートフォワーディングが有効になりました。



## 動作確認

**ローカル・ポートフォワーディング(リモート・ポートフォワーディングも含め)と異なり、ターゲットはFirefoxで指定します。** Firefox の URL に**ターゲットのIPアドレスとポート**を指定します。
![image-20210330173906992.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/64d5e757-c0b0-311e-b1e9-2779278c3432.png)

ターゲットのwebサーバーの初期ページが表示されダイナミック・ポートフォワーディングの正常動作が確認できました。
![image-20210330174113342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/5d041080-1861-f554-34ab-492d2e9b09bb.png)

### 参考) トラブルシューティング
うまく動作しない場合には、前述の **前提と準備** に記載の設定項目や、疎通テストが成功するかをチェックしてみてください。

# 参考URL

[sshポートフォワーディング](https://qiita.com/mechamogera/items/b1bb9130273deb9426f5)

[ダイナミックポートフォワーディング](https://blog.icttoracon.net/2020/02/21/%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%EF%BC%88socks%E3%83%97%E3%83%AD%E3%82%AD/)

[OpenSSH[実践]入門](https://www.amazon.co.jp/OpenSSH%EF%BC%BB%E5%AE%9F%E8%B7%B5%EF%BC%BD%E5%85%A5%E9%96%80-Software-Design-plus-%E5%B7%9D%E6%9C%AC%E5%AE%89%E6%AD%A6-ebook/dp/B00P7SKB40)