2026年5月20日
2026年5月20日
SSH の X11 フォワーディング(X11Forwarding)の設定方法|ssh -X と -Y の違い、表示されないときの確認
X11フォワーディングは、SSH接続を通して、サーバー上で動かしたGUIアプリケーションのウィンドウを手元のパソコンに表示する仕組みです。画面の描画データはSSHの暗号化された通信の中を通るため、X11用のポートを別に開ける必要はありません。この記事では、サーバー側とクライアント側の設定、動作確認、表示されないときの確認方法を説明します。コマンドは2026年10月時点のOpenSSHとUbuntu・Debian・RHEL系のLinuxを前提にしています。
仕組みと前提
- GUIアプリはサーバー側で動き、その表示を手元のパソコンのXサーバーが描画します
- そのため、手元のパソコンにXサーバーが必要です
- Linuxのデスクトップ:通常はそのまま使えます(Waylandの環境でも、XWaylandが有効なら使えます)
- macOS:XQuartzをインストールします
- Windows:WSL2(WSLg)上のLinuxからSSH接続するか、Xサーバーを内蔵したSSHクライアントを使います
- サーバー側では、SSHのサーバー(sshd)でX11フォワーディングが許可され、
xauthコマンドがインストールされている必要があります
手順1:サーバー側でX11フォワーディングを許可する
xauth をインストールする
sshd は、転送用の認証情報を xauth で作ります。入っていないとX11フォワーディングは動きません。動作確認用に xclock などの小さなGUIアプリも入れておきます。
# Ubuntu / Debian
sudo apt install xauth x11-apps
# RHEL / AlmaLinux / Rocky Linux
sudo dnf install xorg-x11-xauth
sshd の設定を確認・変更する
現在の設定値は次のコマンドで確認できます。
sudo sshd -T | grep -i x11
x11forwarding no と表示された場合は、許可する設定を追加します。Ubuntuなど /etc/ssh/sshd_config.d/ を読み込む構成では、そこに新しいファイルを作るのが分かりやすい方法です。sshd は同じ項目が複数あると最初に読んだ値を使うため、既存の設定ファイルに X11Forwarding no が先に書かれていないかも確認してください。
# /etc/ssh/sshd_config.d/x11.conf
X11Forwarding yes
X11UseLocalhost yes
X11UseLocalhost yes(既定値)は、転送用の表示先をサーバーのlocalhostだけで待ち受ける設定です。外部から転送用のポートに接続されないよう、そのままにしておきます。
設定ファイルの文法を確認してから、sshd に反映します。
sudo sshd -t
# Ubuntu / Debian
sudo systemctl restart ssh
# RHEL 系
sudo systemctl restart sshd
再起動しても、今つながっているSSHセッションは切れません。念のため、新しい接続ができることを確認するまでは今のセッションを閉じないでください。
手順2:クライアントからX11フォワーディングを付けて接続する
# X11フォワーディングを有効にして接続する
ssh -X user@server.example.com
# SSHのポートが22以外(例: 2222)の場合。-p はSSHのポート番号で、X11とは関係ない
ssh -X -p 2222 user@server.example.com
-X と -Y の違い
| オプション | 意味 | 用途 |
|---|---|---|
-X |
信頼しない(untrusted)転送。サーバー側のアプリが手元のXサーバーにできる操作が制限される | 通常はこちら |
-Y |
信頼する(trusted)転送。制限なし | -X で一部のアプリが正しく動かない場合に、信頼できるサーバーに限って使う |
-Y で接続すると、サーバー側のプログラムが手元の画面の内容を読み取ったり、キー入力を取得したりできます。管理者権限を他人も持つサーバーには使わないでください。なお、Debian・UbuntuのOpenSSHクライアントは ForwardX11Trusted の既定値が yes に変更されているため、-X でも -Y と同じ動作になります。
-X(信頼しない転送)では、既定で接続から20分たつと新しいGUIアプリを起動できなくなります(ForwardX11Timeout)。長時間使う場合は、~/.ssh/config で ForwardX11Timeout を延ばします。
回線が遅い場合は、-C を付けると通信を圧縮できます。
ssh -X -C user@server.example.com
~/.ssh/config に書いて毎回の指定を省く
特定のサーバーに接続するときだけX11フォワーディングを有効にするには、クライアントの ~/.ssh/config に書きます。Host * で全サーバーに有効にするのは避けてください。
Host gui-server
HostName server.example.com
User user
Port 2222
ForwardX11 yes
# -Y 相当にする場合だけ次の行を有効にする
# ForwardX11Trusted yes
これで ssh gui-server だけで、X11フォワーディング付きで接続できます。Port はSSHのポート番号です。
手順3:GUIアプリを起動して確認する
接続したら、まず DISPLAY 環境変数を確認します。
echo $DISPLAY
localhost:10.0 のような値が表示されれば、X11フォワーディングが有効です。数字はセッションごとに変わります。続けて、動作確認用のアプリを起動します。
xclock &
手元のパソコンに時計のウィンドウが表示されれば完了です。
DISPLAY を自分で設定しない
export DISPLAY=:0 を実行すると、表示先が「サーバー自身の画面」に変わり、SSHを通した転送が使われなくなります。サーバーに画面がなければ Can't open display のエラーになります。DISPLAY は sshd が自動で設定するので、シェルの設定ファイル(~/.bashrc など)にも書かないでください。
表示されないときの確認
| 症状 | 主な原因と確認すること |
|---|---|
接続時に X11 forwarding request failed on channel 0 |
サーバー側で X11Forwarding が no、または xauth が入っていない。手順1を確認する |
echo $DISPLAY が空 |
-X を付けずに接続している、またはサーバー側で拒否されている。ssh -v -X ... で詳しいログを見る |
Error: Can't open display |
DISPLAY を自分で上書きしている、または手元のXサーバー(XQuartzなど)が起動していない |
sudo で起動すると表示されない |
別のユーザーになると、Xの認証情報(~/.Xauthority)が引き継がれない。GUIアプリは接続したユーザーのまま起動する |
| 表示が極端に遅い | X11の転送は回線の遅延に弱い。-C で圧縮するか、デスクトップ全体を使うならVNCやRDPをSSHトンネル経由で使うことを検討する |
ssh -v -X ... で接続すると、Requesting X11 forwarding の行や、サーバーからの拒否のメッセージを確認できます。
ファイアウォールについて
X11フォワーディングの通信は、すべて既存のSSH接続の中を通ります。X11用のポート(6000番台)をファイアウォールで開ける必要はなく、開けてはいけません。ファイアウォールで許可が必要なのはSSHのポートだけです(既定は22番、変更している場合はそのポート)。
まとめ
- サーバー側は
X11Forwarding yesとxauthのインストールが必要。sudo sshd -T | grep -i x11で実際の設定を確認する - クライアントは
ssh -Xで接続する。-Yは画面やキー入力を読み取られる可能性があるため、信頼できるサーバーだけに使う -pはSSHのポート番号で、X11とは関係ないDISPLAYは自動でlocalhost:10.0などに設定される。export DISPLAY=:0で上書きしない- X11用のポートをファイアウォールで開ける必要はない
関連記事: