Tạo kết nối đa hướng để chụp tcpdump


11

Tôi muốn viết một kịch bản shell linux sẽ thu được lưu lượng phát đa hướng cụ thể. Cụ thể như trong, tôi muốn tạo một tệp pcap có tất cả lưu lượng truy cập cho một nhóm / cổng phát đa hướng cụ thể.

Đây là dòng lệnh tôi đang sử dụng để xem lưu lượng:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234

Điều này hoạt động tốt miễn là tôi có một thuê bao phát đa hướng cho nhóm đó đã được thiết lập. Ví dụ: nếu tôi chạy cái này trong một giao diện điều khiển khác:

mdump 233.54.12.234 22001 10.13.252.51

tcpdumpsẽ thấy các gói. Nếu mdumpkhông chạy, tcpdumpkhông thấy gì.

Có một cách linux-y tiêu chuẩn để thiết lập các phép nối đa hướng này trước khi bắt đầu chụp không? Tôi có thể sử dụng mdumpđể thiết lập các liên kết này, nhưng điều đó có vẻ lãng phí vì mdumpsẽ xử lý tất cả dữ liệu trong nhóm, nhưng tôi sẽ vứt nó đi.

Lưu ý rằng vì môi trường cụ thể của tôi, tôi đã không khuyến khích đưa giao diện vào chế độ lăng nhăng. Trên thực tế, nó có thể bị cấm.


1
Trừ khi bạn đang chạy một phiên bản phi tiêu chuẩn của tcpdump, bạn đang đặt giao diện vào chế độ promiscuous - những -plá cờ, trong các phiên bản tiêu chuẩn của tcpdump, biến chế độ promiscuous tắt , vì nó là vào theo mặc định. Trong chế độ lăng nhăng, nó sẽ thấy tất cả lưu lượng truy cập, bao gồm cả lưu lượng phát đa hướng, bất kể bạn đã đăng ký chưa - trừ khi bạn đang sử dụng mạng chuyển mạch và cần phải đăng ký để chuyển đổi lưu lượng cho bạn.

1
@GuyHarris: Cảm ơn đã làm rõ. Tôi đang trên một mạng chuyển đổi. Không có đăng ký đã được thiết lập (tức là với mdumpviệc chạy trong bảng điều khiển khác), tcpdumpkhông thấy gì.
John Dibling

Và nếu họ không muốn bạn chạy ở chế độ lăng nhăng, có lẽ họ cũng không muốn bạn (hoặc thậm chí không cho phép bạn) thiết lập "cổng được nhân đôi" trên công tắc (giả sử công tắc thậm chí hỗ trợ điều đó) để có được bản sao của tất cả lưu lượng truy cập thông qua bộ chuyển mạch (hoặc tất cả lưu lượng truy cập qua các cổng cụ thể, nếu có thể).

Vì vậy, có gì sai khi làm điều này với một kịch bản? Vấn đề là liệu nó có hoàn thành công việc không, liệu có ai đó coi đó là "cách thông thường" - điều gì "bất thường" về kịch bản không?

Chế độ lăng nhăng bị vô hiệu hóa vì rõ ràng cho phép nó sẽ tác động đến các máy ảo khác trên máy chủ. Điều này là không mong muốn. Tôi có thể thiết lập một cổng được nhân đôi tại công tắc - đây là các aristas 40gb - nhưng tôi không chắc là tôi thấy quan điểm của bạn.
John Dibling

Câu trả lời:


5

TL; DR - Chọn một:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

socat STDIO UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 > /dev/null


Lúc đầu tôi sẽ nói "chỉ cần sử dụng ip maddress addvà được thực hiện với nó". Vấn đề ip maddresschỉ ảnh hưởng đến địa chỉ multicast lớp liên kết chứ không phải địa chỉ multicast giao thức ( man 8 ip-maddress).

Điều đó đang được nói bằng cách sử dụng autojoincờ với động từ địa chỉ thực hiện thủ thuật độc đáo.

Điều này đặt ra một số câu hỏi tiếp theo mặc dù. Tôi giả sử vì bạn sẽ chạy tcpdumphoặc tsharkbạn có quyền root. Trong trường hợp bạn không 22001 là một cổng được đánh số cao và các tiện ích khác như socatcũng sẽ hoàn thành công việc.

Đừng hiểu ý tôi. Chỉ cần kiểm tra điều này, chúng ta có thể tạo các gói UDP đa hướng bằng socathoặc ncat(thường được đóng gói qua nmap/ nmap-ncat).

Trên một số số máy chủ chạy một trong hai kết hợp sau:

Lựa chọn 1:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

Lựa chọn 2:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 /dev/null &

Tùy chọn đầu tiên sẽ yêu cầu root hoặc ít nhất là khả năng CAP_NET_ADMIN . Tùy chọn thứ hai không yêu cầu root, nhưng cũng hy vọng chạy ở nền trước và do đó thể ít có lợi cho kịch bản hơn (mặc dù theo dõi ID tiến trình con và làm sạch nó bằng trapBASH có thể chỉ là những gì bạn đang tìm kiếm.

Khi đã xong (nhưng trước khi chúng tôi tiến hành kiểm tra các lệnh tcpdump/ tsharklệnh của chúng tôi ), hãy đảm bảo rằng kernel nhận ra giao diện đã tham gia nhóm IGMP chính xác. Nếu bạn cảm thấy siêu lạ mắt, bạn có thể phân tích cú pháp hex /proc/net/igmp, nhưng tôi khuyên bạn chỉ nên chạy netstat -gn.

Khi bạn đã xác minh rằng bạn thấy giao diện được đăng ký vào nhóm chính xác, hãy kích hoạt lệnh tcpdump của bạn:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234

Ngoài ra, nếu bạn không muốn hoàn toàn đi theo lộ trình tcpdump (hoặc vấp phải câu trả lời này và chỉ tò mò muốn xem multicast trong hành động), bạn có thể sử dụng socatlệnh ở trên để tham gia và lặp lại nội dung STDOUTbằng cách thay thế /dev/nullbằng STDOUT:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1

Sau đó, từ một máy khác sử dụng một trong hai tùy chọn sau để gửi một số dữ liệu thử nghiệm đơn giản:

Lựa chọn 1:

socat STDIO UDP-DATAGRAM:233.54.12.234:22001

Lựa chọn 2:

ncat  -u 233.54.12.234 22001

Khi bạn chạy một trong hai lệnh đó, nó sẽ tương tác chờ đầu vào. Chỉ cần nhập một số thứ vào, nhấn enter để gửi, sau đó CTRL+Dkhi bạn hoàn tất để gửi EOFtin nhắn.

Tại thời điểm này, bạn sẽ thấy một thử nghiệm kết thúc để kết thúc và với một vài lệnh được xây dựng hệ thống trò chuyện tồi tệ nhất, không an toàn nhất trên thế giới.


1
Wow, phải mất 4 năm để có câu trả lời! Tôi thậm chí không làm điều này nữa, và thực sự không có cách nào để kiểm tra, nhưng dù sao tôi cũng sẽ chấp nhận.
John Dibling

1
Đi kèm tiện dụng ngay bây giờ! : D Cảm ơn Brian :)
quay vào
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.