「多段SSH接続」のみならず、立ち上げたEC2へのSSH接続自体初めてだったので、備忘録としてまとめておきます。
前提条件が同じ人なら、手順通り進めていけばSSH接続できるはずです。
前提条件
対象読者は私と同じくらいの実力の方としているので、多少説明が冗長なのは「丁寧に解説している」つもりですwwwその点ご了承ください。
ローカルのスペック
- 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サーバー、踏み台サーバー両方にアタッチしている、というところからスタートです。
手順(7ステップ)
秘密鍵をわかりやすい場所に移動
まずは、秘密鍵をローカルの~/.ssh/ディレクトリへ移動。
[以下ローカルのterminal]
~/.ssh/configを編集(山場)
これによって、ローカルから$ ssh websvと入力するだけで接続できるようにするconfig(=設定)です。
$ 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接続するときに何度も使用する名前なので、わかりやすくて短い名前が良いと思います。今回はwebsvにしました。(次の行のHostNameとの違いが紛らわしいですが、違う役割なので注意してください。)
- 注2:こちらのHostNameにはIPアドレス(名前解決しているならその限りではない)を設定します。グローバルIPではなく、プライベートIPが良いようです。今回はそもそもプライベートサブネットにあるためグローバルIPがないので大丈夫でしたが、そこで詰まる方もいるようですので念の為。
- 注3:SSH接続するならポート番号は22と相場が決まっているようです。好きな選手の背番号とか入力してはいけません。がんばれ!!タブチくん!!ファンなら問題ないかもですね。話がそれましたね。
- 注4:ローカルに保存した秘密鍵のパスを指定してあげます。これが一致していないため接続できないこともあるあるみたいです。
- 注5:「デフォルトのユーザー名は、インスタンスの起動時に指定した AMI によって決まります。」(AWS公式ドキュメントより)とりあえずec2-userにしとけばいいんでしょ?とか思っていたらOSの種類によっては接続できないので注意してください。
- 注6:ローカルからwebサーバへ、一見直接アクセスできるようになるのは、このProxyCommandが自動的に実行されるためです。今回”bssv”と記載した部分は、必ず踏み台サーバーのホスト名と一致させてください。
- 注7:こちらはグローバルIPである必要があります。(インターネット経由でアクセスするわけですから。)しかも、自動的に割り当てられるグローバルIPだと、接続する度に変わる可能性があるため、Elastic IPアドレス(固定IPアドレス)が推奨されています。ec2にアタッチしていれば料金はかかりませんし。
ただ、これだけでは接続できません。これから許可設定をしていきます。
編集したconfigファイルの読み書き権限を許可
まずはconfigファイルに読み書き権限を付与。
$ chmod 600 ~/.ssh/config
600(= “-rw——“)が、所有者(=自分)に、読み書きの権限を与えることを表現しています。詳細についてはこちらが網羅性がありわかりやすかったです:【一通り理解】Linuxパーミッションの基本とその設定方法
これで、踏み台サーバーには入れるはずです。
踏み台サーバーにSSH接続
踏み台サーバでも設定があるので、テストの意味も込めて、接続します。
$ ssh bssv
[以下、踏み台サーバー]
tcpフォワーディングの許可
ec2はデフォルトでtcpフォワーディングが許可されていないようなので、これを許可します。
$ sudo cp /etc/ssh/sshd_config{,.bak}
$ sudo nano /etc/ssh/sshd_config
→「#AllowTcpForwarding yes」の"#"を削除
最初にバックアップをとって、その後、sshd_configを編集しています。
デフォルトで「#AllowTcpForwarding yes」と書いてある場所があるはずですので、そこを探し、コメントアウト”#”を外して
AllowTcpForwarding yes
とすればOKです。
また、管理者権限が必要だったので、sudoをつけています。
sshd再起動
最後に、
$ sudo service sshd restart
とsshdを再起動したら設定完了です!
ローカルからwebサーバーにSSH接続(完)
まだ踏み台サーバーいるかと思いますので、Control + dでログアウトしてローカルのterminalに戻ります。
[以下再度ローカルのterminal]
さあ、接続してみましょう。
$ ssh websv
おめでとうございます!
詰まったら
とりあえずエラー文で検索!で出てきますよ〜
私も参考文献のサイトのとおりやって、詰まったらググって、とやってたどり着きましたので。(何を参考にしたのか見ていったら、どこで詰まったのかわかってしまうかもですね笑)
基礎がおろそかな状態でそんなことやってたらとても時間がかかったので、この記事が同じような誰かの役に立てば幸いです。
また、他のプロトコル、例えば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からの画像
コメント