X11プロトコルのトラフィックをキャプチャ


15

どのように私はキャプチャすることができます X11のプロトコルのトラフィックを?

私は、ローカルマシン上の2台のマシン間でもX11サーバとX11クライアント間のX11トラフィックをキャプチャする方法を見つける必要があります。

回答:


19

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/X4netstat出力)。

トラフィックをキャプチャすることは、その後トリッキーです。

XサーバーがTCPをリッスンしている場合(ただし、最近はそうではない傾向があります)、最も簡単なのはDISPLAYlocalhost:4代わりに変更:4し、ループバックインターフェイスのポート6004でネットワークトラフィックをキャプチャすることです。

そうでない場合は、接続をTCPとして受け入れ、それらをunixまたはabstractとして転送する中間者socatとして使用できます。

socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4

次に、上記のようにネットワークトラフィックを設定$DISPLAYlocalhost: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が必要であることに注意してください。


UNIXドメインソケットのデフォルト設定の背後にある理由を知っていますか?DOES TCPは、パフォーマンスや他の欠点上の任意の(重要な)影響がありますか?
inVader

@inVader、よくはい、いくつかの層を通過し、実装するために全体のTCP / IPプロトコルです...私は、システムが私のテストでは、まだ(通常の輻輳回避アルゴリズムを実装していないような)ループバック接続のショートカットを取ることができますが、仮定私は、TCPソケットsocatに関するテストと同様にsimplewith UNIXドメインソケットで二回くらいのスループットとして取得します。
ステファンChazelas

14

主にX11プロトコルに関心があり、基礎となるTCP / IPおよびイーサネットのものに関心がなく、クライアントまたはサーバーの設定を調整できる場合は、X11間のトラフィックをキャプチャおよびデコードするために特別に設計されたツールを使用できますクライアントとX11サーバ。異なり、wireshark X11切開、これらのツールは、完全にそれに関与している、トラフィックによって混同されそうにありません。

主なものはあるxscope一部のUNIXまたはLinuxディストリビューション用のバイナリとして利用可能ではないにも関わらず、簡単に構築することができ、ソース

また、もありますxtrussXTRACEが、私は彼らとの経験がありません。

これらのツールはすべて、実際の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)でリッスンします。


xscopeをコンパイルしようとしました...「パッケージ 'xproto'が見つかりません」。plsは、ここで最初のパケット(12バイト)のダンプを書くことができますか?
マッシモ

@Massimoあなたは不足しているパッケージをインストールしましたか?
jlliagre

私はAmazonでlinux istanceを使用していますが、yumはxprotoを知りません。PLSのあなたは、最初のパケットのダンプを投稿することができますか?私はthks、それを必要としています。
マッシモ

いつもの最初のパケットが21のバイトではなく、12、あるbeacuseで「接続開始」を参照してください。x.org/releases/current/doc/xproto/x11protocol.html
マッシモ

1
xtraceを試してみました-それもうまくいくことを確認できます。出力はよりコンパクトで、メッセージごとに1行あります。したがって、簡単に削除できます。たとえばで実行します。xtrace -D:1 -d:0 -k。(またはx11trace、実行可能ファイルはいくつかのディストリビューションで名前が付けられているため)
Aleksi Torhamo

4

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

ローカルのクライアントサーバーメッセージは、unixドメインソケット経由で渡されますlsof -U | grep '^X'
-goldilocks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.