ฉันสามารถตรวจสอบซ็อกเก็ตโดเมน unix ในพื้นที่เช่น tcpdump ได้หรือไม่


59

ฉันต้องการตรวจสอบการตอบสนองบนซ็อกเก็ตยูนิกซ์โดยไม่รบกวนการเชื่อมต่อเดิมและไพพ์ไปยังสคริปต์เพื่อการประมวลผล

ฉันรู้วิธีการทำเช่นนี้กับ tcpdump สำหรับการเชื่อมต่อ tcp แต่ฉันไม่สามารถหาวิธีแก้ปัญหาสำหรับซ็อกเก็ตยูนิกซ์ท้องถิ่น

เป็นไปได้ไหม


คำตอบ:


15

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

นี่คือลิงค์ไปยังโพสต์: Unix Socket Sniffer

มีอีกวิธีหนึ่งที่ต้องการให้คุณค้นหา id กระบวนการที่ติดกับซ็อกเก็ตจากนั้นค้นหาด้วย lsof file descriptor ของซ็อกเก็ตแล้วแตะที่ file descriptor โดยใช้ strace

หากคุณสามารถหยุดสิ่งที่ลูกค้า / เซิร์ฟเวอร์ใช้ซ็อกเก็ตและกำหนดค่าใหม่ฉันขอแนะนำวิธีแรกเสมอวิธีที่สองมันยุ่งยากและคุณต้องแตะที่กระบวนการปัจจุบันซึ่งในบางแอพอาจทำให้เกิดความผิดพลาด

หวังว่าใครบางคนสอนเราด้วยวิธี anoter :)

โชคดี


ย่ะคุณสามารถทำวิธีคนกลางด้วยโซคอทได้ แต่ฉันหวังว่าจะได้วิธีที่ตรงกว่าโดยไม่ต้องแก้ไขการตั้งค่าที่มีอยู่ที่อื่น
ck_

1
ถ้าอย่างนั้นฉันก็รู้แล้วว่ามันเป็นวิธีเดียวที่ฉันรู้ ระวัง produciton เมื่อคุณแยกตัวออกจากกระบวนการตรวจสอบว่าทุกอย่างยังคงทำงานต่อไป
Valor

3
หลังจากขุดเพิ่มเติมรอบฉันพบคำถามที่คล้ายกันกับรายละเอียดบางอย่างเกี่ยวกับสาเหตุที่เป็นไปไม่ได้โดยตรงใน stackoverflow stackoverflow.com/questions/8394613//
ck_

80

คุณสามารถใช้ socat

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

เกิดอะไรขึ้นข้างต้น: ย้ายซ็อกเก็ตดั้งเดิมไปที่ sock.original Socat สร้างซ็อกเก็ตใหม่ ('UNIX-LISTEN') ในตำแหน่งต้นฉบับและส่งต่อไปยังต้นฉบับ ('เชื่อมต่อ UNIX') -v บอกให้ socat พิมพ์เอาต์พุตไปยัง STDERR ด้วย


3
สนใจที่จะเพิ่มคำอธิบายเพิ่มเติมอีกเล็กน้อย?
Kazark

4
นั้นง่ายเมื่อซ็อกเก็ตยูนิกซ์ดั้งเดิมมีเส้นทางบนระบบแฟ้ม แต่ถ้ามันเป็นซ็อกเก็ตยูนิกซ์นามธรรม namespace ที่คุณไม่สามารถย้ายได้จริง?
Valerio Schiavoni

6

คุณอาจลองใช้ strace กับหนึ่งในกระบวนการที่ด้านใดด้านหนึ่งของซ็อกเก็ตเนื่องจากจะทำให้คุณดูสิ่งที่เขียน / อ่าน ฉันพบในสภาพแวดล้อมการผลิตของฉันฉันไม่มี socat แต่มี strace

สำหรับวัตถุประสงค์ที่มีประโยชน์ใด ๆ การตั้งค่า -s เป็นสิ่งที่ยิ่งใหญ่นั้นเป็นสิ่งที่จำเป็น


สิ่งนี้ใช้ได้ดีสำหรับฉันและง่ายต่อการทำ ใช้strace -p <pid>เพื่อดูกระบวนการทำงาน
Matt Munson

คำสั่งด่วน: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logจากนั้นเรียกใช้การทดสอบ คุณมี /tmp/php.log เพื่อตรวจสอบว่าบันทึกมีขนาดใหญ่เกินไปหรือไม่ หากคุณได้รับปริมาณการใช้งานมากเกินไปให้ทำคำขอด้วยสตริงการสืบค้นด้วยชื่อของคุณหรือบางอย่างเพื่อให้คุณสามารถค้นหาได้ในล็อก
higuita

1
@Higuita ฉันรู้ว่ามันเป็นเวลานาน แต่แทนที่จะวนซ้ำคุณสามารถprintfจัดการกับการทำซ้ำ printf " -p %s" $(pidof php5-fpm)จะใส่คำนำหน้าแต่ละอาร์กิวเมนต์ pid ด้วย-pและสามารถเขียนได้จริง
JoL

1
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

แล้ว:

sudo tcpdump -i lo -netvv port 8089
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.