「多段SSH接続」のみならず、立ち上げたEC2へのSSH接続自体初めてだったので、備忘録としてまとめておきます。
前提条件が同じ人なら、手順通り進めていけばSSH接続できるはずです。
環境など前提条件
対象読者
対象読者は、あまりSSH接続したことのない、私と同じくらいの実力の方としています。
したがって、多少説明が冗長なのは「丁寧に解説している」つもりです。笑
その点ご了承ください。
そもそも、CUIやLinuxに触るのに慣れていない、という方は、基本的なことをおさえるために、こちらの記事も合わせてチェックしてみてください。
環境
ローカルのスペック
- macOS Catalina バージョン10.15.7
- 当然、インターネットに繋がっています
踏み台サーバーのスペック
- AWS上のEC2インスタンス
- AMI : Amazon Linux 2 AMI (HVM), SSD Volume Type x86
- パブリックなサブネットに配置
- セキュリティーグループのインバウンドで、ローカルのIPアドレスを許可済。
- Elastic IPアドレス(固定IPアドレス)を取得、アタッチ済。
アクセスしたいwebサーバーのスペック
- AWS上のEC2インスタンス
- AMI : Ubuntu Server 20.04 LTS (HVM), SSD Volume Type x86
- プライベートなサブネットに配置
- セキュリティーグループのインバウンドで、踏み台サーバーにアタッチしたセキュリティーグループからのアクセスを許可済。
また、下記作業を実施済みのところからスタートです。
- 各EC2は立ち上げて実行中
- AWSマネジメントコンソールから「キーペア」を作成し、秘密鍵をダウンロード済
- 上記キーペアをwebサーバー、踏み台サーバーの両方にアタッチしている(どちらも同じキーペアを使用)
では、接続方法を見ていきましょう!
もし、ただ踏み台サーバーのみにシンプルなSSH接続をするなら
ちなみに、多段SSHではなく、シンプルに踏み台サーバーに接続したいだけなら、下記3ステップでOKです。
[ローカルのterminal]
1. まず秘密鍵を移動
$ mv ~/xxxxxx.pem ~/.ssh
2. 秘密鍵に読み書き権限を付与
$ sudo chmod 0600 ~/.ssh/xxxxxx.pem
3. その秘密鍵を使ってSSH接続
$ ssh -i ~/.ssh/xxxxxx.pem ec2-user@[踏み台サーバーのグローバルIPアドレス(EIP)]
ec2-userのところは、接続するEC2のOSによって適宜変えてください。(AWS公式ドキュメントを参照方)
踏み台サーバーを経由してwebサーバーへSSH接続(多段SSH接続)する手順(7ステップ)
1.秘密鍵をわかりやすい場所に移動
まずは、秘密鍵をローカルの「~/.ssh」ディレクトリへ移動。cdで秘密鍵を保存した場所へ行き、mvコマンドを使いましょう。
[ローカルのterminal]
$ mv ~/xxxxxx.pem ~/.ssh
2.~/.ssh/configを編集(山場)
これによって、ローカルから$ ssh websvと入力するだけで接続できるようにするconfig(=設定)です。
[ローカルのterminal]
$ nano ~/.ssh/config
# Web-server # これでコメントできます
Host websv # 注1
HostName [webサーバーのプライベートIPアドレス] # 注2
Port 22 # 注3
IdentityFile ~/.ssh/[秘密鍵のファイル名] # 注4
User ubuntu # 注5
ProxyCommand ssh -W %h:%p bssv # 注6
# Bastion-server
Host bssv
HostName [踏み台サーバーのグローバルIPアドレス(EIP)] # 注7
Port 22
IdentityFile ~/.ssh/[秘密鍵のファイル名]
User ec2-user
これを設定しておけば、わざわざ踏み台サーバーに入ってからwebサーバーに入る、という手順を手動でやる必要がなくなります。秘密鍵を踏み台サーバーにコピーする必要もないのでオススメです。(踏み台サーバとwebサーバで同じキーペアを使っている場合に限ります。)
ここが山場です。全ての行にきちんと意味がありますので、出来るだけ理解して、細心の注意を払って編集しましょう。私みたいにとりあえずコピペしてトライアンドエラーで直していっても良いですが、下記ポイントを押さえておくだけでその回数がだいぶ減るかと思います。
- 注1:「Host ◯◯」の◯◯は、ホストのエイリアス名とでも言いましょうか、つまりサーバーのあだ名(呼び名)です。自由に決めて構いません。実際にSSH接続するときに何度も使用する名前なので、わかりやすくて短い名前が良いと思います。今回は”Web-server”の略でwebsvにしました。ホストについて詳しくはこちら:ホストとは?
- 注2:こちらの「HostName」に本当のホスト名、つまりIPアドレス(名前解決しているならそちらでも可)を入力します。グローバルIPではなく、プライベートIPが良いようです。今回はそもそもプライベートサブネットにあるためグローバルIPがないので大丈夫でしたが、そこで詰まる方もいるようですので念の為。
- 注3:SSH接続するならポート番号は22と相場が決まっているようです。好きな野球選手の背番号とか入力してはいけません。がんばれ!!タブチくん!!ファンなら問題ないかもですね。話がそれましたね。
- 注4:ローカルに保存した秘密鍵のパスを指定してあげます。これが一致していないため接続できないこともあるあるみたいです。
- 注5:「デフォルトのユーザー名は、インスタンスの起動時に指定した AMI によって決まります。」(AWS公式ドキュメントより)とりあえずec2-userにしとけばいいんでしょ?とか思っていたらOSの種類によっては接続できないので注意してください。
- 注6:ローカルからwebサーバへ、一見直接アクセスできるようになるのは、このProxyCommandが自動的に実行されるためです。今回”bssv”と記載した部分は、必ず踏み台サーバーのホスト名(あだ名の方)と一致させてください。
- 注7:踏み台のHostNameはグローバルIPである必要があります。(インターネット経由でアクセスするわけですから。)しかも、自動的に割り当てられるグローバルIPだと、接続する度に変わる可能性があるため、Elastic IPアドレス(固定IPアドレス)が推奨されています。ec2にアタッチしていれば料金はかかりませんし。
以上、これらが正しく入力できたら、設定自体はOKです!
ただ、これだけでは接続できません。この設定が終わったら、あと
- configファイルの読み書き権限
- tcpフォワーディング
の許可設定が必要ですので、これからやっていきましょう。
3.編集したconfigファイルの読み書き権限を許可
まずはconfigファイルに読み書き権限を付与。
[ローカルのterminal]
$ chmod 600 ~/.ssh/config
600(= “-rw——“)が、所有者(=自分)に、読み書きの権限を与えることを表現しています。この権限の詳細についてはこちらが網羅性がありわかりやすかったです:【一通り理解】Linuxパーミッションの基本とその設定方法
これで、configファイルが有効になりました。この時点で、踏み台サーバーには既に入れるようになっているはずです。
4.踏み台サーバーにSSH接続
tcpフォワーディングの許可は踏み台サーバーで設定する必要があるので、テストも兼ねて、踏み台サーバーに接続しましょう。
[ローカルのterminal]
$ ssh bssv
[以下、踏み台サーバー]
5.tcpフォワーディングの許可
ec2はデフォルトでtcpフォワーディングが許可されていないようなので、これを許可します。
[踏み台サーバー]
$ sudo cp /etc/ssh/sshd_config{,.bak}
$ sudo nano /etc/ssh/sshd_config
→「#AllowTcpForwarding yes」の"#"を削除
最初にバックアップをとって、その後、sshd_configを編集しています。(管理者権限が必要だったので、sudoをつけています。sudoが効かない場合はこれ試してみて:AWS CLIで”bash: sudo: command not found”が出てsudo出来ない時の意外な対処法)
デフォルトで「#AllowTcpForwarding yes」と書いてある場所があるはずですので、そこを探し、コメントアウト”#”を外して
AllowTcpForwarding yes
とすればOKです。
6.sshd再起動
sshd再起動しないと権限を許可した変更が反映されないケースがあるようなので、最後に、
[踏み台サーバー]
$ sudo service sshd restart
とsshdを再起動したら設定完了です!
7.ローカルからwebサーバーにSSH接続(完)
まだ踏み台サーバーいるかと思いますので、Control + dでログアウトしてローカルのterminalに戻ります。
[以下再度ローカルのterminal]
さあ、接続してみましょう。
[ローカルのterminal]
$ ssh websv
おめでとうございます!
詰まったら
とりあえずエラー文で検索!で出てきますよ〜
私も参考文献のサイトのとおりやって、詰まったらググって、とやってたどり着きましたので。(何を参考にしたのか見ていったら、どこで詰まったのかわかってしまうかもですね笑)
エラーの解決手順について基本が知りたい方は、下記も参照してみてください。
基礎がおろそかな状態でそんなことやってたらとても時間がかかったので、この記事が同じような誰かの役に立てば幸いです。
また、SSH接続ではなく他のプロトコル、例えばHTTP接続をする必要がある場合は、またひと作業必要ですので、その点ご留意ください。タイムゾーンの設定とか盲点でした。
参考文献
本文中で直接紹介したなかったサイト一覧です。
大変、助けになりました。この場をお借りして御礼申し上げます!ありがとうございました!
- SSH多段接続の基本形:https://sig9.hatenablog.com/entry/2016/07/05/230000
- ec2へのSSH接続の基本形:https://qiita.com/nakm/items/695e41d8e71d0d281ac4
- AllowTcpForwarding yesの設定:https://qiita.com/kenji-toforone/items/2f2e9ad5a460f9f8aedf
- 設定変更にはsudoが必要:https://www.digitalocean.com/community/tutorials/how-to-use-ssh-to-connect-to-a-remote-server-ja
- ec2のデフォルトUser名はOSによって異なる!:https://hacknote.jp/archives/51014/
最後まで読んでくださって、ありがとうございました!
画像提供:Bethany DrouinによるPixabayからの画像
コメント