ฉันต้องการตรวจสอบการตอบสนองบนซ็อกเก็ตยูนิกซ์โดยไม่รบกวนการเชื่อมต่อเดิมและไพพ์ไปยังสคริปต์เพื่อการประมวลผล
ฉันรู้วิธีการทำเช่นนี้กับ tcpdump สำหรับการเชื่อมต่อ tcp แต่ฉันไม่สามารถหาวิธีแก้ปัญหาสำหรับซ็อกเก็ตยูนิกซ์ท้องถิ่น
เป็นไปได้ไหม
ฉันต้องการตรวจสอบการตอบสนองบนซ็อกเก็ตยูนิกซ์โดยไม่รบกวนการเชื่อมต่อเดิมและไพพ์ไปยังสคริปต์เพื่อการประมวลผล
ฉันรู้วิธีการทำเช่นนี้กับ tcpdump สำหรับการเชื่อมต่อ tcp แต่ฉันไม่สามารถหาวิธีแก้ปัญหาสำหรับซ็อกเก็ตยูนิกซ์ท้องถิ่น
เป็นไปได้ไหม
คำตอบ:
มีผู้ชายที่อ้างว่าทำเช่นนั้นโดยการสร้างแอปที่ทำหน้าที่เป็นเกตเวย์ระหว่างสองซ็อกเก็ตและบันทึกข้อมูลทั้งหมดที่ไหล ดังนั้นคุณไม่สามารถแตะที่ซ็อกเก็ต แต่ถ้าคุณสามารถรีสตาร์ทบริการและปรับแต่งเพื่อใช้แอพนี้คุณจะสามารถเห็นปริมาณการใช้งานทั้งหมด
นี่คือลิงค์ไปยังโพสต์: Unix Socket Sniffer
มีอีกวิธีหนึ่งที่ต้องการให้คุณค้นหา id กระบวนการที่ติดกับซ็อกเก็ตจากนั้นค้นหาด้วย lsof file descriptor ของซ็อกเก็ตแล้วแตะที่ file descriptor โดยใช้ strace
หากคุณสามารถหยุดสิ่งที่ลูกค้า / เซิร์ฟเวอร์ใช้ซ็อกเก็ตและกำหนดค่าใหม่ฉันขอแนะนำวิธีแรกเสมอวิธีที่สองมันยุ่งยากและคุณต้องแตะที่กระบวนการปัจจุบันซึ่งในบางแอพอาจทำให้เกิดความผิดพลาด
หวังว่าใครบางคนสอนเราด้วยวิธี anoter :)
โชคดี
คุณสามารถใช้ 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 ด้วย
คุณอาจลองใช้ strace กับหนึ่งในกระบวนการที่ด้านใดด้านหนึ่งของซ็อกเก็ตเนื่องจากจะทำให้คุณดูสิ่งที่เขียน / อ่าน ฉันพบในสภาพแวดล้อมการผลิตของฉันฉันไม่มี socat แต่มี strace
สำหรับวัตถุประสงค์ที่มีประโยชน์ใด ๆ การตั้งค่า -s เป็นสิ่งที่ยิ่งใหญ่นั้นเป็นสิ่งที่จำเป็น
strace -p <pid>
เพื่อดูกระบวนการทำงาน
strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.log
จากนั้นเรียกใช้การทดสอบ คุณมี /tmp/php.log เพื่อตรวจสอบว่าบันทึกมีขนาดใหญ่เกินไปหรือไม่ หากคุณได้รับปริมาณการใช้งานมากเกินไปให้ทำคำขอด้วยสตริงการสืบค้นด้วยชื่อของคุณหรือบางอย่างเพื่อให้คุณสามารถค้นหาได้ในล็อก
printf
จัดการกับการทำซ้ำ printf " -p %s" $(pidof php5-fpm)
จะใส่คำนำหน้าแต่ละอาร์กิวเมนต์ pid ด้วย-p
และสามารถเขียนได้จริง
// 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