Nắm bắt lưu lượng của giao thức X11


15

Làm cách nào tôi có thể nắm bắt lưu lượng của giao thức X11 ?

Tôi cần tìm cách thu lưu lượng X11 giữa hai máy và giữa máy chủ X11 và máy khách X11 trên máy cục bộ.

Câu trả lời:


19

Bạn có thể nói chuyện X11 qua TCP hoặc qua ổ cắm tên miền Unix hoặc (trên Linux) trên ổ cắm tên miền Unix trong không gian tên trừu tượng .

Khi HIỂN THỊ được đặt thành host:4, viết tắt tcp/host:4, khách hàng sử dụng TCP để kết nối với máy chủ. Cổng TCP sau đó là 6000 cộng với số hiển thị (trong trường hợp đó là 6004).

Trong trường hợp đó, bạn có thể chụp lưu lượng với bất kỳ trình thám thính mạng nào tcpdumphoặc wiresharkbằng cách bắt lưu lượng TCP trên cổng đó.

Khi $DISPLAYchỉ :4(viết tắt unix/:4), sau đó khách hàng sử dụng ổ cắm miền unix. Hoặc /tmp/.X11-unix/X4hoặc cùng một đường dẫn trong không gian tên ABSTRACT (thường được hiển thị như @/tmp/.X11-unix/X4trong netstatđầu ra).

Nắm bắt giao thông sau đó là khó khăn hơn.

Nếu máy chủ X của bạn nghe trên TCP (nhưng hiện tại chúng có xu hướng không còn nữa), cách dễ nhất là thay đổi DISPLAYlocalhost:4thay vào đó là :4lưu lượng truy cập mạng trên cổng 6004 trên giao diện loopback.

Nếu không, bạn có thể sử dụng socatnhư một người đàn ông ở giữa chấp nhận các kết nối dưới dạng TCP và chuyển tiếp chúng dưới dạng unix hoặc trừu tượng :

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

Sau đó bạn có thể thiết lập $DISPLAYđể localhost:4và nắm bắt được lưu lượng mạng như trên hoặc nói socatđể đổ nó với -x -v.

Bây giờ, nếu bạn không thể thay đổi $DISPLAYvà muốn nắm bắt lưu lượng truy cập của một ứng dụng X cục bộ đang chạy sử dụng các ổ cắm tên miền unix, thì đó là điều khó khăn.

Một cách tiếp cận có thể là sử dụng strace(hoặc lệnh tương đương trên hệ thống của bạn nếu không phải Linux) để theo dõi các cuộc gọi hệ thống gửi / nhận mà ứng dụng của bạn thực hiện để liên lạc với máy chủ X.

Ở đây xterm, tôi quan sát nó writev(), recvfrom()recvmsg()hệ thống gọi mô tả tập tin 3 cho điều đó. Vì vậy, tôi có thể làm:

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 -

(hoặc tshark -Vi -).

Ý tưởng là trích xuất dấu thời gian và byte được gửi / nhận từ đầu ra stracevà sử dụng text2pcapđể chuyển đổi nó thành một pcap(thêm các tiêu đề TCP giả trên cổng 6000 với -T6000,1234) trước khi nạp vào wireshark. Chúng tôi cũng phân chia các gói để tránh giới hạn 64kiB về độ dài tối đa của bản ghi pcap.

Lưu ý rằng text2pcapđể hoạt động chính xác liên quan đến việc điều chỉnh hướng giao thông, bạn cần có một phiên bản tương đối gần đây.


Bạn có biết lý do đằng sau việc mặc định cho các ổ cắm tên miền unix không? TCP có bất kỳ tác động (đáng kể) nào đến hiệu suất hoặc các nhược điểm khác không?
inVader

@inVader, vâng, đó là toàn bộ giao thức TCP / IP để thực hiện, trải qua nhiều lớp ... Tôi cho rằng hệ thống có thể sử dụng các phím tắt (như không thực hiện thuật toán tránh tắc nghẽn thông thường) cho các kết nối loopback, nhưng, trong các thử nghiệm của tôi Tôi nhận được thông lượng gấp đôi với một ổ cắm unix-domain đơn giản như với một thử nghiệm socat socket tcp.
Stéphane Chazelas

14

Nếu bạn chủ yếu quan tâm đến giao thức X11 chứ không phải các công cụ TCP / IP và ethernet cơ bản và nếu bạn có thể điều chỉnh cài đặt máy khách hoặc máy chủ, bạn có thể sử dụng một công cụ được thiết kế đặc biệt để chụp và giải mã lưu lượng giữa X11 máy khách và máy chủ X11. Không giống như wiresharkngười mổ xẻ X11, các công cụ này khó có thể bị nhầm lẫn bởi lưu lượng truy cập, được tham gia đầy đủ với nó.

Cái chính là xscope , mặc dù không có sẵn dưới dạng nhị phân cho một số bản phân phối Unix hoặc Linux, có thể dễ dàng được xây dựng từ nguồn .

Ngoài ra, cũng có xtrussxtrace nhưng tôi không có kinh nghiệm với chúng.

Tất cả các công cụ này hoạt động giống như các proxy chuyển tiếp kết nối đến một máy chủ X11 thực sự. Các máy khách chỉ cần sử dụng một biến HIỂN THỊ khác (hoặc đối số hiển thị) để kết nối với proxy.

ví dụ:

$ 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

Lưu ý: Nếu vì lý do nào đó bạn không thể thay đổi cài đặt máy khách X11 (hiển thị), bạn có thể cấu hình lại máy chủ để nghe một cổng khác (thường là 6001 so với 6000) và sau đó định cấu hình xscopeđể nghe trên cổng ban đầu (6000).


Tôi đã cố gắng biên dịch xscope ... "Không tìm thấy gói 'xproto'". xin vui lòng bạn có thể viết ở đây bãi chứa gói đầu tiên (12 byte)?
Massimo

@Massimo Bạn đã cài đặt gói bị thiếu?
jlliagre

Tôi đang sử dụng istance linux trên Amazon và yum không biết xproto. Xin vui lòng bạn có thể gửi kết xuất của gói đầu tiên? Tôi chỉ cần điều đó, thks.
Massimo

Beacuse gói đầu tiên thông thường là 21 byte, không phải 12, xem "Khởi tạo kết nối" trong x.org/release/civerse/doc/xproto/x11protatio.html
Massimo

1
Chỉ cần thử xtrace - có thể xác nhận rằng nó cũng hoạt động tốt; đầu ra của nó nhỏ gọn hơn, với một dòng trên mỗi tin nhắn - vì vậy cũng dễ dàng có thể truy cập được. Chạy với ví dụ. xtrace -D:1 -d:0 -k. (Hoặc x11trace, vì tệp thực thi được đặt tên trên một số bản phát hành)
Aleksi Torhamo

4

X11 sử dụng TCP làm giao thức vận chuyển. Phạm vi cổng TCP cho X11 thường là 6000-6063 nhưng rất có thể bạn sẽ thấy cổng TCP 6000 đang được sử dụng.

Vì vậy, bạn sẽ có thể sử dụng bất kỳ màn hình mạng nào bạn chọn để quan sát lưu lượng bằng cách lọc cho phạm vi cổng này và các máy chủ được đề cập. Tôi cũng biết, wiresharkchẳng hạn, đã có sẵn bộ lọc x11để theo dõi lưu lượng truy cập mà bạn quan tâm.

Ví dụ: để giám sát tất cả lưu lượng X11 trên máy cục bộ (nếu sử dụng TCP; hãy tham khảo câu trả lời của @ Stéphane Chazelas) sử dụng bộ lọc sau:

x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1

Các thông điệp máy khách-máy chủ cục bộ được truyền qua một ổ cắm miền unix , lsof -U | grep '^X'.
goldilocks
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.