จับภาพการรับส่งข้อมูลของโพรโทคอล X11


15

ฉันจะจับปริมาณการใช้โพรโทคอลX11ได้อย่างไร

ฉันต้องการวิธีในการจับภาพการรับส่งข้อมูล 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) จากนั้นลูกค้าใช้ซ็อกเก็ตโดเมนยูนิกซ์ อย่างใดอย่างหนึ่ง/tmp/.X11-unix/X4หรือเส้นทางเดียวกันในบทคัดย่อ namespace (มักจะแสดงให้เห็นว่า@/tmp/.X11-unix/X4ในnetstatการส่งออก)

การจับภาพการจราจรนั้นยากกว่า

หากฟังเซิร์ฟเวอร์ X ของคุณบน TCP ( แต่พวกเขามีแนวโน้มที่จะไม่ได้อีกต่อไปในปัจจุบัน) ที่ง่ายที่สุดคือการเปลี่ยนแปลงDISPLAYที่จะlocalhost:4แทน:4และจับเครือข่ายการจราจรบนพอร์ต 6004 บนอินเตอร์เฟซย้อนกลับ

หากไม่socatเป็นเช่นนั้นคุณสามารถใช้เป็นคนที่อยู่ตรงกลางที่ยอมรับการเชื่อมต่อเป็น TCP และส่งต่อเป็นunixหรือabstract :

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

จากนั้นคุณสามารถตั้งค่า$DISPLAYการlocalhost:4และจับเครือข่ายการจราจรดังกล่าวหรือบอกจะถ่ายโอนข้อมูลด้วยsocat-x -v

ตอนนี้ถ้าคุณไม่สามารถเปลี่ยนแปลง$DISPLAYและต้องการจับภาพทราฟฟิกของแอปพลิเคชั่น 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(เพิ่มส่วนหัว TCP หุ่นบนพอร์ต 6000 ด้วย-T6000,1234) wiresharkก่อนที่จะให้อาหาร นอกจากนี้เรายังแบ่งแพ็คเก็ตเพื่อหลีกเลี่ยงการ จำกัด 64kiB กับความยาวสูงสุดของบันทึก pcap

โปรดทราบว่าสำหรับtext2pcapการทำงานอย่างถูกต้องเกี่ยวกับการขอทิศทางการจราจรให้ถูกต้องคุณต้องใช้ wireshark รุ่นที่ค่อนข้างล่าสุด


คุณรู้สาเหตุของการเริ่มต้นซ็อกเก็ตโดเมน unix หรือไม่? TCP มีผลกระทบอย่างมีนัยสำคัญต่อประสิทธิภาพหรือข้อเสียอื่น ๆ หรือไม่?
inVader

@ inVader ใช่แล้วนั่นเป็นโปรโตคอล TCP / IP ทั้งหมดที่ใช้ในการดำเนินการหลายเลเยอร์ ... ฉันคิดว่าระบบสามารถใช้ทางลัด (เช่นไม่ใช้อัลกอริทึมการหลีกเลี่ยงความแออัดตามปกติ) สำหรับการเชื่อมต่อลูปแบ็ค ฉันได้รับปริมาณงานมากเป็นสองเท่าด้วยซ็อกเก็ตแบบ unix-domain เช่นเดียวกับการทดสอบ socat socket tcp
Stéphane Chazelas

14

หากคุณสนใจโพรโทคอล X11 เป็นส่วนใหญ่ไม่ใช่โพรโทคอล TCP / IP และอีเธอร์เน็ตและหากคุณสามารถปรับแต่งการตั้งค่าไคลเอนต์หรือเซิร์ฟเวอร์คุณอาจใช้เครื่องมือที่ออกแบบมาเพื่อจับและถอดรหัสปริมาณการรับส่งข้อมูลระหว่าง X11 ไคลเอนต์และเซิร์ฟเวอร์ X11 ซึ่งแตกต่างจากwiresharkX11 dissector เครื่องมือเหล่านี้ไม่น่าจะสับสนกับการจราจร

หนึ่งหลักคือxScopeซึ่งแม้จะไม่เป็นพร้อมใช้งานเป็นไบนารีบาง Unix หรือ Linux กระจายที่สามารถสร้างขึ้นได้อย่างง่ายดายจากแหล่งที่มา

นอกจากนี้ยังมีxtrussและxtraceแต่ฉันไม่มีประสบการณ์กับพวกเขา

เครื่องมือทั้งหมดเหล่านี้ทำหน้าที่เหมือน reverse-proxies ที่เชื่อมต่อกับเซิร์ฟเวอร์ 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 (จอแสดงผล) คุณอาจสามารถกำหนดค่าเซิร์ฟเวอร์ใหม่เพื่อฟังพอร์ตอื่น (โดยทั่วไปคือ 6001 vs 6000) จากนั้นกำหนดค่าxscopeให้ฟังพอร์ตเดิม (6000)


ฉันพยายามรวบรวม xscope ... "ไม่พบแพ็คเกจ" xproto " กรุณาช่วยเขียนแพ็คเก็ตแรก (12 ไบต์) ได้ไหม
Massimo

@Massimo คุณติดตั้งแพ็คเกจที่หายไปหรือไม่?
jlliagre

ฉันใช้ linux istance ใน Amazon และ yum ไม่รู้ xproto คุณสามารถโพสต์ดัมพ์ของแพ็กเก็ตแรกได้ไหม? ฉันต้องการแค่นั้น
Massimo

เพราะแพ็คเก็ตแรกตามปกติคือ 21 ไบต์ไม่ใช่ 12 ดู "การเชื่อมต่อเริ่มต้น" ในx.org/releases/current/doc/xproto/x11protocol.html
Massimo

1
เพิ่งลองใช้ xtrace - สามารถยืนยันได้ว่าใช้งานได้ดี เอาต์พุตมีขนาดกะทัดรัดมากขึ้นโดยมีหนึ่งบรรทัดต่อข้อความ - ดังนั้นจึงสามารถพิมพ์ได้อย่างง่ายดาย ทำงานด้วยเช่น xtrace -D:1 -d:0 -k. (หรือ x11trace เนื่องจาก executable ถูกตั้งชื่อไว้ที่ distros บางอย่าง)
Aleksi Torhamo

4

X11 ใช้ TCP เป็นโปรโตคอลการขนส่ง ช่วงพอร์ต TCP สำหรับ X11 มักจะเป็น 6,000-6063 แต่ส่วนใหญ่คุณจะเห็นพอร์ต TCP 6000 ที่ใช้งานอยู่

ดังนั้นคุณควรสามารถใช้การตรวจสอบเครือข่ายที่คุณเลือกเพื่อสังเกตปริมาณการใช้งานโดยการกรองสำหรับช่วงพอร์ตนี้และโฮสต์ที่มีปัญหา wiresharkยกตัวอย่างเช่นฉันรู้ว่ามีตัวกรองที่ตั้งไว้ล่วงหน้าx11เพื่อตรวจสอบปริมาณการใช้งานที่คุณสนใจ

ตัวอย่างเช่นในการตรวจสอบปริมาณการใช้งาน X11 ทั้งหมดบนเครื่องโลคัล (หากใช้ TCP อ้างถึงคำตอบของ @ Stéphane Chazelas) ใช้ตัวกรองต่อไปนี้:

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

lsof -U | grep '^X'ข้อความไคลเอนต์เซิร์ฟเวอร์ท้องถิ่นจะถูกส่งผ่านทางซ็อกเก็ตโดเมนยูนิกซ์
goldilocks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.