Tôi có thể theo dõi một ổ cắm tên miền unix cục bộ như tcpdump không?


59

Tôi muốn theo dõi các phản hồi trên ổ cắm unix mà không làm phiền các kết nối ban đầu và chuyển chúng thành tập lệnh để xử lý.

Tôi biết làm thế nào để làm điều này với tcpdump cho các kết nối tcp nhưng dường như tôi không thể tìm ra giải pháp cho các ổ cắm unix cục bộ.

Điều này thậm chí có thể?


Câu trả lời:


15

Có một anh chàng tuyên bố sẽ làm như vậy bằng cách tạo một ứng dụng hoạt động như một cửa ngõ giữa hai ổ cắm và ghi lại tất cả dữ liệu chảy. Vì vậy, bạn không thể chạm vào ổ cắm nhưng nếu bạn có thể khởi động lại dịch vụ và điều chỉnh nó để sử dụng ứng dụng này, bạn sẽ có thể thấy tất cả lưu lượng truy cập.

Đây là liên kết đến bài viết: Unix Socket Sniffer

Có một cách khác là bạn cần tìm id quá trình được gắn vào ổ cắm, sau đó tìm với lsof bộ mô tả tệp của ổ cắm và sau đó nhấn vào bộ mô tả tệp bằng cách sử dụng strace.

Nếu bạn có thể dừng bất cứ ứng dụng khách / máy chủ nào đang sử dụng ổ cắm và cấu hình lại thì tôi sẽ khuyên bạn nên luôn luôn là phương pháp đầu tiên, phương pháp thứ hai rất khó và yêu cầu bạn nhấn vào một quy trình hiện tại mà trên một số ứng dụng có thể khiến nó bị sập.

Hy vọng ai đó soi sáng chúng ta bằng cách anoter :)

Chúc may mắn


Yah, bạn có thể thực hiện phương pháp trung gian cũng với socat nhưng tôi hy vọng một cách trực tiếp hơn mà không sửa đổi các cài đặt hiện có ở nơi khác.
ck_

1
Sau đó, lsof và sải bước đó là cách duy nhất tôi biết. Cảnh giác trên produciton khi bạn tách rời khỏi quy trình, kiểm tra xem mọi thứ có tiếp tục chạy sau đó không.
Valor

3
Sau khi đào một số chi tiết xung quanh tôi tìm thấy một câu hỏi tương tự với một số chi tiết về lý do tại sao đây không phải là trực tiếp càng tốt hơn trên stackoverflow stackoverflow.com/questions/8394613/...
ck_

80

bạn có thể sử dụng socat.

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

Điều gì đang xảy ra ở trên: Đầu tiên di chuyển ổ cắm ban đầu sang sock.origen. Socat tạo một ổ cắm mới ('UNIX-LISTEN') ở vị trí ban đầu và chuyển tiếp tất cả sang bản gốc ('UNIX-kết nối'). Các -v nói với socat cũng in đầu ra thành STDERR.


3
Quan tâm để thêm một chút giải thích?
Kazark

4
Điều đó thật dễ dàng khi ổ cắm unix gốc có đường dẫn trên hệ thống tập tin. Nhưng nếu đó là một ổ cắm unix không gian tên trừu tượng mà bạn thực sự không thể di chuyển thì sao?
Valerio Schiavoni

6

Bạn cũng có thể thử sử dụng strace trên một trong các quy trình ở hai bên của ổ cắm, vì điều này sẽ cho phép bạn xem những gì được viết / đọc. Tôi tìm thấy trong môi trường sản xuất của mình, tôi không có socat, nhưng có bước đi.

Đối với bất kỳ mục đích hữu ích nào, việc thiết lập một cái gì đó lớn là điều bắt buộc.


Điều này làm việc tốt cho tôi, và dễ làm. Sử dụng strace -p <pid>để xem một quá trình chạy.
Matt Munson

lệnh nhanh: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logvà sau đó chạy thử nghiệm. Bạn có /tmp/php.log để từ từ kiểm tra xem nhật ký có quá lớn không. Nếu bạn đang nhận được quá nhiều lưu lượng truy cập, hãy thực hiện một yêu cầu với chuỗi truy vấn có tên của bạn hoặc một cái gì đó để bạn có thể tìm kiếm nó trong nhật ký
higuita

1
@higuita Tôi biết đó là một thời gian dài, nhưng thay vì vòng lặp đó, bạn có thể cho phép printfxử lý sự lặp lại. printf " -p %s" $(pidof php5-fpm)sẽ tiền tố mỗi đối số pid với -pvà thực tế hơn nhiều để viết.
JoL

2
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

sau đó:

sudo tcpdump -i lo -netvv port 8089

elififeco! Cảm ơn
typelogic
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.