การตรวจสอบซ็อกเก็ตสดด้วย netlink inet_diag

เป้าหมายของฉันคือการตรวจสอบซ็อกเก็ตและเชื่อมโยงซ็อกเก็ตเหล่านั้นกับแอปพลิเคชันที่สร้างขึ้น
ฉันรู้จัก netstat, ss, lsof และอื่นๆ และสามารถแสดงรายการซ็อกเก็ตทั้งหมดพร้อมกับแอปพลิเคชันของตนได้
และฉันก็รู้ด้วยว่า ฉันสามารถแยกวิเคราะห์ /proc/net/tcp เพื่อรับซ็อกเก็ตและเชื่อมโยงกับแอปพลิเคชันด้วย /proc/(PID) ซึ่งเป็นสิ่งที่เครื่องมือเหล่านี้ทำหรือใช้ซ็อกเก็ต netlink

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

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

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

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


person BusDriverJoe    schedule 30.08.2013    source แหล่งที่มา
comment
คุณอาจต้องอธิบายว่าทำไมเครื่องมืออย่าง lsof จึงไม่ตรงกับความต้องการของคุณ   -  person Greg Hewgill    schedule 31.08.2013
comment
ใช่จริง ฉันควรจะพูดถึงเรื่องนั้นด้วย ขอบคุณสำหรับความคิดเห็น ฉันต้องการ daemon พื้นที่ผู้ใช้ที่ตรวจสอบซ็อกเก็ตตามเหตุการณ์ (ซ็อกเก็ตใหม่ ซ็อกเก็ตปิด ฉันคิดว่าโดยพื้นฐานแล้วเป็นการเรียกระบบที่เกี่ยวข้องกับซ็อกเก็ต) และรวบรวมข้อมูล เช่น โปรโตคอล พอร์ต และแอปพลิเคชันที่สร้างซ็อกเก็ต บางทีฉันอาจต้องการรวบรวมน้ำหนักบรรทุกของซ็อกเก็ตด้วย ดังนั้นกลไกเช่นในตัวอย่างที่มีโปรโตคอล netlink_route กับกลุ่มมัลติคาสต์จะมีประโยชน์มาก แต่เนื่องจากไม่มีเอกสาร ฉันจึงไม่สามารถเข้าใจได้ด้วยตนเอง :(   -  person BusDriverJoe    schedule 31.08.2013
comment
แล้วการใช้การตรวจสอบเพื่อตรวจสอบ syscalls ที่เกี่ยวข้องล่ะ? โดยการตรวจสอบซ็อกเก็ต syscall คุณสามารถทราบพอร์ตของกระบวนการได้ กำลังใช้   -  person yeger    schedule 26.02.2020


คำตอบ (1)


คุณสามารถลอง dtrace ได้หากทุกเครื่องมือที่คุณกล่าวถึงไม่สามารถตอบสนองความต้องการของคุณได้

person user650749    schedule 31.08.2013
comment
dtrace อาจเป็นวิธีแก้ปัญหาที่เป็นไปได้สำหรับปัญหาของฉัน ฉันเพิ่งเห็นมันสั้นๆ และดูเหมือนว่าข้อมูลที่ต้องการจะสามารถดึงออกมาได้ มีวิธีรันสิ่งนี้ในฐานะดีมอนและสื่อสารกับกระบวนการอื่นหรือไม่? เพราะตัวอย่างทั้งหมดที่ฉันเห็นจนถึงขณะนี้พิมพ์เหตุการณ์พร้อมข้อมูลไปยังคอนโซล - person BusDriverJoe; 31.08.2013
comment
popen() อาจช่วยในการใช้งานในโปรแกรมของคุณโดยส่งเอาต์พุตไปยังทุกที่ที่คุณต้องการ - person JuliandotNut; 09.08.2014