Làm thế nào để biết nếu một quá trình được gắn vào một giao diện tap?


9

Thỉnh thoảng tôi gặp máy có giao diện nhấn (ví dụ: khi KVM đang chạy). Làm cách nào để biết quy trình nào được đính kèm với giao diện TAP?


Tôi nghi ngờ bạn có thể làm điều này với nmap, nhưng tôi không chắc làm thế nào để thành thật.
Alex Chamberlain

Câu trả lời:


2

Điều này khiến tôi băn khoăn và tôi đã xem xét nguồn nhân Linux (Tôi cho rằng câu hỏi của bạn là về Linux).

Có vẻ như câu trả lời khó hơn bạn mong đợi. Đây TUN / TAP API hướng dẫn trang Mời một số cái nhìn sâu sắc . Về cơ bản, chương trình của bạn phân bổ một thiết bị TUN / TAP mới bằng cách mở /dev/net/tunvà gửi nó TUNSETIFF ioctl. Nếu mọi việc suôn sẻ, một giao diện được tạo, kernel cung cấp cho bạn tên của nó và một bộ mô tả tệp và đó là cách bạn quản lý nó.

Có hai sản phẩm khai thác ở đây:

  1. Hạt nhân không lưu trữ PID của quá trình đã gửi ioctl trong struct tun_struct(TUN và TAP phần lớn chia sẻ cùng một cấu trúc dữ liệu).
  2. Một quá trình có thể đánh dấu một giao diện là liên tục, đóng bộ mô tả tệp của nó và sau đó sử dụng nó như một giao diện mạng bình thường.

Trong thực tế, tôi nghi ngờ 2 không xảy ra nhiều. Kiểm tra một openvpnquy trình lsofcho thấy nó vẫn có bộ mô tả tệp cho thiết bị TAP mở và rõ ràng đang sử dụng nó, nhưng vì /dev/net/tunlà một loại thiết bị ghép kênh như /dev/ptmx, bạn có thể sử dụng lsofđể tìm hiểu các quy trình hiện đang sử dụng thiết bị TUN / TAP, nhưng bạn không thể biết quá trình đang sử dụng thiết bị gì.

Có những cách xiên để giải quyết vấn đề tiềm ẩn. Đối với OpenVPN, tôi sử dụng tập lệnh thiết lập đường hầm đặt tên cho tunX/ tapXthiết bị có tên mô tả hơn bao gồm tên cơ sở của tệp cấu hình OpenVPN. Vì vậy, /etc/openvpn/foo.confdẫn đến một vpn-foothiết bị. Sau đó, tôi có thể tương quan quá trình OpenvVPN với giao diện mà nó đang sử dụng. Mặc dù vậy, chúng tôi chưa phải làm điều này với QEmu / KVM.


Đồng ý. Tôi cũng nghi ngờ rằng "ghép kênh" / dev / net / tun sẽ ngăn chúng tôi biết giao diện nhấn chính xác là một quá trình được đính kèm.
dùng368507

5

Mỗi mô tả tập tin có một mục / Proc / pid / fdinfo / num , như:

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

Vì vậy, với tên giao diện, bạn có thể lấy pid bằng:

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

Hoạt động với tôi: % sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3' 4143 % pgrep qemu 4143 Với thực tế là có một tham số tên được hiển thị trong đầu ra của ps -efcác quá trình qemu, ví dụ, qemu-system-x86_64 -enable-kvm -name debian-8thật dễ dàng để tìm ra VM pid và giao diện tương ứng.
Dmitrii S.

1

Trên FreeBSD hoặc bất kỳ dẫn xuất BSD nào khác:

ifconfig tap0

sẽ cho bạn thấy quá trình nào được kết nối với giao diện:

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

Hệ điều hành và phiên bản nào bạn đang thử điều này? Sẽ rất hữu ích khi có thông tin này (Tôi chạy một hộp có hàng tá điểm cuối VPN), nhưng Debian ifconfigkhông hiển thị thông tin này. Xin lưu ý bạn, đây là những tapthiết bị được tạo bởi OpenVPN - mặc dù tôi không hiểu tại sao nên có sự khác biệt.
Alexios

Đây là về FreeBSD hoặc bất kỳ dẫn xuất BSD nào khác.
kworr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.