多段SSH, ポートフォワーディングの方法

SSHの多段接続ポートフォワーディングの動作確認をします。

AWS上のpublicサブネットにEC2(踏み台サーバー)を作成して、
privateサブネットのEC2RDSに接続してみます。

目次

動作確認環境

以下、AWSの構成で動作確認をします。

構成図

public subnetに存在するEC2踏み台サーバーとして利用します。踏み台サーバーは必要なときだけ起動することで、よりセキュリティが高まります。

SSH多段接続の確認

Client → EC2(public) → EC2(private) でSSH接続

ポートフォワーディングの確認

  1. Client → EC2(public) → RDS で通信経路を確立
  2. 通信経路確立時に利用したローカルホスト上のポートにアクセスすることで、RDSに接続

EC2(public)

項目説明
パブリックIPxxx.xxx.xxx.xxx とする
プライベートIP10.0.1.186
SGセキュリティグループA を割り当て
22ポート のインバウンドを許可

EC2(private)

項目説明
プライベートIP10.0.3.236
SGセキュリティグループB を割り当て
22ポート のインバウンドを セキュリティグループA をつけたインスタンスからのみ許可

EC2(public, private共通)

項目説明
OSユーザー名AMIに Amazon Linux 2 を利用しているためユーザー名は ec2-user
キーペア名wakuwaku-ssh-test

RDS(private)

項目説明
SG3306ポート のインバウンドを セキュリティグループA をつけたインスタンスからのみ許可
エンドポイントssh-test-rds.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com とする
DB Userユーザー名: sampleuser
パスワード: samplepass

通常接続
[ Client → EC2(public) ]

SSHコマンドで接続

ssh -i [EC2(public)の鍵] [ユーザー名]@[EC2(public)のアドレス]
$ ssh -i ~/.ssh/wakuwaku-ssh-test.pem ec2-user@xxx.xxx.xxx.xxx
  (省略)
[ec2-user@ip-10-0-1-186 ~]$ 

.ssh/conigを利用

以下設定を記述します。

Host ec2-pub
  HostName       xxx.xxx.xxx.xxx
  User           ec2-user
  IdentityFile   ~/.ssh/wakuwaku-ssh-test.pem

以下のようにアクセスできるようになりました。

$ ssh ec2-pub
  (省略)
[ec2-user@ip-10-0-1-186 ~]$ 

多段接続
[ Client → EC2(public) → EC2(private) ]

SSHコマンドで接続

ssh -i [EC2(public)の鍵] \
-o ProxyCommand='ssh -i [EC2(private)の鍵] [ユーザー名]@[EC2(public)のアドレス] -W %h:%p' \
[ユーザー名]@[EC2(private)のアドレス]
$ ssh -i ~/.ssh/wakuwaku-ssh-test.pem \
> -o ProxyCommand='ssh -i ~/.ssh/wakuwaku-ssh-test.pem ec2-user@xxx.xxx.xxx.xxx -W %h:%p' \
> ec2-user@10.0.3.236
  (省略)
[ec2-user@ip-10-0-3-236 ~]$

.ssh/conigを利用

以下設定を記述します。

Host ec2-pri
  HostName       10.0.3.236
  User           ec2-user
  IdentityFile   ~/.ssh/wakuwaku-ssh-test.pem
  ProxyCommand   ssh ec2-pub -W %h:%p

以下のようにアクセスできるようになりました。

$ ssh ec2-pri
  (省略)
[ec2-user@ip-10-0-3-236 ~]$ 

ポートフォワーディング
[ Client → EC2(public) → RDS ]

SSHコマンドで接続

書式

ssh -fNC \
-L [ローカルホストのポート]:[リモートホスト]:[リモートホストのポート] \
-i [EC2(public)の鍵] \
[ユーザー名]@[EC2(public)のアドレス]
オプション概要
-fバックグラウンドで実行
-N接続先サーバでシェルが起動させない
-C圧縮(compression)を要求
-Lポート転送の設定
mysql -u[DBユーザー名] -p[DBユーザーパスワード]  -h 127.0.0.1 --port=[ローカルホストのポート]

実行例

$ ssh -fNC \
> -L 13306:ssh-test-rds.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 \
> -i ~/.ssh/wakuwaku-ssh-test.pem \
> ec2-user@xxx.xxx.xxx.xxx
$ mysql -usampleuser -psamplepass  -h 127.0.0.1 --port=13306
  (省略)
mysql> 

補足|ネットワーク状況の確認

下記コマンドでネットワークの状態を確認できます。

nc -zv 127.0.0.1 13306
lsof -n -P -p [sshコマンドのプロセスID] | grep -e ESTABLISHED -e LISTEN
よかったらシェアしてね!
目次