R.A. Epigonos et al.

[xauth] 多段sshでX11転送

クライアント(PuTTY on windows)、サーバ1(ssh on screen on Debian)、サーバ2(xeyes on screen on Debian)のように入れ子でsshする場合にxeyesの画面をwindows上に表示させたい。PuTTY, ssh, sshd の x11 転送は許可している。windows 側の X11 サーバは Xming

図にすると以下の様な感じ。

+---------+   +--------+   +--------+
| c00     |   | s00    |   | s01    |
+---------+   +--------+   +--------+
| Windows |   | Debian |   | Debian |
+---------+   +--------+   +--------+
| PuTTY   |===| sshd   | +=| sshd   |
+---------+   +--------+ | +--------+
|         |   | bash   | | | bash   |
+---------+   +--------+ | +--------+
|         |   | screen | | | screen |
+---------+   +--------+ | +--------+
|         |   | bash   | | | bash   |
+---------+   +--------+ | +--------+
|         |   | ssh    |=+ | xeyes  |
+---------+   +--------+   +--------+

以下のようにすれば、c00 に s01 で起動した xeyes が表示される。

********@c00:~$ ssh -X user@s00
********@s00:~$ echo $DISPLAY
localhost:10.0
********@s00:~$ screen -D -RR
********@s00:~$ DISPLAY=localhost:10.0 ssh -X user@s01
********@s01:~$ echo $DISPLAY
localhost:11.0
********@s01:~$ screen -D -RR
********@s01:~$ DISPLAY=localhost:11.0 xeyes

TL;DR;

c00 の PuTTY から s00 にログインする前に既存の xauth list を確認。現在リストされているクッキーを削除するには xauth remove 。とりあえずすべてのクッキーを削除。

********@s00:~$ xauth list
s00/unix:10  MIT-MAGIC-COOKIE-1  ********************************
********@s00:~$ xauth remove s00/unix:10
********@s00:~$ xauth list

c00 の PuTTY から s00 にログインした後に xauth list を確認。この状態で xeyes を実行すれば Windows 側に xeyes の画面が表示される。xauth の使うファイルは ~/.Xauthority。別のsshセッションからでもxauth list は参照できる。

********@s00:~$ xauth list
s00/unix:11  MIT-MAGIC-COOKIE-1  dd9ab9a1************************
********@s00:~$ echo $DISPLAY && xauth list $DISPLAY
localhost:11.0
s00/unix:11  MIT-MAGIC-COOKIE-1  dd9ab9a1************************
********@s00:~$ xeyes

別の ssh セッションから xauth list を参照すると以下。先に作られたクッキーを参照できるが、このセッションは先のセッションと違う (DISPLAY 環境変数が違う) ので、xauth list $DISPLAY した時には何も表示されない。このことはxeyesを実行してみるとよくわかる(ディスプレイを開けないと言われる)。これを解決するにはxeyesの実行時にDISPLAY環境変数をすでに持っているクッキーに対応するディスプレイで上書きする。こうすることで実行できる。この状態下(DISPLAY変数が適切でない状態)でssh を使ってs00 から s01 に接続

********@s00:~$ xauth list
cuwefx/unix:11  MIT-MAGIC-COOKIE-1  dd9ab9a1************************
********@s00:~$ echo $DISPLAY && xauth list $DISPLAY
localhost:10.0
********@s00:~$ xeyes
PuTTY X11 proxy: Unsupported authorisation protocol
Error: Can't open display: localhost:10.0
********@s00:~$ DISPLAY=localhost:11.0 xeyes
[1]+  Done                    DISPLAY=localhost:11.0 xeyes
********@s00:~$ ssh -X -l ******** s01

ssh 接続直後のxauth list の結果は以下。xeyes も起動する。

********@s01:~$ xauth list
s01/unix:10  MIT-MAGIC-COOKIE-1  b016de3*************************
********@s01:~$ echo $DISPLAY && xauth list $DISPLAY
localhost:10.0
s01/unix:10  MIT-MAGIC-COOKIE-1  b016de3*************************
********@s01:~$ xeyes

ここで一旦クッキーを削除する。これでディスプレイが開けなくなる。

********@s01:~$ xauth remove s01/unix:10
********@s01:~$ xauth list
********@s01:~$ echo $DISPLAY && xauth list $DISPLAY
localhost:10.0
********@s01:~$ xeyes
X11 connection rejected because of wrong authentication.
Error: Can't open display: localhost:10.0

問題はここから新たなsshセッションを起動することなく、クッキーを生成できるか。

|   +---------------------------------------+     +---------------------------------------+       +-----------------------------------------+
|   | lxchost (Debian)                      |     | con00_sid_amd64 (Debian)              |       | con01_sid_amd64                         |
|   +--------------+------------+-----------+     +--------------+------------+-----------+       +--------------+--------------+-----------+
|   | 192.168.12.5 |            | 127.0.0.1 |     | 192.168.12.8 |            | 127.0.0.1 |       | 192.168.12.4 | Debian       | 127.0.0.1 |
|   +--------------+------------+-----------+     +--------------+------------+-----------+       +--------------+--------------+-----------+
|   |              |            |           | +===| tcp/22       | 137 (sshd) | tcp/6011  |===+ +=| tcp/22       | 129 (sshd)   | tcp/6011  |===+
|   +--------------+------------+-----------+ |   +--------------+            +-----------+   | | +--------------+              +-----------+   |
|   |              |     X      |           | |   |              |            | tcp/6011  |=+ | | |              |              | tcp/6011  |=+ |
|   +--------------+------------+-----------+ |   +--------------+------------+-----------+ | | | +--------------+--------------+-----------+ | |
| +=| tcp/35753    | 7578 (ssh) |           | | +=| tcp/39381    | 145 (ssh)  | tcp/53000 |=+ | | |              | 138 (xeyes)  | tcp/52999 |=+ |
| | +--------------+            |           | | | +--------------+            +-----------+   | | +--------------+--------------+-----------+   |
| | |              |            |           | | | |              |            | tcp/53002 |===+ | |              | 139 (xclock) | tcp/53001 |===+
| | +--------------+------------+-----------+ | | +--------------+------------+-----------+     | +--------------+--------------+-----------+
| |                                           | |                                               |
| +===========================================+ +===============================================+
| lxchost         | 7578 | ssh    | TCP@192.168.12.5:3575
| con00_sid_amd64 | 137  | sshd   | TCP@192.168.12.8:22
| con00_sid_amd64 | 137  | sshd   | TCP@127.0.0.1:6011
| con00_sid_amd64 | 137  | sshd   | TCP@127.0.0.1:6011
| con00_sid_amd64 | 145  | ssh    | TCP@127.0.0.1:53000
| con00_sid_amd64 | 145  | ssh    | TCP@127.0.0.1:53002
| con00_sid_amd64 | 145  | ssh    | TCP@192.168.12.8:53002
| con01_sid_amd64 | 129  | sshd   | TCP@192.168.12.4:22
| con01_sid_amd64 | 129  | sshd   | TCP@127.0.0.1:6011
| con01_sid_amd64 | 129  | sshd   | TCP@127.0.0.1:6011
| con01_sid_amd64 | 138  | xeyes  | TCP@127.0.0.1:52999
| con01_sid_amd64 | 139  | xclock | TCP@127.0.0.1:53001

lxchost上で起動したsshのpidが540の場合、以下でそのプロセスのネットワーク状態がわかる。

root@lxchost:~# lsof -n -p 7578 -a -i TCP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     7578 hoge    3u  IPv4 226922      0t0  TCP 192.168.12.5:35753->192.168.12.8:ssh (ESTABLISHED)
root@lxchost:~# lsof -n -p 7578 -a -U
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
ssh     7578 hoge    7u  unix 0xffff880036cb3040      0t0 227106 socket
ssh     7578 hoge    8u  unix 0xffff88003d0ce840      0t0 227123 socket

上の結果からlxchostはtcp/35753を使ってcon00_sid_amd64にssh接続している。これをcon00_sid_amd64から確認するには以下。上記のLocalとForeignが逆転していることが見て取れる。

root@con00_sid_amd64:~# lsof -n -i TCP:35753
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    135 root    3u  IPv4 226923      0t0  TCP 192.168.12.8:ssh->192.168.12.5:35753 (ESTABLISHED)
sshd    137 hoge    3u  IPv4 226923      0t0  TCP 192.168.12.8:ssh->192.168.12.5:35753 (ESTABLISHED)
root@con00_sid_amd64:~# lsof -n -p 135,137 -a -i TCP
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    135 root    3u  IPv4 226923      0t0  TCP 192.168.12.8:ssh->192.168.12.5:35753 (ESTABLISHED)
sshd    137 hoge    3u  IPv4 226923      0t0  TCP 192.168.12.8:ssh->192.168.12.5:35753 (ESTABLISHED)
sshd    137 hoge    8u  IPv6 226979      0t0  TCP [::1]:6011 (LISTEN)
sshd    137 hoge    9u  IPv4 226980      0t0  TCP 127.0.0.1:6011 (LISTEN)
sshd    137 hoge   11u  IPv6 227105      0t0  TCP [::1]:6011->[::1]:53000 (ESTABLISHED)
sshd    137 hoge   14u  IPv6 227122      0t0  TCP [::1]:6011->[::1]:53002 (ESTABLISHED)

con00_sid_amd64上で起動したsshのpidが145の場合、以下でそのプロセスのネットワーク状態がわかる。

root@con00_sid_amd64:~# lsof -n -p 145 -a -i TCP
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     145 hoge    3u  IPv4 227012      0t0  TCP 192.168.12.8:39381->192.168.12.4:ssh (ESTABLISHED)
ssh     145 hoge    7u  IPv6 227104      0t0  TCP [::1]:53000->[::1]:6011 (ESTABLISHED)
ssh     145 hoge    8u  IPv6 227121      0t0  TCP [::1]:53002->[::1]:6011 (ESTABLISHED)
root@con00_sid_amd64:~# lsof -n -p 145 -a -U
root@con00_sid_amd64:~# lsof -n -i TCP:6011
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    137 hoge    8u  IPv6 226979      0t0  TCP [::1]:6011 (LISTEN)
sshd    137 hoge    9u  IPv4 226980      0t0  TCP 127.0.0.1:6011 (LISTEN)
sshd    137 hoge   11u  IPv6 227105      0t0  TCP [::1]:6011->[::1]:53000 (ESTABLISHED)
sshd    137 hoge   14u  IPv6 227122      0t0  TCP [::1]:6011->[::1]:53002 (ESTABLISHED)
ssh     145 hoge    7u  IPv6 227104      0t0  TCP [::1]:53000->[::1]:6011 (ESTABLISHED)
ssh     145 hoge    8u  IPv6 227121      0t0  TCP [::1]:53002->[::1]:6011 (ESTABLISHED)

上の結果からcon00_sid_amd64はtcp/39381を使ってcon01_sid_amd64にssh接続している。これをcon01_sid_amd64から確認するには以下。上記のLocalとForeignが逆転していることが見て取れる。

root@con01_sid_amd64:~# lsof -n -i TCP:39381
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    127 root    3u  IPv4 227013      0t0  TCP 192.168.12.4:ssh->192.168.12.8:39381 (ESTABLISHED)
sshd    129 hoge    3u  IPv4 227013      0t0  TCP 192.168.12.4:ssh->192.168.12.8:39381 (ESTABLISHED)
root@con01_sid_amd64:~# lsof -n -p 127,129 -a -i TCP
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    127 root    3u  IPv4 227013      0t0  TCP 192.168.12.4:ssh->192.168.12.8:39381 (ESTABLISHED)
sshd    129 hoge    3u  IPv4 227013      0t0  TCP 192.168.12.4:ssh->192.168.12.8:39381 (ESTABLISHED)
sshd    129 hoge    8u  IPv6 227067      0t0  TCP [::1]:6011 (LISTEN)
sshd    129 hoge    9u  IPv4 227068      0t0  TCP 127.0.0.1:6011 (LISTEN)
sshd    129 hoge   11u  IPv6 227098      0t0  TCP [::1]:6011->[::1]:52999 (ESTABLISHED)
sshd    129 hoge   14u  IPv6 227117      0t0  TCP [::1]:6011->[::1]:53001 (ESTABLISHED)

con01_sid_amd64上で起動したXクライアントであるxeyesとxclockの使うネットワークを確認するには以下(ループバックのポート番号はディスプレイ番号11+6000)。

root@con01_sid_amd64:~# lsof -n -i TCP:6011
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    129 hoge    8u  IPv6 227067      0t0  TCP [::1]:6011 (LISTEN)
sshd    129 hoge    9u  IPv4 227068      0t0  TCP 127.0.0.1:6011 (LISTEN)
sshd    129 hoge   11u  IPv6 227098      0t0  TCP [::1]:6011->[::1]:52999 (ESTABLISHED)
sshd    129 hoge   14u  IPv6 227117      0t0  TCP [::1]:6011->[::1]:53001 (ESTABLISHED)
xeyes   138 hoge    3u  IPv6 227097      0t0  TCP [::1]:52999->[::1]:6011 (ESTABLISHED)
xclock  139 hoge    3u  IPv6 227116      0t0  TCP [::1]:53001->[::1]:6011 (ESTABLISHED)

リファレンス

  1. How X Over SSH really works
  2. Secure Shell
  3. X11 - The Wireshark Wiki

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2008-04-12T17:08:12+09:00
  2. Modified: 2008-04-12T17:08:12+09:00
  3. Generated: 2023-08-27T23:09:15+09:00