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?
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?
Câu trả lời:
Đ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/tun
và 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:
struct tun_struct
(TUN và TAP phần lớn chia sẻ cùng một cấu trúc dữ liệu).Trong thực tế, tôi nghi ngờ 2 không xảy ra nhiều. Kiểm tra một openvpn
quy trình lsof
cho 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/tun
là 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
/ tapX
thiế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.conf
dẫn đến một vpn-foo
thiế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.
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
% 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 -ef
các quá trình qemu, ví dụ, qemu-system-x86_64 -enable-kvm -name debian-8
thật dễ dàng để tìm ra VM pid và giao diện tương ứng.
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
ifconfig
không hiển thị thông tin này. Xin lưu ý bạn, đây là những tap
thiế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.
nmap
, nhưng tôi không chắc làm thế nào để thành thật.