Làm cách nào tôi có thể theo dõi tất cả các yêu cầu / kết nối gửi đi từ máy của mình?


71

Máy của tôi là một máy chủ vì vậy tôi muốn bỏ qua các kết nối được thực hiện với máy chủ của mình (ví dụ: khi ai đó truy cập trang web của tôi). Tôi muốn chỉ xem các kết nối / yêu cầu được thực hiện bởi máy chủ của tôi đến những nơi khác.

Làm thế nào để tôi chỉ nhìn thấy những kết nối đi?

EDIT: Tôi chưa quen với những thứ này. Những gì tôi đang cố gắng làm chỉ là xem liệu có bất cứ thứ gì từ máy chủ của tôi được gửi đi ngoài dữ liệu cho các ứng dụng web của tôi không. Ví dụ: nếu ai đó truy cập trang web của tôi, thì rõ ràng máy chủ của tôi sẽ gửi dữ liệu tới trình duyệt của khách hàng. Nhưng giả sử cũng có mã ở đâu đó trong khung ứng dụng web của tôi gửi dữ liệu thống kê đến một nơi khác mà tôi không biết. Tôi muốn thấy những nơi mà máy chủ của tôi đang gửi dữ liệu tới, nếu có. Có thể không có khả năng, nhưng giả sử bạn quyết định sử dụng khung php hoặc nodejs mà bạn không viết: có một cơ hội nhỏ nó có thể gửi một số loại dữ liệu ở đâu đó. Nếu vậy, đó là những gì tôi muốn thấy.

Câu trả lời:


77

Sử dụng netstat. Ví dụ

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

liệt kê tất cả các kết nối gửi đi UDP ( u), TCP ( t) và RAW ( w) (không sử dụng lhoặc a) ở dạng số ( n, ngăn các truy vấn DNS chạy dài có thể) và bao gồm chương trình ( p) được liên kết với điều đó.

Xem xét thêm ctùy chọn để có được đầu ra được cập nhật liên tục.


Cảm ơn. Đó là thông tin tốt. Bạn có thể xem câu hỏi cập nhật của tôi?
trusktr

1
Không tặc hoàn toàn không phù hợp (ngoại trừ câu trả lời này đã được giải quyết tốt): Câu trả lời này cũng hoạt động với Windows. Để sử dụng netstattrong "chế độ liên tục" ở đó, -ckhông hoạt động. Bạn sử dụng các số thay vào đó, như netstat -na 1 | find "[Scan_Host_IP_Addr]"để nó cập nhật mỗi 1giây (trong ví dụ này). ( nguồn ).
ruffin

4
Cuộc thăm dò ý kiến ​​này, vì vậy nó sẽ không luôn luôn bắt tất cả các kết nối.
Revierpost

Có cách nào để hiển thị thông tin thân thiện hơn với người dùng như tên miền, thông tin về ip không? Có lẽ sử dụng một kịch bản tùy chỉnh?
awm 19/03/17

@awm Vâng, điều đó có thể thực hiện được stracetrong quá trình, lọc tìm kiếm máy chủ tên (không có chi tiết, đây không phải là câu trả lời đầy đủ cho nó). Ngoài ra, bạn có thể hiển thị DNS ngược của các IP được liệt kê netstatbằng cách bỏ qua ntùy chọn có trong câu trả lời của tôi.
gertvdijk

11

Nếu bạn chỉ muốn đăng nhập mọi nỗ lực kết nối, thì cách dễ nhất có lẽ là iptables LOGnhắm mục tiêu trên Linux (hoặc tính năng ghi nhật ký tường lửa tương đương trên hệ thống của bạn).

Nếu bạn cần thêm thông tin như thời lượng kết nối và lượng dữ liệu trao đổi theo cả hai hướng, thì conntrackd(trên Linux) có lẽ là lựa chọn tốt nhất.

Tuy nhiên, lưu ý rằng hai mục trên chỉ ghi nhật ký lưu lượng truy cập qua bộ lọc mạng, thường là tất cả lưu lượng nhưng không lưu lượng tài khoản được tạo với ngăn xếp IP trong không gian người dùng (như máy ảo hoặc bất cứ thứ gì sử dụng ổ cắm thô) hoặc lưu lượng cầu.

Đối với các giải pháp tổng quát hơn, bạn có thể có một cái nhìn vào những thứ như argus, bro-ids, sancphoặc ntopđó đăng nhập tất cả các loại thông tin dựa trên lưu lượng họ sniff trên một giao diện.


8

Tôi đã thử một loạt các công cụ, bao gồm iftop, ntop, iptraf, và tất nhiên là built-in rất hữu ích netstat -tupln(tùy chọn được hỗ trợ là hệ điều hành phụ thuộc), nhưng thực tế nhất đối với trường hợp sử dụng của tôi hóa ra là nethogs- nó tập hợp các kết nối bởi các nguồn gốc ứng dụng , và là ít ồn ào nhất trong tất cả.

Có thể cài đặt qua:

sudo apt-get install nethogs

Chạy bằng root:

sudo nethogs

Nếu mục tiêu của bạn là chỉ nhìn thấy tất cả các kết nối TCP được khởi tạo bởi bất kỳ ứng dụng nào thì bạn có thể sử dụng:

sudo tcpdump -i lo -A | grep Host:

6

Những gì tôi nghĩ bạn muốn làm là lấy một danh sách các cổng nghe và sau đó loại bỏ chúng khỏi bất kỳ kết nối TCP nào khác, sau đó sẽ là tất cả các kết nối đi. Lệnh ss (trạng thái ổ cắm) xuất ra các cột "Địa chỉ cục bộ: Cổng" và "Địa chỉ ngang hàng: Cổng", chúng ta cần xóa các cổng nghe khỏi cột "Địa chỉ cục bộ: Cổng" chứ không phải cột "Địa chỉ ngang hàng: Cổng", nếu không bạn có thể bỏ lỡ một số kết nối đi. Vì vậy, để đạt được điều đó tôi đang sử dụng \s{2}+đằng sau chuỗi ": $ port" trong grep để khớp với các khoảng trắng tồn tại phía sau cột "Địa chỉ cục bộ: Cổng"; cột đó có hai hoặc nhiều khoảng trắng phía sau nó, trong đó "Địa chỉ ngang hàng: Cổng" có một khoảng trắng và sau đó là một dòng mới (grrr ... chỉ nên có một dòng mới, IMO,\s+\s{2}+.) Thông thường tôi có thể thử sử dụng chức năng lọc của ss, như với ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Nhưng có vẻ như có một giới hạn về thời gian chuỗi đó có thể kéo dài, nó đã ném bom vào một hệ thống nơi tôi có rất nhiều cổng nghe. Vì vậy, tôi đang cố gắng làm điều tương tự với grep. Tôi tin rằng những điều sau đây sẽ làm việc:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

Lưu ý điều này phụ thuộc vào phiên bản ss bạn đang sử dụng, các phiên bản cũ hơn (như: tiện ích ss, iproute2-ss111117) có định dạng đầu ra khác nhau, vì vậy bạn có thể phải sử dụng $ 3 thay vì $ 4 trong awk. Cũng lưu ý ss -tlnss -tn state listeningcung cấp cho bạn đầu ra khác nhau, đó là một chút phản trực giác với tôi. YMMV.

Tôi tìm thấy một giải pháp thanh lịch hơn một chút mà không cần biết IP của máy chủ, ss -tn state established dst :*hoạt động tốt, tôi đã sửa đổi các dòng lệnh ở trên.


Bạn vui lòng thêm một số giải thích về cách thức này hoạt động? ( Chỉnh sửa câu trả lời; không đăng thông tin làm rõ dưới dạng nhận xét.) Tôi nghĩ rằng tôi đã phần nào tìm ra nó. Có vẻ như nó có thể cần thêm một chút công việc. Tôi đã chạy ss -tn state listeningtrên một máy chủ chạy máy chủ FTP và tự nhiên lệnh cho thấy máy đang lắng nghe cổng 21. Vì vậy, điều đó không có nghĩa là egrep -vsẽ lọc bất kỳ máy chủ từ xa nào có địa chỉ IP bao gồm "21" (bao gồm cả "210 "," 211 "," 212 ", ...)? Ngoài ra, là asortthực sự cần thiết, hoặc chỉ mặc quần áo cửa sổ?
G-Man

Tôi đã phải sửa khá nhiều thứ, kịch bản đã sửa ở trên.
Dale

Cuối cùng, nó sẽ đẹp hơn rất nhiều nếu ss hoặc netstat chỉ bao gồm chức năng này trong đó. Làm một ss --outđể có được một danh sách các kết nối đi.
Dale

Đẹp, tôi thích câu trả lời này. Tôi sẽ dùng thử khi tôi quay lại cải thiện bảo mật trên máy chủ của mình. : D
trusktr

Có vẻ như điều này cũng có thể được sử dụng cho UDP, nhưng bạn chỉ cần sử dụng các cờ và trạng thái khác nhau.
Dale

4

tcpdumpcho phép bạn xem tất cả lưu lượng IP chảy đến / từ một giao diện cụ thể với khả năng lọc dựa trên các tiêu chí nhất định. tcpdumpthường được cài đặt trên hầu hết các hệ thống * nix theo mặc định, nếu không thường có một cổng ở đâu đó để lấy nó cho bản phân phối cụ thể của bạn.



1

Nếu bạn chạy Solaris hoặc một công cụ phái sinh, hãy xem conntrack


Thật tuyệt, điều đó cũng có sẵn trên Arch Linux: archlinux.org/packages/community/i686/conntrack-tools - Bạn có thể cung cấp một ví dụ về cách bạn sử dụng conntrack để chỉ xem các kết nối bắt đầu từ địa phương chứ không phải kết nối bắt đầu từ nơi khác?
trusktr
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.