Làm thế nào để theo dõi hoạt động mạng của một lệnh?


13

Tôi muốn theo dõi hoạt động mạng của một lệnh, tôi đã thử tcpdump và strace mà không thành công.

Ví dụ: Nếu tôi đang cài đặt một gói hoặc sử dụng bất kỳ lệnh nào cố gắng truy cập một số trang web, tôi muốn xem hoạt động mạng đó (trang web mà nó cố gắng tiếp cận).

Tôi đoán chúng ta có thể làm điều này bằng cách sử dụng tcpdump. Tôi đã thử nhưng nó đang theo dõi tất cả các hoạt động mạng của hệ thống của tôi. Giả sử nếu tôi chạy nhiều lệnh liên quan đến mạng và tôi chỉ muốn theo dõi hoạt động mạng lệnh cụ thể, thì thời điểm đó rất khó để tìm ra giải pháp chính xác.

Có cách nào làm được việc này không?

CẬP NHẬT:

Tôi không muốn theo dõi mọi thứ trên giao diện mạng của mình. Tôi chỉ muốn theo dõi lệnh (ví dụ #yum install -y vim) hoạt động mạng. Chẳng hạn như trang web nó cố gắng tiếp cận.


1
Đặt ứng dụng trong một không gian tên mạng, sau đó sử dụng tcpdump / wireshark. Xem ví dụ ở đây .
dirkt

Câu trả lời:


17

netstat cho đơn giản

Sử dụng netstatvà grepping trên PID hoặc tên quy trình:

# netstat -np --inet | grep "thunderbird"
tcp        0      0 192.168.134.142:45348   192.168.138.30:143      ESTABLISHED 16875/thunderbird
tcp        0      0 192.168.134.142:58470   192.168.138.30:443      ESTABLISHED 16875/thunderbird

Và bạn có thể sử dụng watchđể cập nhật động:

watch 'netstat -np --inet | grep "thunderbird"'

Với:

  • -n: Hiển thị địa chỉ số thay vì cố gắng xác định tên máy chủ, cổng hoặc tên người dùng tượng trưng
  • -p: Hiển thị PID và tên của chương trình mà mỗi ổ cắm thuộc về.
  • --inet: Chỉ hiển thị ổ cắm giao thức thô, udp và tcp.

bước đi cho sự dài dòng

Bạn nói bạn đã thử stracecông cụ này, nhưng bạn đã thử tùy chọn này trace=networkchưa? Lưu ý rằng đầu ra có thể khá dài dòng, vì vậy bạn có thể cần một số grepping. Bạn có thể bắt đầu bằng cách tham gia "sin_addr".

 strace -f -e trace=network <your command> 2>&1 | grep sin_addr

Hoặc, đối với một quy trình đã chạy, hãy sử dụng PID:

 strace -f -e trace=network -p <PID> 2>&1 | grep sin_addr

+1 cho netstatIMHO là giải pháp đơn giản và gọn gàng nhất.
dr01

@Gohu Tôi đã làm tương tự cho dnf. nhưng không có may mắn Tôi đã thử cài đặt một số gói bằng cách sử dụng dnf, sau đó tôi thấy rằng quá trình dnf đang chạy (tên tiến trình: dnf theo lệnh top và ps aux). Đáng buồn thay, tôi đã không nhận được bất kỳ đầu ra từ netstat -np --inet | grep "dnf".
Buvanesh Kumar

+1 cho bước đi. Nó được giải quyết vấn đề của tôi. Tôi có thể lấy địa chỉ IP. Cảm ơn bạn rất nhiều vì câu trả lời của bạn :) @Gohu. Tôi đoán nó đang cung cấp cho tất cả các địa chỉ IP mà nó đạt được qua mạng (ví dụ IP của bộ định tuyến và các IP khác). Nếu bạn biết, có thể chỉ theo dõi IP đích không?
Buvanesh Kumar

Bạn có thể thử và lọc thêm straceđầu ra, chỉ giữ các connecttòa nhà và xóa dnsyêu cầu (cổng 53) với:| grep connect | grep -v 'sin_port=htons(53)'
Gohu

+1 cho tùy chọn mạng theo dõi trên strace
phreed


5

sysdig cho phép bạn giám sát tất cả hoạt động của kernel hoặc một số lệnh đang chạy trong hệ thống của bạn, bao gồm và không bị hạn chế đối với hoạt động mạng.

Vì đầu ra có thể lớn, bạn phải xây dựng các bộ lọc, trang mặc định cho các bộ lọc cơ bản nhất là khá dễ hiểu.

Nó cũng có lợi thế là nó không được sử dụng như một trình bao bọc ứng dụng như trong stracevà nó có thể khá mạnh mẽ.

Từ ví dụ Sysdig

Mạng

Xem các quy trình hàng đầu về việc sử dụng băng thông mạng

sysdig -c topprocs_net 

Hiển thị dữ liệu mạng được trao đổi với máy chủ 192.168.0.1

Như nhị phân:

sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1   

Như ASCII:

sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1 

Xem các cổng máy chủ cục bộ hàng đầu:

Về mặt kết nối được thiết lập:

sysdig -c fdcount_by fd.sport "evt.type=accept"   

Xét về tổng số byte:

sysdig -c fdbytes_by fd.sport 

Xem IP khách hàng hàng đầu

Về mặt kết nối được thiết lập

sysdig -c fdcount_by fd.cip "evt.type=accept"   

Xét về tổng số byte

sysdig -c fdbytes_by fd.cip 

Liệt kê tất cả các kết nối đến không được phục vụ bởi apache.

sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"

1

Bạn có thể sử dụng wireshark để đánh hơi tất cả lưu lượng đầu vào và đầu ra của giao diện mạng. Trong trường hợp bạn cần một tùy chọn không có GUI, bạn có thể sử dụng tshark.

Với cả hai tùy chọn, bạn có thể xem tất cả lưu lượng truy cập mạng và lưu nó để sau đó phân tích tất cả các kết nối được thiết lập.


1
Như tôi đã nói trước đó, nếu tôi chạy nhiều lệnh liên quan đến mạng, thì làm sao tôi biết lệnh nào đang nhận trang web nào?
Buvanesh Kumar

Đây là một câu trả lời chung chung hơn. Điều đó tôi đã biết rằng chúng ta có thể theo dõi hoạt động mạng của giao diện mạng :). Tôi đang tìm kiếm để theo dõi một thống kê mạng lệnh cụ thể.
Buvanesh Kumar

Nếu bạn biết cổng nào sử dụng lệnh, bạn có thể lọc sniff để giới hạn lệnh đó theo lệnh bạn muốn. Tuy nhiên điều này có thể không thực hiện được trong tình huống của bạn.
Ricard Molins
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.