จะทราบได้อย่างไรว่ากระบวนการเชื่อมต่อกับส่วนต่อประสานการแตะหรือไม่?


9

บางครั้งฉันก็พบกับเครื่องด้วยการเชื่อมต่อแบบแตะ (เช่นเมื่อ KVM กำลังทำงาน) ฉันจะรู้ได้อย่างไรว่ากระบวนการใดที่ต่อกับอินเตอร์เฟส TAP?


ฉันสงสัยว่าคุณสามารถทำได้ด้วยnmapแต่ฉันไม่แน่ใจว่าจะซื่อสัตย์อย่างไร
อเล็กซ์แชมเบอร์เลน

คำตอบ:


2

สิ่งนี้ทำให้ฉันสงสัยและฉันได้ดูที่แหล่งเคอร์เนล Linux (ฉันสมมติว่าคำถามของคุณเกี่ยวกับ Linux)

ดูเหมือนคำตอบจะยากกว่าที่คุณคาดไว้ นี้TUN / TAP หน้า API กวดวิชามีความเข้าใจบางอย่าง โดยทั่วไปโปรแกรมของคุณจัดสรรอุปกรณ์ TUN / TAP ใหม่โดยการเปิดและการส่งมัน/dev/net/tun TUNSETIFF ioctlหากทุกอย่างเป็นไปด้วยดีอินเทอร์เฟซจะถูกสร้างขึ้นเคอร์เนลจะให้ชื่อและตัวอธิบายไฟล์ของคุณและนั่นคือวิธีที่คุณจัดการ

ที่นี่มีสองจับ:

  1. เคอร์เนลไม่ได้เก็บ PID ของกระบวนการที่ส่ง ioctl ในstruct tun_struct(TUN และ TAP ส่วนใหญ่ใช้โครงสร้างข้อมูลเดียวกันร่วมกัน)
  2. กระบวนการอาจทำเครื่องหมายอินเตอร์เฟสว่าเป็นแบบถาวรให้ปิดไฟล์ descriptor และหลังจากนั้นใช้เป็นเน็ตเวิร์กอินเตอร์เฟสปกติ

ในทางปฏิบัติฉันสงสัยว่า 2 ไม่ได้เกิดขึ้นมาก การตรวจสอบopenvpnกระบวนการด้วยการlsofเปิดเผยยังคงมีตัวอธิบายไฟล์ของมันไปยังอุปกรณ์ TAP ที่เปิดอยู่และใช้งานอย่างเห็นได้ชัด แต่เนื่องจาก/dev/net/tunเป็นอุปกรณ์มัลติเพล็กซิ่งเช่น/dev/ptmxคุณสามารถใช้lsofเพื่อค้นหาว่ากระบวนการใดกำลังใช้อุปกรณ์ TUN / TAP คุณไม่สามารถรู้ได้ว่ากระบวนการใช้อุปกรณ์อะไร

มีวิธีการเอียงในการแก้ปัญหาพื้นฐาน สำหรับ OpenVPN ฉันใช้สคริปต์การตั้งค่าช่องสัญญาณที่ตั้งชื่อtunX/ tapXอุปกรณ์ด้วยชื่อที่มีความหมายมากกว่าซึ่งรวมถึงชื่อไฟล์พื้นฐานของไฟล์กำหนดค่า OpenVPN ดังนั้น/etc/openvpn/foo.confนำไปสู่vpn-fooอุปกรณ์ จากนั้นฉันสามารถเชื่อมโยงกระบวนการ OpenvVPN กับอินเทอร์เฟซที่ใช้งานอยู่ แม้ว่ายังไม่ได้ทำเช่นนี้กับ QEmu / KVM


ตกลง. ฉันสงสัยเช่นกันว่า "มัลติเพล็กซิ่ง" / dev / net / tun จะป้องกันเราให้ทราบว่าอินเทอร์เฟซการแตะใดที่กระบวนการเชื่อมต่อกัน
user368507

5

ไฟล์ descriptor แต่ละไฟล์มีรายการ / proc / pid / fdinfo / numเช่น:

# cat /proc/24332/fdinfo/28
pos:    0
flags:  0104002
mnt_id: 18
iff:    tap0123acdc-66

ดังนั้นด้วยชื่ออินเตอร์เฟสคุณสามารถรับ pid ด้วย:

# egrep -l iff:.*tap0123acdc-66 /proc/*/fdinfo/* 2>/dev/null|cut -d/ -f3
24332

ใช้งานได้สำหรับฉัน: % sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3' 4143 % pgrep qemu 4143 เนื่องจากความจริงที่ว่ามีพารามิเตอร์ชื่อที่แสดงในผลลัพธ์ของps -efกระบวนการ qemu เช่นqemu-system-x86_64 -enable-kvm -name debian-8มันควรจะง่ายต่อการค้นหาซึ่ง VM pid และอินเตอร์เฟซที่สอดคล้องกับ
Dmitrii S.

1

บน FreeBSD หรืออนุพันธ์ BSD อื่น ๆ :

ifconfig tap0

ควรแสดงกระบวนการที่เชื่อมต่อกับอินเทอร์เฟซ:

tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=80000<LINKSTATE>
    ether 58:9c:fc:10:8f:2b
    groups: tap
    media: Ethernet autoselect
    status: active
    nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
    Opened by PID 2672

คุณลองใช้ระบบปฏิบัติการและเวอร์ชั่นอะไร มันจะเป็นประโยชน์อย่างมากในการรับข้อมูลนี้ (ฉันเรียกใช้กล่องที่มีปลายทาง VPN หลายสิบ) แต่ Debian ifconfigไม่แสดงสิ่งนี้ โปรดทราบว่าtapอุปกรณ์เหล่านี้สร้างโดย OpenVPN - แม้ว่าฉันจะไม่เห็นเหตุผลที่ควรมีความแตกต่าง
Alexios

นี่คือ FreeBSD หรืออนุพันธ์ BSD อื่น ๆ
kworr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.