回答:
X11をTCP経由で、またはUnixドメインソケット経由で、または(Linuxでは)抽象名前空間のUnixドメインソケット経由で通信できます。
DISPLAYに設定されている場合host:4
のための短い、tcp/host:4
、クライアントがサーバーに接続するためにTCPを使用しています。TCPポートは、次に、6000プラス(この場合6004)で表示番号です。
その場合は、次のような任意のネットワークスニファでトラフィックをキャプチャすることができますtcpdump
またはwireshark
そのポートでTCPトラフィックをキャプチャすることもできます。
とき$DISPLAY
だけである:4
(略してunix/:4
)、その後、クライアントは、UNIXドメインソケットを使用します。いずれか/tmp/.X11-unix/X4
又はにおける同じパスABSTRACT(通常のように示される名前空間@/tmp/.X11-unix/X4
でnetstat
出力)。
トラフィックをキャプチャすることは、その後トリッキーです。
XサーバーがTCPをリッスンしている場合(ただし、最近はそうではない傾向があります)、最も簡単なのはDISPLAY
、localhost:4
代わりに変更:4
し、ループバックインターフェイスのポート6004でネットワークトラフィックをキャプチャすることです。
そうでない場合は、接続をTCPとして受け入れ、それらをunixまたはabstractとして転送する中間者socat
として使用できます。
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
次に、上記のようにネットワークトラフィックを設定$DISPLAY
しlocalhost:4
てキャプチャするか、次のようsocat
にダンプするように指示できます。-x -v
。
さて、あなたが変更できない場合 $DISPLAY
、それがトリッキー取得する場所のUNIXドメインソケットを使用して、すでに実行しているローカルXアプリケーションのトラフィックをキャプチャしたいです。
一つのアプローチは、使用することができ strace
(またはお使いのシステムでない場合は、Linux上同等のコマンド)の送信をトレースするには、/アプリケーションがXサーバとの通信にないことをシステムコールを受けます。
ここでxterm
、私はそれを観察しwritev()
、recvfrom()
そのためにrecvmsg()
システムはファイル記述子3を呼び出します。私が行うことができますので。
strace -qqxxttts9999999 -e writev,recvmsg,recvfrom -p "$xterm_pid" 2>&1 |
perl -lne '
if (($t,$f,$p) = /^([\d.]+) (writev|recvmsg|recvfrom)\(3, (.*)/) {
@p = ($p =~ /\\x(..)/g);
$dir = $f eq "writev" ? "O" : "I";
while (@p) {print "$dir $t 0000 " . join(" ", splice @p,0,64000)}
}' | text2pcap -T6000,1234 -Dqt %s. - - | wireshark -ki -
(又はtshark -Vi -
)。
アイデアは、タイムスタンプを抽出すること、および/送信の出力から受信したバイト数strace
と使用text2pcap
変換することにpcap
(とポート6000上のダミーTCPヘッダを付加すること-T6000,1234
に供給する前に)wireshark
。パケットを分割して、pcapレコードの最大長の64kiB制限を回避します。
text2pcap
トラフィックの方向を正しくするために適切に機能するには、比較的最近のバージョンのwiresharkが必要であることに注意してください。
主にX11プロトコルに関心があり、基礎となるTCP / IPおよびイーサネットのものに関心がなく、クライアントまたはサーバーの設定を調整できる場合は、X11間のトラフィックをキャプチャおよびデコードするために特別に設計されたツールを使用できますクライアントとX11サーバ。異なり、wireshark
X11切開、これらのツールは、完全にそれに関与している、トラフィックによって混同されそうにありません。
主なものはあるxscope一部のUNIXまたはLinuxディストリビューション用のバイナリとして利用可能ではないにも関わらず、簡単に構築することができ、ソース。
また、もありますxtrussとXTRACEが、私は彼らとの経験がありません。
これらのツールはすべて、実際のX11サーバへの接続を中継するリバースプロキシのような役割を果たします。クライアントは、単にプロキシに接続するために別のDISPLAY変数(または-display引数)を使用します。
例えば:
$ wget http://xorg.freedesktop.org/archive/individual/app/xscope-1.4.1.tar.gz
..
$ tar xzf xscope-1.4.1.tar.gz
..
$ cd xscope-1.4.1
$ ./configure && ./make
..
$ ./xscope & sleep 5; xclock -display :1
...
0.00: Client --> 12 bytes
byte-order: LSB first
major-version: 000b
minor-version: 0000
0.00: 692 bytes <-- X11 Server
protocol-major-version: 000b
protocol-minor-version: 0000
release-number: 00adfef8
resource-id-base: 04c00000
resource-id-mask: 001fffff
motion-buffer-size: 00000100
image-byte-order: LSB first
bitmap-format-bit-order: LSB first
bitmap-format-scanline-unit: 20
bitmap-format-scanline-pad: 20
min-keycode: 8 (^H)
max-keycode: 255 (\377)
vendor: "The X.Org Foundation"
pixmap-formats: (7)
roots: (1)
0.00: Client --> 20 bytes
............REQUEST: QueryExtension
name: "BIG-REQUESTS"
0.00: 32 bytes <-- X11 Server
..............REPLY: QueryExtension
present: True
major-opcode: 85
注:何らかの理由であなたはX11クライアントの設定(表示)を変更できない場合は、サーバが別のポート(6000対通常は6001)に耳を傾け、次に設定するために再構成することができるかもしれないxscope
元のポート(6000)でリッスンします。
xtrace -D:1 -d:0 -k
。(またはx11trace、実行可能ファイルはいくつかのディストリビューションで名前が付けられているため)
X11は、トランスポートプロトコルとしてTCPを使用します。X11のTCPポート範囲は通常6000〜6063ですが、ほとんどの場合、TCPポート6000が使用されています。
そのため、このポート範囲と問題のホストをフィルタリングすることで、選択したネットワークモニターを使用してトラフィックを監視できるはずです。またwireshark
、たとえば、x11
興味のあるトラフィックを監視するためのフィルタープリセットが既に含まれていることも知っています。
たとえば、ローカルマシン上のすべてのX11トラフィックを監視するには(TCPを使用している場合。@StéphaneChazelasの回答を参照)、次のフィルターを使用します。
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X'
。