ฉันจะจับปริมาณการใช้โพรโทคอลX11ได้อย่างไร
ฉันต้องการวิธีในการจับภาพการรับส่งข้อมูล X11 ระหว่างเครื่องสองเครื่องและระหว่างเซิร์ฟเวอร์ X11 และไคลเอนต์ X11 บนเครื่องภายใน
ฉันจะจับปริมาณการใช้โพรโทคอลX11ได้อย่างไร
ฉันต้องการวิธีในการจับภาพการรับส่งข้อมูล X11 ระหว่างเครื่องสองเครื่องและระหว่างเซิร์ฟเวอร์ X11 และไคลเอนต์ X11 บนเครื่องภายใน
คำตอบ:
คุณสามารถพูดคุย 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 รุ่นที่ค่อนข้างล่าสุด
หากคุณสนใจโพรโทคอล X11 เป็นส่วนใหญ่ไม่ใช่โพรโทคอล TCP / IP และอีเธอร์เน็ตและหากคุณสามารถปรับแต่งการตั้งค่าไคลเอนต์หรือเซิร์ฟเวอร์คุณอาจใช้เครื่องมือที่ออกแบบมาเพื่อจับและถอดรหัสปริมาณการรับส่งข้อมูลระหว่าง X11 ไคลเอนต์และเซิร์ฟเวอร์ X11 ซึ่งแตกต่างจากwireshark
X11 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)
xtrace -D:1 -d:0 -k
. (หรือ x11trace เนื่องจาก executable ถูกตั้งชื่อไว้ที่ distros บางอย่าง)
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'
ข้อความไคลเอนต์เซิร์ฟเวอร์ท้องถิ่นจะถูกส่งผ่านทางซ็อกเก็ตโดเมนยูนิกซ์