macでsshのポートフォーワードを有効にしたときのメモです。
設定
今回の例では下記のサーバが存在するものとします。
-
踏み台サーバ: (bastion)
- global IP: 52.0.0.1
- private IP: 10.0.0.1
- port: 22
- user: ec2-user
- keyfile: bastion-keyfile.pem
-
接続先サーバ: (web)
- private IP: 10.0.0.2
- port: 22
- user: ec2-user
- keyfile: web-keyfile.pem
ポートフォワードを有効にする
ターミナルを一つ開き、下記のコマンドで踏み台サーバに接続する。ここで-Lで指定した10.0.0.1:22
は踏み台サーバのIPとポートを意味し、10022はローカルでフォワードするポート番号です。
ssh -L 10022:10.0.0.2:22 -i ~/.ssh/bastion-keyfile.pem ec2-user@52.0.0.2
以下のようにログインできるので、このまま放置します
Last login: Mon May 3 13:16:07 2021 from example.com
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-0-0-1 ~]$
webサーバにログインするためには、別のターミナルを開き下記のコマンドを実行します。
ssh -i web-keyfile.pem ec2-user@localhost -p 10022
初めて接続するときは、確認が出るのでyes
にします。
The authenticity of host '[localhost]:10022 ([::1]:10022)' can't be established.
ECDSA key fingerprint is SHA256:xxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
その後、webサーバに直接ログインできます。
Warning: Permanently added '[localhost]:10022' (ECDSA) to the list of known hosts.
Last login: Sun May 2 10:54:54 2021 from example.com
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
[ec2-user@ip-10-0-0-2 ~]$
.ssh/configに設定を書く
毎回ポートフォワードのコマンドを実行したくない場合は、~/.ssh/config
に下記の設定をしておくと良いです
Host bastion
User ec2-user
Hostname 52.0.0.1
IdentityFile ~/.ssh/bastion-keyfile.pem
Port 22
Host web
User ec2-user
Hostname 10.0.0.2
IdentityFile ~/.ssh/web-keyfile.pem
Port 22
ProxyCommand ssh -CW %h:%p bastion
これで、ssh bastion
と打つだけで踏み台サーバ経由でwebサーバにログインできます。
sshコマンドの-L
, -C
, -W
オプションの意味
これまでsshコマンドで-L
, -C
, -W
のオプションを使用しましたが、それぞれ下記の意味です。
-L フォーワードする
-C 通信内容をgzipで圧縮して通信量を節約する
-W ホストにフォワーとされる標準入出力をセキュアなチャネルでやり取りする
-L [bind_address:]port:host:hostport
-L [bind_address:]port:remote_socket
-L local_socket:host:hostport
-L local_socket:remote_socket
Specifies that connections to the given TCP port or Unix socket on the local (client) host are to be for-
warded to the given host and port, or Unix socket, on the remote side. This works by allocating a socket
to listen to either a TCP port on the local side, optionally bound to the specified bind_address, or to a
Unix socket. Whenever a connection is made to the local port or socket, the connection is forwarded over
the secure channel, and a connection is made to either host port hostport, or the Unix socket
remote_socket, from the remote machine.
-C
Requests compression of all data (including stdin, stdout, stderr, and data for forwarded X11, TCP and
UNIX-domain connections). The compression algorithm is the same used by gzip(1), and the ``level'' can be
controlled by the CompressionLevel option for protocol version 1. Compression is desirable on modem lines
and other slow connections, but will only slow down things on fast networks. The default value can be set
on a host-by-host basis in the configuration files; see the Compression option.
-W host:port
Requests that standard input and output on the client be forwarded to host on port over the secure channel.
Implies -N, -T, ExitOnForwardFailure and ClearAllForwardings, though these can be overridden in the config-
uration file or using -o command line options.
こちらもおススメ