Làm thế nào tôi có thể tìm thấy quá trình gửi dữ liệu đến một cổng cụ thể?


21

Tôi có một dịch vụ, giữ một cổng nhất định mở.

Tôi đang lấy dữ liệu cho nó, mà tôi không mong muốn cũng không muốn lấy và tôi đang cố xác định nguồn gốc của dữ liệu này. Vậy làm thế nào tôi có thể tìm thấy quá trình nào gửi dữ liệu đến một cổng cụ thể, trái ngược với quá trình đang lắng nghe.

Câu trả lời:


23

Đối với TCP (mặc dù cách tiếp cận tương tự sẽ hoạt động đối với SCTP 1 hoặc bất kỳ giao thức truyền tải hướng kết nối nào), giống như tìm kiếm các giao thức nghe:

lsof -nPi tcp:the-port

Sẽ báo cáo các quy trình có ổ cắm TCP mở trên cổng đó. Nếu bạn biết cổng nguồn (ứng dụng máy chủ của bạn có thể biết về nó và đăng nhập nó), bạn có thể sử dụng cổng đó để xác định chính xác máy khách lừa đảo.

Đối với ổ cắm UDP hoặc RAW, sẽ khó hơn mặc dù tôi cho rằng đó là nơi mà một thứ như systemtap hoặc dtrace có thể trở nên tiện dụng. Có thể Audd là tốt.


1 Mặc dù hỗ trợ SCTP (chỉ trên Linux) đã được thêm vào lsoftrong phiên bản 4.86, nhưng bạn không thể sử dụng -iđể yêu cầu ổ cắm SCTP một cách rõ ràng. Ở đây có thể sử dụng lsof -nP | grep -w 'SCTP.*:the-port'như một heuristic thay thế.


Điều này không làm việc cho SCTP cho tôi.
sudo

1
@sudo, xem chỉnh sửa
Stéphane Chazelas

3

Hãy thử làm theo:

$sudo ss -tp

Hoặc là:

$sudo netstat -A inet -p

Để tránh kết quả localhost:

$sudo netstat -A inet -p | grep -v localhost

Để liệt kê chỉ các kết nối THÀNH LẬP:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED

2

Tùy thuộc vào loại kết nối mà nó thiết lập để gửi dữ liệu, một trong những cách tiếp cận này sẽ đưa bạn đến một nơi nào đó.

  • Sử dụng tcpdump port 1234để có được dữ liệu được gửi đến cổng này. Bạn có thể sử dụng một chương trình như Wireshark để phân tích nó trên một máy khác (được ghi vào tệp bằng -wtùy chọn). Ngoài ra, sử dụng Wireshark trực tiếp.

  • Trong trường hợp nó thiết lập và tiếp tục mở kết nối tcp / udp, bạn có thể sử dụng netstatđể tìm IP từ xa của kết nối.

  • Liệt kê các ổ cắm mở của một quy trình như trong câu trả lời được cung cấp bởi @StephaneChazelas.


1

Bạn có thể sử dụng sockstatlệnh để tìm quá trình đã bắt đầu kết nối với dịch vụ của bạn trên máy chủ cục bộ.

DESCRIPTION
     The sockstat command lists open Internet or UNIX domain sockets.

Chỉ cần phù hợp với tất cả các kết nối nguồn đến đích của bạn. Điều này hoạt động tốt cho TCP / UDP / UNIXsockets.


0

Trên Solaris, việc chạy pfiles trên tất cả các quy trình sẽ hiển thị các quy trình nào có kết nối nào mở. Nó sẽ yêu cầu một số lưu trữ cẩn thận, có thể sử dụng các tùy chọn -A, -B của ggrep ...

Trên Linux, netstat -anp --inetsẽ hoạt động, ngay cả khi không cài đặt lsof. (bỏ --inetđi để có được ổ cắm tên miền Unix)

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.