前回の投稿では、SSHキージェネレーション(Key Generation)を通して、安全なSSH接続の準備を整えました。

前回の投稿を見る : SSH keygen: 初心者のための完全ガイド

これから実際にSSHを使用してリモートサーバーに接続する方法を学びます。SSHコマンドは思ったより簡単ですが、いくつかの原則や便利なオプションを知っておけば、さらに効率的に使えます。


SSHコマンド、どのように書けばよいでしょうか?

SSHコマンドの基本形式は以下の通りです。

ssh [オプション] [ユーザー名]@[ホストアドレス] [コマンド]

それぞれの要素が何を意味するのか詳しく見ていきましょう。

  1. ssh: SSHクライアントを実行するコマンドです。

  2. [オプション]: SSH接続方法を制御するさまざまなオプションを指定できます。例えば、特定のキーファイルを使用したり、ポートフォワーディングを設定したりする機能があります。 (後ほど詳しく扱います。)

  3. [ユーザー名]: 接続したいリモートサーバーのユーザーアカウント名です。もしローカルコンピュータのユーザー名とリモートサーバーのユーザー名が同じであれば、省略できます。

  4. [ホストアドレス]: 接続したいリモートサーバーのIPアドレスまたはドメイン名です。

  5. [コマンド] (オプション): SSH接続後、リモートサーバーで即実行したいコマンドがあればここに入力します。このコマンドが実行された後、SSHセッションは終了します。この部分を省略すると、サーバーにログインして対話型シェル(Shell)を使用できます。

コマンド記述の原則と覚えやすいヒント

SSHコマンドは「どのユーザーがどのサーバーに接続するのか?」を明確に示す構造です。

  • 基本原則: ssh ユーザー名@ホストアドレス

    • 例: ssh ubuntu@192.168.1.100(192.168.1.100サーバーのubuntuアカウントに接続)
    • 例: ssh root@mywebserver.com( https://www.google.com/search?q=mywebserver.com サーバーのrootアカウントに接続)
    • 覚えやすいヒント:

    • 「私はローカルユーザーで、あそこ(リモートサーバー)にいる誰か(リモートユーザー)に入る!」と考えてみてください。

    • ssh(私は接続する)[ユーザー名]@(誰として)[ホストアドレス](どこに)
    • よく接続するサーバーは~/.ssh/configファイルを活用すると、毎回長いアドレスを入力する必要なく別名(Alias)を使って便利に接続できます。 (この部分は次の投稿でさらに詳しく取り扱います!)

便利なSSHオプションの解剖

SSHはさまざまな状況に応じて強力な機能を持ついくつかのオプションを提供しています。いくつかの主要なオプションを紹介します。

SSH妖精がオプションを案内する場面

1. -i <IdentityFile>:特定の秘密鍵ファイルを指定

複数のSSHキーを持っている場合、特定のサーバーに接続するために特定の秘密鍵を使用したい場合に使用します。基本的には~/.ssh/id_rsa~/.ssh/id_ed25519を使用しますが、他の名前で作成したり、複数のキーを管理する際に便利です。

  • 使用法: ssh -i ~/.ssh/my_custom_key ubuntu@my_server.com
  • 例:

ssh -i ~/.ssh/id_ed25519_my_server ubuntu@example.com
    Enter passphrase for key '/home/youruser/.ssh/id_ed25519_my_server': 

2. -p <Port>:リモートサーバーのSSHポートを指定

ほとんどのSSHサーバーは基本的に22番ポートを使用します。しかし、セキュリティ上の理由から管理者がSSHポートを変更していることがよくあります。その場合は-pオプションを使用して変更されたポート番号を指定する必要があります。

  • 使用法: ssh -p 2222 your_user@your_server.com(2222番ポートに接続)
  • 例:

    ssh -p 2222 myuser@192.168.1.100
    	The authenticity of host '192.168.1.100:2222 (...)' can't be established.
    	Are you sure you want to continue connecting (yes1/no/[fingerprint])? yes
    	Warning: Permanently added '192.168.1.100:2222' (ED25519) to the list of known hosts.
    	Last login: Mon Jun 17 10:00:00 2024 from your_ip
    	myuser@server:~ $

     

3. -X:X11フォワーディングを有効にする(グラフィックプログラムを実行)

リモートサーバーにGUI(Graphical User Interface)アプリケーションがインストールされており、それをローカルコンピュータの画面に表示させて使用したい場合に使用します。X Window Systemを使用し、ローカルシステムにXサーバーが実行中である必要があります(macOSはXQuartz、WindowsはPuTTY + VcXsrvなどが必要です)。

  • 使用法: ssh -X your_user@your_server.com
  • 例:

        ssh -X myuser@remote-gui-server.com
        myuser@remote-gui-server:~ $ firefox &

    接続後、リモートサーバーでfirefoxを実行(ローカル画面にfirefoxウィンドウが表示される)。
    性能が良くない場合やネットワーク遅延がひどい場合は不便になることがあります。

4. -L <LocalPort>:<RemoteHost>:<RemotePort>:ローカルポートフォワーディング(Local Port Forwarding)

ローカルコンピュータの特定のポート(LocalPort)に入ってくる接続をSSHトンネルを通じてリモートサーバー(RemoteHost)の特定のポート(RemotePort)に転送する機能です。主にファイアウォールの背後にあるサービスに接続したり、ローカルで開発したアプリケーションがリモートデータベースに接続する必要がある場合に便利です。

  • 使用法: ssh -L 8080:localhost:80 your_user@your_server.com
    • このコマンドはローカルコンピュータの8080番ポートに入るすべての接続をyour_server.comを経由してyour_server.com内部の80番ポート(localhost:80your_server.com自体を意味します)に転送します。
  • 例:

    • リモートサーバーのウェブサーバー(80番ポート)に直接接続できず、SSHのみ可能な場合:

       ssh -L 8080:localhost:80 myuser@my_web_server.com

        このコマンドを実行した後、ローカルウェブブラウザで http://localhost:8080 に接続すると、
        実際には my_web_server.com の80番ポートに接続するのと同じ効果になります。

    • ローカルでmy_db_appがリモートdb_server.internalの3306番MySQLポートに接続する必要があるが、db_server.internalmy_app_server.comからのみ接続可能な場合:

      ssh -L 3307:db_server.internal:3306 myuser@my_app_server.com

            このコマンドを実行した後、ローカルで my_db_app が localhost:3307 に接続すると、
            my_app_server.com を経由して db_server.internal の3306番ポートに接続します。

      • (3307を使用する理由は、ローカルにすでに3306ポートを使用しているMySQLがある可能性があるためです。)

5. -N:リモートコマンドの実行なしにポートフォワーディングのみ維持

-Lまたは-D(Dynamic Port Forwarding, SOCKSプロキシ)オプションとともに使用され、SSHセッションを開きますが、リモートサーバーでシェルコマンドを実行せず、単にポートフォワーディング機能のみを維持します。主にバックグラウンドでポートフォワーディングトンネルを維持する際に便利です。

  • 使用法: ssh -N -L 8080:localhost:80 your_user@your_server.com
  • 例:

    ssh -N -L 8080:localhost:80 myuser@my_web_server.com &

        バックグラウンド(&)でポートフォワーディングトンネルを開いたままにし、ローカルで web ブラウザにアクセス可能

6. -f:SSHセッションをバックグラウンドに切り替え

SSH接続が成功した後、SSHクライアントプロセスをバックグラウンドに送るオプションです。主に-Nオプションとともに使われ、ポートフォワーディングトンネルをバックグラウンドで維持するために使用します。

  • 使用法: ssh -f -N -L 8080:localhost:80 your_user@your_server.com
  • 例:

    ssh -f -N -L 8080:localhost:80 myuser@my_web_server.com

        このコマンドを実行すると、すぐにターミナル制御が戻り、SSHトンネルがバックグラウンドで実行されます。
        ps aux | grep ssh コマンドでプロセス確認可能


まとめ

今回はSSHコマンドの基本的な構造とともに、よく使用される重要なオプションを見てきました。特に-pを使用したポート指定と-Lを使用したポートフォワーディングは実務で非常に頻繁に活用されるので、ぜひ覚えておいてください。

次回の投稿では、~/.ssh/configファイルを活用してSSH接続をさらに便利に管理する方法について説明します。疑問があればいつでもコメントでお知らせください!