Làm cách nào tôi có thể nắm bắt lưu lượng mạng của một quy trình?


93

Tôi muốn kiểm tra lưu lượng truy cập mạng được xử lý bởi một quy trình duy nhất, nhưng việc bắt giữ mạng đơn giản sẽ không hoạt động vì tôi đang xử lý một hệ thống bận rộn như vậy (rất nhiều lưu lượng khác xảy ra cùng một lúc). Có cách nào để cô lập một tcpdumphoặc wiresharknắm bắt lưu lượng truy cập mạng của một quy trình cụ thể không? (Sử dụng netstatlà không đủ.)

Câu trả lời:


21

Thật vậy, có một cách, sử dụng các bộ lọc Wireshark . Nhưng bạn không thể lọc trực tiếp theo tên quy trình hoặc PID (vì chúng không phải là số lượng mạng).

Trước tiên bạn nên tìm ra các giao thức và các cổng được sử dụng bởi quy trình của bạn ( lệnh netstat trong nhận xét trước hoạt động tốt).

Sau đó, sử dụng Wireshark để lọc cổng vào (hoặc ra) với cổng bạn vừa lấy. Điều đó sẽ cô lập lưu lượng đến và đi của quy trình của bạn.


6
Đối với một kết nối đơn giản, điều này là có thể, nhưng tôi cần phải theo dõi DNS, HTTP, vv, mà tất cả đang gấp rút quá khứ, do đó không phải là một cách đơn giản để chỉ sử dụng netstatvà các bộ lọc chụp mạng đơn giản trên một máy bận.
Kees Cook

Ok, cổng công cộng HTTP và DNS được sử dụng bởi rất nhiều ứng dụng, nhưng cổng riêng tương ứng là duy nhất. Vậy tại sao bạn không thử lọc bằng cổng riêng?
OpenNingia

Bởi vì những yêu cầu nhỏ nhanh chóng sẽ không được nhìn thấy bởi netstat; Tôi sẽ chỉ có thể bắt các kết nối lâu dài. :(
Kees Cook

Điều gì xảy ra nếu quá trình sử dụng các cổng động trong thời gian chạy, thì bạn sẽ không thể sử dụng các bộ lọc cổng tĩnh
Unix Janitor

Tôi nghĩ rằng bạn đã có câu trả lời tốt nhất ... Đáng buồn là một công cụ đánh hơi mạng hoạt động ở mức thấp nhất của ngăn xếp mạng, cố gắng nắm bắt mọi thứ, nó hoàn toàn không biết về các quy trình chạy trên HĐH. Sẽ rất khó để tìm ra những gì bắt nguồn từ một cuộc gọi nhất định. Một trình thám thính gói cuối cùng có thể tìm ra (thông qua số cổng) ID tiến trình nhưng không thể tìm ra quy trình nào đã thực hiện tra cứu DNS vì điều này hoàn toàn độc lập (rất có thể là ngăn xếp mạng hạt nhân đã kích hoạt cuộc gọi). Nhưng với việc lọc và dừng các quá trình khác, bạn sẽ có thể đạt được mục tiêu của mình.
Huygens

135

Để bắt đầu và theo dõi một quy trình mới:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Để theo dõi một quy trình hiện có với một PID đã biết:

strace -p $PID -f -e trace=network -s 10000
  • -f là để "theo quy trình mới"
  • -e định nghĩa một bộ lọc
  • -s đặt giới hạn của chuỗi là hơn 32
  • -p lấy id quá trình để đính kèm

2
Điều này rất hữu ích vì nó có thể được sử dụng mà không cần quyền truy cập root hoặc quyền đặc biệt (dù sao trên một số bản phân phối Linux - trên Ubuntu bạn có thể cần quyền đặc biệt).
Robin Green

1
Điều này cũng hữu ích, bởi vì nó có thể được chạy theo quy trình đã được khởi chạy và có sẵn trên hầu hết mọi hộp Linux.
zakmck

53

Tôi biết chủ đề này hơi cũ nhưng tôi nghĩ rằng điều này có thể giúp một số bạn:

Nếu hạt nhân của bạn cho phép, việc nắm bắt lưu lượng mạng của một quy trình sẽ được thực hiện rất dễ dàng bằng cách chạy quy trình đã nói trong một không gian tên mạng bị cô lập và sử dụng wireshark (hoặc các công cụ mạng tiêu chuẩn khác) trong không gian tên đã nói.

Việc thiết lập có vẻ hơi phức tạp, nhưng một khi bạn hiểu nó và làm quen với nó, nó sẽ giảm bớt công việc của bạn rất nhiều.

Vì vậy, để làm như vậy:

  • tạo một không gian tên mạng thử nghiệm:

    ip netns add test
    
  • tạo một cặp giao diện mạng ảo (veth-a và veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • thay đổi không gian tên hoạt động của giao diện veth-a:

    ip link set veth-a netns test
    
  • cấu hình địa chỉ IP của giao diện ảo:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • cấu hình định tuyến trong không gian tên thử nghiệm:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • kích hoạt ip_forward và thiết lập quy tắc NAT để chuyển tiếp lưu lượng truy cập đến từ không gian tên bạn đã tạo (bạn phải điều chỉnh giao diện mạng và địa chỉ IP SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (Bạn cũng có thể sử dụng quy tắc MASQUERADE nếu bạn thích)

  • cuối cùng, bạn có thể chạy quy trình bạn muốn phân tích trong không gian tên mới và wireshark cũng vậy:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Bạn sẽ phải theo dõi giao diện veth-a.


4
Ý tưởng tuyệt vời, nhưng hãy cẩn thận với những "hạn chế". Vì đây là một không gian tên riêng biệt, bạn không thể giao tiếp với các quy trình cục bộ trong không gian tên mặc định bằng cách sử dụng địa chỉ loopback (es) hoặc socket miền UNIX. Cái sau ảnh hưởng đến giao tiếp qua D-Bus.
Lekensteyn

@Lekensteyn bạn vẫn có thể sử dụng ổ cắm tên miền unix trên các không gian tên mạng afaik. Hệ thống tập tin không bị cô lập.
randunel

1
@randunel Tôi nên có chính xác hơn về điều đó. Điều tôi muốn nói là các socket miền Unix trong "không gian tên socket trừu tượng" (không sử dụng hệ thống tập tin) không thể được truy cập trực tiếp giữa các không gian tên mạng. Như một giải pháp thay thế, bạn có thể sử dụng proxy nhưsocat .
Lekensteyn

Địa chỉ IP nào bạn sử dụng với --to-sourceđối số là iptables? Đây có phải là địa chỉ IP của giao diện bạn chuyển đến -otùy chọn, địa chỉ IP bạn tạo hoặc ??? Tôi đã thử phiên bản giả trang mà không cần --to-source, như được mô tả ở đây , và nó đã hoạt động!
ntc2

3
Tất cả điều này dường như yêu cầu quyền truy cập root.
Simplegamer

15
netstat -taucp | grep <pid or process name>

Điều đó sẽ hiển thị các kết nối mà một ứng dụng đang thực hiện bao gồm cả cổng đang được sử dụng.


8
Điều này sẽ hiển thị các kết nối tồn tại ngay lập tức, nhưng nó sẽ không cung cấp nhật ký lưu lượng truy cập.
Kees Cook

1
Không chắc chắn về bình luận Kees Cook. Một netstat đơn giản hiển thị thông tin về các kết nối ngay lập tức, nhưng với cờ -c, bạn sẽ có được một ảnh chụp nhanh về trạng thái đó mỗi giây (xem 'man netstat'). Có thể nó không có tất cả lưu lượng truy cập, nhưng không phải là ảnh chụp nhanh các kết nối.
tremendows

3
Vâng, tôi chắc chắn. Điều này sẽ không nắm bắt tất cả lưu lượng mạng của một quá trình.
Rebier Post

Điều này rất hữu ích để tìm ra số cổng nào đang bị chặn bởi tường lửa nội bộ. Nó cho thấy các TCP TCP (cùng với địa chỉ đích và số cổng) được gửi bởi lệnh tôi đang chạy.
Anthony Geoghegan

11

Chỉ là một ý tưởng: Có thể liên kết ứng dụng của bạn với một địa chỉ IP khác không? Nếu vậy, bạn có thể sử dụng các nghi phạm thông thường ( tcpdump , v.v.)

Các công cụ cho các ứng dụng không có khả năng liên kết với một địa chỉ IP khác:

http://freshmeat.net/projects/fixsrcip

fixsrciplà một công cụ để liên kết các ổ cắm máy khách TCP và UDP ( IPv4 ) đi với các địa chỉ IP nguồn cụ thể trên các máy chủ đa homed

http://freshmeat.net/projects/force_bind

force_bindcho phép bạn buộc ràng buộc trên một IP và / hoặc cổng cụ thể. Nó hoạt động với cả IPv4 và IPv6 .


Hầu hết các ứng dụng không hỗ trợ chỉ định IP nguồn của chúng, nhưng điều này thực sự có thể thực hiện được bằng cách sử dụng bộ chứa với CLONE_NEWNET nhưng không phải CLONE_NEWNS.
Kees Cook

Ngoài ra, bạn có thể tạo một không gian tên mạng và chạy ứng dụng của mình bên trong nó www.evolware.org/?p=293
Flint

9

Tôi đã đi đến một vấn đề tương tự và tôi đã có thể sắp xếp nó dựa trên câu trả lời này của ioerror , sử dụng NFLOG như được mô tả ở đây :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

Sau đó, bạn có thể tạo chạy quy trình được đề cập từ tài khoản người dùng không làm gì khác - và voila, bạn vừa tách biệt và thu được lưu lượng truy cập từ một quy trình.

Chỉ muốn gửi lại trong trường hợp nó giúp bất cứ ai.


6

Tôi đã viết một ứng dụng C thực hiện những gì được mô tả trong câu trả lời tuyệt vời ở trên bởi felahdab!

Xem ở đây: nsntrace github repo


Điều đó thật tuyệt, nhưng tôi nghĩ sẽ rất tuyệt nếu bao gồm một số chi tiết khác về cách lấy và sử dụng nó :)
Zanna

Cảm ơn! Tôi đã cung cấp một liên kết đến repo github chứa tệp README.md có cách sử dụng và ví dụ và hướng dẫn tải xuống!
Jonas Danielsson

5

Đây là một bản hack bẩn nhưng tôi khuyên bạn nên chuyển hướng hoặc mục tiêu nhật ký với iptables cho một UID cụ thể. ví dụ:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

Cũng có thể đáng để xem xét một cái gì đó như '--log-tcp-sequ', '--log-tcp-Tùy chọn', '--log-ip-Tùy chọn', '--log-uid' cho mục tiêu nhật ký đó . Mặc dù tôi nghi ngờ rằng điều đó sẽ chỉ giúp bạn đăng quá trình một pcap bao gồm một tấn dữ liệu khác.

Mục tiêu NFLOG có thể hữu ích nếu bạn muốn gắn cờ các gói và sau đó các gói được gắn thẻ nhất định sẽ được gửi qua ổ cắm netlink đến một quá trình bạn chọn. Tôi tự hỏi nếu điều đó sẽ hữu ích cho việc hack một cái gì đó với wireshark và ứng dụng cụ thể của bạn chạy như một người dùng cụ thể?


Nhưng điều này chỉ hoạt động cho đi, những gì về incomming?
quả

5

Bạn có thể thử truy tìm - http://mutrics.iitis.pl/tracedump

Nó thực hiện chính xác những gì bạn muốn, bạn có thể cung cấp cho nó ID tiến trình hoặc chương trình để chạy.


1
Dự án tuyệt vời, nhưng ... "Traceump hiện chỉ chạy trên các máy chủ Linux 32 bit" không may giết chết nó.
gertvdijk

4

Thử chạy quá trình bạn quan tâm dưới strace :

strace ping www.askubuntu.com

Nó sẽ cung cấp cho bạn một số thông tin rất chi tiết về những gì quá trình của bạn đang làm. Vì một quá trình có thể mở ra bất kỳ cổng nào nó muốn đến bất kỳ đâu, sử dụng bộ lọc được xác định trước, bạn có thể bỏ lỡ điều gì đó.

Một cách tiếp cận khác là sử dụng máy ảo bị loại bỏ hoặc máy thử nghiệm trên mạng của bạn và đặt quy trình của bạn trên đó một cách riêng biệt về vấn đề này. Sau đó, bạn có thể chỉ cần sử dụng Wireshark để bắt tất cả từ máy đó. Bạn sẽ khá chắc chắn rằng lưu lượng truy cập bạn nắm bắt sẽ có liên quan.


Thêm vào một "-e dấu = mạng" cắt giảm một số đầu ra, với chi phí mất dữ liệu thực sự được ghi vào mạng. Nếu bạn chỉ quan tâm đến "số lượng ổ cắm được mở" hoặc tương tự, điều này làm cho mọi việc dễ dàng hơn.
dannysauer

3

Dựa trên câu trả lời của ioerror Tôi nghi ngờ bạn có thể sử dụng iptables --uid-ownerđể đặt điểm đánh dấu trên lưu lượng truy cập và sau đó bạn có thể yêu cầu wireshark chỉ chụp lưu lượng truy cập với điểm đánh dấu đó. Bạn có thể sử dụng một DSCP (điểm đánh dấu dịch vụ khác biệt), id luồng hoặc điểm đánh dấu qos.

Hoặc thực sự bạn có thể sử dụng điều này để gửi các gói đó ra một giao diện khác, và sau đó chỉ chụp trên giao diện đó.



-1

có lẽ iptables và ulog có thể làm việc? Không phải tôi có một công thức chính xác, nhưng tôi nghĩ iptables có thể khớp với các quy trình, một khi đã khớp bạn có thể sử dụng ulog.


3
Thật không may, iptables -m owner --pid-owner $PIDđã bị xóa trong Linux 2.6,14
Kees Cook

-1

Tôi nghĩ rằng bạn có thể tạo một tập lệnh shell để lặp qua việc thực thi netstat và đăng nhập nó vào một tệp văn bản. Một cái gì đó như (các bước rất thô):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

Tôi không phải là một lập trình viên, vì vậy tôi không thể tinh chỉnh điều này. Nhưng ai đó ở đây có thể bắt đầu từ nơi tôi rời đi và tạo một kịch bản làm việc cho bạn.


Không đủ tốt. Câu hỏi là để nắm bắt tất cả lưu lượng truy cập mạng, không phải bất cứ điều gì xảy ra để hoạt động tại thời điểm bạn xảy ra để kiểm tra.
Rebier Post
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.