こんにちは、もーすけです。
SSHローカルフォワードを使いこなしてますか?SSHを制するものはインフラを制するとも言われています。最近良く使っているのですが、ローカルポートフォワードでhttps接続をする際に間違えやすいポイントがあるので紹介します。
下記は、以前に書いたSSHのローカルポートフォワードに関する記事です。まず基本的な概念や使い方を知りたい方は書きを参照してください。
1. やりたいこと
今回やりたいことは、httpsでサービスを提供しているサーバへ、SSHローカルポートフォワーディングを使って接続するということです。 該当のサーバへは、ネットワーク上、直接的に接続ができないためにポートフォワーディングを使って接続することをやりたいと考えています。 ポートフォワーディングについてわからないよ、という方は上にはった記事をまずご覧ください。
具体的なユースケースだと、KubernetesやGrafanaのダッシュボード(管理画面)などインターネットにそのまま公開していないが、接続にhttpsを接続に要求しており、SSH越しで接続したいなどがが考えられます。。
このブログでのサンプルとして以下を想定します。
- とあるサブネット内に踏み台のEC2とGrafanaサーバがある。
- 踏み台へはSSH可能で、それ以外からサブネット内に通信することは現状できない。
- Grafanaサーバは
https://grafana.mosuke.local
でSSLでリッスンしている。
2. 行ったこと
対象のGrafanaサーバがhttpsで接続が可能なので、ローカル端末のポート5000(任意のポート)を踏み台サーバを経由してGrafanaサーバの443ポートにフォワードすれば問題ないと考えました。
つまり、下記のようにsshでポートフォワーディング接続をしたあと、ブラウザから接続を試みました。
// 対象のサーバへローカルポートフォワードのため接続する。セッションはそのまま。
$ ssh -L5000:grafana.mosuke.local:443 [email protected]
- ※ec2-fumidai.example.com: 踏み台のEC2のホスト名とする
- ※grafana.mosuke.local: Grafanaサーバのプライベートホスト名とする
これでローカルフォワーディングの設定は終わったので、ブラウザから以下に接続すれば接続できると考えていました。しかし実際は接続することができませんでした。
それはなぜでしょうか?一度立ち止まって考えてみましょう。
http://localhost:5000
3. 何が間違いだったか
正しくは以下のようにhttpsプロトコルで接続をしなければいけません。「https」で接続が必要です。
https://localhost:5000
よく考えればアタリマエのことですよね。
URLのはじめの<http(s)>の部分はプロトコルで最後の<:5000>の部分はポート番号。
httpsは443のポートを一般的に使うが、ポート443がhttpsというわけではありません。
そのため、ポート番号にかかわらず適切なプロトコルでの接続が必要です。リダイレクトしてくれるものならばいいですが、そうではないケースも実際にはありました。
とても基本的なことだが、HTTPとHTTPSだと見落としてしまうこともあるので注意してください。
4. まとめ
非常に単純なことではあるのですが間違えやすいポイントかと思います。ローカルポートフォワードの接続先で443ポートを指定したので感覚的にhttpsにしていると思いがちです。実際に接続するプロトコルがなにか、改めて見直してみるとこういったミスは軽減できるし、非常に重要なことです。
SSHを制するものはインフラを制する。
SSHをより理解したい人はこの本から始めてみましょう。