Sniff ổ cắm tên miền UNIX


9

Tôi biết rằng một số quy trình đang ghi vào một socket miền unix nhất định ( /var/run/asterisk/asterisk.ctl), nhưng tôi không biết pid của người gửi. Làm thế nào tôi có thể tìm ra ai đang viết vào ổ cắm? Tôi đã thử với:

sudo lsof /var/run/asterisk/asterisk.ctl

nhưng nó chỉ liệt kê chủ sở hữu của ổ cắm. Tôi muốn biết ai đang viết / đọc vào ổ cắm này và tôi cũng muốn đánh hơi dữ liệu. Điều này có thể không?

Câu trả lời:


4

Các câu trả lời ngắn là không và không dễ dàng.

Trên Linux lsof dựa vào /proc/net/unixđể lấy thông tin liên quan đến các socket miền UNIX. Giao diện này liệt kê tất cả các ổ cắm bị ràng buộc, nhưng nó không theo dõi các điểm cuối. Vì vậy, bạn có thể thấy những gì ổ cắm tồn tại, nhưng bạn không thể thấy những gì được kết nối với chúng. Đâu đó thông tin này là theo dõi, nó phải được theo dõi nếu không các kết nối ổ cắm sẽ không hoạt động. Tôi vẫn chưa tìm thấy bất kỳ cơ chế để lấy thông tin kết nối.

Câu hỏi đánh hơi thú vị hơn một chút, nhưng không kém phần thất vọng. Điều tôi muốn nói là "không dễ dàng" là không tồn tại bất kỳ móc nối nào để lẻn vào và grap dữ liệu đó. Tương tự gần nhất là sử dụng tcpdump hoặc Wireshark, cả hai đều sử dụng libpcap để thực sự nâng vật nặng. Trong khi cả mạng (AF_INET) và tên miền UNIX (AF_UNIX) đều được tạo bằng lệnh socket()gọi hàm, cả hai đều sử dụng connect()để kết nối, cả sử dụng read()write() xử lý dữ liệu, chúng được xử lý bởi các hệ thống con hạt nhân khác nhau. Điều này có tác dụng phụ đáng tiếc là libpcap không được thiết kế để hoạt động với các socket miền UNIX.

Có một khía cạnh ít mờ hơn cho vấn đề. Hãy xem trang người đàn ông cho recv(2). Đây là một cuộc gọi hệ thống cấp thấp hơn read()sử dụng. Có một lá cờ recv()được gọi MSG_PEEK. Điều này sẽ cho phép bạn đánh hơi lưu lượng đi qua một ổ cắm tên miền UNIX. Vì vậy, đó là mặt sáng, mặt tối là theo hiểu biết tốt nhất của tôi, không tồn tại bất kỳ ứng dụng hiện tại nào được thiết kế để làm điều này. Vì vậy, bạn đang xem xét một số nỗ lực phát triển.

Tôi thực sự muốn có được một câu trả lời đơn giản tốt đẹp của F'YEAH để cả hai phần của câu hỏi của bạn.


11

Vâng, bạn có thể làm điều này. Tất cả bạn cần là systemtap.

Hãy xem xét một trong các tập lệnh systemtap ví dụ sẽ in ra PID và tên quy trình của bất kỳ chương trình nào đọc hoặc ghi một inode được chỉ định (và ổ cắm tên miền Unix của bạn chỉ là một thứ như vậy).

Bạn có thể sửa đổi tầm thường tập lệnh này để in dữ liệu thực tế đang đọc / ghi; Tôi sẽ làm như vậy như một bài tập cho người đọc.


3

Tôi biết điều này không trả lời được câu hỏi chính, nhưng tôi đã kết thúc ở đây, tìm kiếm chỉ để đánh hơi thông tin liên lạc trên một ổ cắm. Tôi đã quyết định đăng bài cho những người khác như tôi. Đây là cách tôi đã làm:

$> sudo socat -t100 -x -v UNIX-LISTEN: /var/run/php5-fpm.sock.socat,mode=777,reuseaddr,

Bạn có thể xóa -x và chỉ để lại -v cho giao tiếp ascii. Hy vọng rằng sẽ giúp được ai đó.


hoạt động hoàn hảo
JSmyth

-1

socat -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

Không có sự trùng lặp đầu ra, không có đầu ra theo chu kỳ. Lỗi của nhận xét trước ".sock.socat"


2
Mặc dù đó có thể là một lệnh hữu ích, vui lòng thêm một số giải thích / làm rõ (và nó khác với câu trả lời này như thế nào?)
HBruijn

Tôi xin lỗi. Không có sự trùng lặp đầu ra, không có đầu ra theo chu kỳ. Lỗi của nhận xét trước ".sock.socat"
srvf
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.