วิธีการแสดงส่วนติดต่อในการไหลของเอาท์พุท tcpdump?


20

นี่ดูเหมือนจะเป็นปัญหาเล็กน้อย แต่หลังจากการค้นหาบางอย่างฉันไม่สามารถหาคำตอบได้ หนึ่งสามารถรัน tcpdump โดยใช้ "any" เป็นคำอธิบายส่วนต่อประสานเช่น:

 # tcpdump -i any -n host 192.168.0.1

มีวิธีใดที่จะบังคับให้ tcpdump แสดงบนอินเทอร์เฟซที่แสดงแพ็คเก็ตที่ถูกจับ?

ปรับปรุง:

เมื่อมีคนยืนยันว่านี่เป็นไปไม่ได้กับ vanilla tcpdump ใครบางคนสามารถเสนอวิธีแก้ไขปัญหาที่กล่าวถึงได้หรือไม่? บางทีดมกลิ่นที่แตกต่างกัน?

ปัญหาทั่วไปมีดังนี้: บนระบบที่มี 50 อินเตอร์เฟสกำหนดอินเทอร์เฟซขาเข้าสำหรับแพ็คเก็ตที่มาจากที่อยู่ IP เฉพาะ

คำตอบ:


19

ฉันหวังว่าบางคนยังคงสนใจวิธีการแก้ปัญหา ;) เรามีปัญหาเดียวกันใน บริษัท ของเราและฉันเริ่มเขียนสคริปต์สำหรับสิ่งนี้

ฉันเขียนบทความเกี่ยวกับบล็อกด้วยซอร์สโค้ดและสกรีนช็อ

ฉันได้แชร์ด้านล่างด้วย ...

ป้อนคำอธิบายรูปภาพที่นี่

และรหัส: (โปรดตรวจสอบเว็บไซต์ของฉันสำหรับการปรับปรุงในอนาคต)

#!/bin/bash
#===================================================================================
#
# FILE: dump.sh
# USAGE: dump.sh [-i interface] [tcpdump-parameters]
# DESCRIPTION: tcpdump on any interface and add the prefix [Interace:xy] in front of the dump data.
# OPTIONS: same as tcpdump
# REQUIREMENTS: tcpdump, sed, ifconfig, kill, awk, grep, posix regex matching
# BUGS:  ---
# FIXED: - In 1.0 The parameter -w would not work without -i parameter as multiple tcpdumps are started.
#        - In 1.1 VLAN's would not be shown if a single interface was dumped.
# NOTES: ---
#        - 1.2 git initial
# AUTHOR: Sebastian Haas
# COMPANY: pharma mall
# VERSION: 1.2
# CREATED: 16.09.2014
# REVISION: 22.09.2014
#
#===================================================================================

# When this exits, exit all background processes:
trap 'kill $(jobs -p) &> /dev/null && sleep 0.2 &&  echo ' EXIT
# Create one tcpdump output per interface and add an identifier to the beginning of each line:
if [[ $@ =~ -i[[:space:]]?[^[:space:]]+ ]]; then
    tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &
else
    for interface in $(ifconfig | grep '^[a-z0-9]' | awk '{print $1}')
    do
       tcpdump -l -i $interface -nn $@ | sed 's/^/[Interface:'"$interface"']    /' &
    done
fi
# wait .. until CTRL+C
wait

6

คุณสามารถใช้ตัวเลือก -e เพื่อพิมพ์ส่วนหัวของอีเธอร์เน็ตจากนั้นคุณสามารถเชื่อมโยง src / dst MAC address กับส่วนต่อประสานเครือข่ายของคุณ;)


การใช้-eพิมพ์ที่อยู่ MAC หนึ่งรายการในแต่ละบรรทัดเท่านั้น สำหรับแพ็กเก็ตที่เข้ามามันเป็น MAC ต้นทางที่ไม่มีประโยชน์มากในการระบุว่าอินเทอร์เฟซใดที่มาถึง
kasperd

1

ฉันไม่รู้คำตอบใด ๆ ฉันไม่พบตัวเลือกสำหรับมันจำไม่ได้ว่าเคยเห็นหนึ่งและค่อนข้างแน่ใจว่ารูปแบบ tcpdump ไม่มีตัวระบุส่วนต่อประสาน ฉันคิดว่าคุณจะต้องเริ่มต้นหนึ่งอินสแตนซ์ tcpdump สำหรับแต่ละอินเทอร์เฟซและเข้าสู่ไฟล์ที่เกี่ยวข้อง


ฉันเห็นด้วย โดยปกติแล้วเมื่อฉันสูดดมการจราจรฉันรู้อยู่แล้วว่าการจราจรนั้นมาจากไหนหรือไปไหน ถ้าฉันต้องคิดออกฉันมีปลาที่ใหญ่กว่าที่จะทอดก่อน ...
คอเรย์เอส

2
ฉันต้องการฟังก์ชั่นนี้บ่อยมาก ฉันมีอินเตอร์เฟสหลายอินเตอร์เฟส vlan จำนวนมากที่มี IGP และ BGP อยู่ด้านบนของสิ่งนี้ การค้นหาว่าแพ็คเก็ตที่ไหลเป็นสิ่งจำเป็นบ่อยครั้งมาก ฉันสามารถตรวจสอบอินเตอร์เฟสขาออกได้ด้วยตนเองโดยตรวจสอบตารางเส้นทางปัจจุบัน แต่ถ้าฉันต้องหาวิธีที่แพ็กเก็ตมาจากอินเทอร์เน็ตบางครั้งฉันต้องทำการตรวจสอบคนตาบอดโดยเริ่ม tcpdump บนอินเทอร์เฟซที่เป็นไปได้มากที่สุด :(
mdrozdziel

1

หากคุณใช้งานบน Mac จะมี-kตัวเลือกtcpdumpว่าคุณกำลังใช้ส่วนต่อประสาน pktap ซึ่งจะทิ้งชื่ออินเตอร์เฟซท่ามกลางข้อมูลเมตาที่เป็นประโยชน์อื่น ๆ

   -k     Control the display of packet metadata via an optional metadata_arg argument. This is useful when displaying packet saved in the
          pcap-ng file format or with interfaces that support the PKTAP data link type.

          By default, when the metadata_arg optional argument is not specified, any available packet metadata information is printed  out.

          The  metadata_arg  argument controls the display of specific packet metadata information using a flag word, where each character
          corresponds to a type of packet metadata as follows:

                 I     interface name (or interface ID)
                 N     process name
                 P     process ID
                 S     service class
                 D     direction
                 C     comment
                 U     process UUID (not shown by default)
                 A     display all types of metadata

          This is an Apple modification.

1

เพื่อเพิ่มสคริปต์การทุบตีที่ยอดเยี่ยมของ Sebastian Haas ฉันต้องทำให้บทของเขาง่ายขึ้นเพราะมันล้มเหลวในบรรทัดtcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &นี้

แม้ว่ามันจะไม่ยืดหยุ่นเหมือนสคริปต์ต้นฉบับ แต่มันก็มีแนวโน้มที่จะทำงานในระบบลินุกซ์ที่ล้มลง

#!/bin/sh
interfaces="eth0 ip6tnl1" # Interfaces list separated by whitespace
#===================================================================================
#
# FILE: dump-stripped.sh
# USAGE: dump.sh [tcpdump-parameters]
# DESCRIPTION: tcpdump on any interface and add the prefix [Interace:xy] in 
#               front of the dump data. Simplified to work in more limited env.
# OPTIONS: similar to tcpdump
# REQUIREMENTS: tcpdump, sed, ifconfig, kill, awk, grep, posix regex matching
# AUTHOR: Sebastian Haas (Stripped down By Brian Khuu)
#
#===================================================================================

# When this exits, exit all background processes:
trap 'kill $(jobs -p) &> /dev/null && sleep 0.2 &&  echo ' EXIT

# Create one tcpdump output per interface and add an identifier to the beginning of each line:
for interface in $interfaces;
do tcpdump -l -i $interface -nn $@ | sed 's/^/[Interface:'"$interface"'] /' 2>/dev/null & done;

# wait .. until CTRL+C
wait;

นอกจากนี้คุณยังอาจสนใจในการออกบัตรฯ GitHub ปัจจุบันเกี่ยวกับการละเลยคุณลักษณะนี้ในhttps://github.com/the-tcpdump-group/tcpdump/issues/296


0

สมมติว่านี่เป็น Linux คุณสามารถเพิ่มกฎ iptables ให้ตรงกับแพ็คเก็ตที่คุณกำลังค้นหาและเข้าสู่ระบบ บันทึก Iptables รวมถึงการเชื่อมต่อทางเข้าและออกทางเหนือสิ่งอื่นใด



0

โดยการแก้ไขบรรทัดการตรวจจับส่วนต่อประสานคุณสามารถกำจัดส่วนต่อประสานที่อยู่แทนใน linux ตัวอย่างด้านล่าง ..

for interface in $(ifconfig | grep '^[a-z0-9]' | awk '{print $1}')

เปลี่ยนเป็น

for interface in $(ifconfig | grep flags | sed s/': '/' ~ '/g | grep -v : | awk '{print $1}')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.