Bagaimana saya bisa menangkap traffic protokol X11 ?
Saya perlu menemukan cara untuk menangkap lalu lintas X11 antara dua mesin dan juga antara server X11 dan klien X11 pada mesin lokal.
Anda dapat berbicara X11 melalui TCP, atau melalui soket domain Unix atau (di Linux) pada soket domain Unix di namespace abstrak .
Ketika DISPLAY diatur ke host:4
, singkatan dari tcp/host:4
, klien menggunakan TCP untuk terhubung ke server. Port TCP kemudian 6000 ditambah nomor layar (dalam hal ini 6004).
Dalam hal itu, Anda dapat menangkap lalu lintas dengan sniffer jaringan seperti tcpdump
atau wireshark
dengan menangkap lalu lintas TCP pada port itu.
Ketika $DISPLAY
hanya :4
(kependekan dari unix/:4
), maka klien menggunakan soket domain unix. Entah /tmp/.X11-unix/X4
atau jalur yang sama di namespace ABSTRAK (biasanya ditampilkan sebagai @/tmp/.X11-unix/X4
dalam netstat
output).
Menangkap lalu lintas lebih rumit.
Jika server X Anda mendengarkan pada TCP (tapi mereka tidak cenderung lagi saat ini), yang paling mudah adalah dengan mengubah DISPLAY
ke localhost:4
bukannya :4
dan menangkap lalu lintas jaringan pada port 6004 pada interface loopback.
Jika tidak, Anda dapat menggunakan socat
sebagai pria di tengah yang menerima koneksi sebagai TCP dan meneruskannya sebagai unix atau abstrak :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Anda kemudian dapat mengatur $DISPLAY
ke localhost:4
dan menangkap lalu lintas jaringan seperti di atas atau meminta socat
untuk membuangnya -x -v
.
Sekarang, jika Anda tidak dapat mengubah $DISPLAY
dan ingin menangkap lalu lintas aplikasi X lokal yang sudah berjalan yang menggunakan soket domain unix, di situlah ia menjadi rumit.
Salah satu pendekatan bisa dengan menggunakan strace
(atau perintah setara pada sistem Anda jika bukan Linux) untuk melacak panggilan sistem kirim / terima yang aplikasi Anda lakukan untuk berkomunikasi dengan server X.
Di sini untuk xterm
, saya amati itu writev()
, recvfrom()
dan recvmsg()
panggilan sistem pada file deskriptor 3 untuk itu. Jadi saya bisa melakukan:
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 -
(atau tshark -Vi -
).
Idenya adalah untuk mengekstrak timestamp dan byte yang dikirim / diterima dari output strace
dan digunakan text2pcap
untuk mengubahnya menjadi pcap
(menambahkan header TCP dummy pada port 6000 dengan -T6000,1234
) sebelum diumpankan wireshark
. Kami juga membagi paket untuk menghindari batas 64kiB pada panjang maksimum catatan pcap.
Perhatikan bahwa untuk text2pcap
dapat bekerja dengan benar sehubungan dengan mendapatkan arah lalu lintas yang benar, Anda memerlukan versi wireshark yang relatif baru.
Jika Anda terutama tertarik pada protokol X11 dan bukan TCP / IP dan hal-hal ethernet yang mendasarinya, dan jika Anda dapat menyesuaikan pengaturan klien atau server, Anda mungkin menggunakan alat yang dirancang khusus untuk menangkap dan mendekode lalu lintas antara X11 klien dan server X11. Tidak seperti
wireshark
pembangkang X11, alat-alat ini tidak mungkin dibingungkan oleh lalu lintas, karena terlibat sepenuhnya dengannya.Yang utama adalah xscope yang, meskipun tidak tersedia sebagai biner untuk beberapa distribusi Unix atau Linux, dapat dengan mudah dibangun dari sumber .
Atau, ada juga xtruss dan xtrace tapi saya tidak punya pengalaman dengan mereka.
Semua alat ini bertindak seperti reverse-proxy yang menyampaikan koneksi ke server X11 nyata. Klien cukup menggunakan variabel DISPLAY yang berbeda (atau argumen tampilan) untuk terhubung ke proxy.
misalnya:
Catatan: Jika karena alasan tertentu Anda tidak dapat mengubah pengaturan klien X11 (tampilan), Anda mungkin dapat mengkonfigurasi ulang server untuk mendengarkan port yang berbeda (biasanya 6001 vs 6000) dan kemudian mengkonfigurasi
xscope
untuk mendengarkan pada port asli (6000).sumber
xtrace -D:1 -d:0 -k
. (Atau x11trace, karena executable dinamai pada beberapa distro)X11 menggunakan TCP sebagai protokol transportnya. Rentang port TCP untuk X11 biasanya 6000-6063 tetapi kemungkinan besar Anda akan melihat port TCP 6000 digunakan.
Jadi, Anda harus dapat menggunakan monitor jaringan apa pun yang Anda pilih untuk mengamati lalu lintas dengan memfilter rentang port ini dan host yang dimaksud. Saya juga tahu, bahwa
wireshark
, misalnya, sudah berisi preset filterx11
untuk memantau lalu lintas yang Anda minati.Misalnya, untuk memantau semua lalu lintas X11 pada mesin lokal (jika menggunakan TCP; lihat jawaban @ Stéphane Chazelas) gunakan filter berikut:
sumber
lsof -U | grep '^X'
,.