tcpdump 출력 흐름에 인터페이스를 표시하는 방법은 무엇입니까?


20

이것은 아주 사소한 문제인 것 같지만 일부 검색 후에도 답을 찾을 수 없습니다. 인터페이스 설명으로 "any"를 사용하여 tcpdump를 실행할 수 있습니다.

 # tcpdump -i any -n host 192.168.0.1

tcpdump가 어떤 인터페이스에 표시된 패킷을 캡처했는지 표시 할 수있는 방법이 있습니까?

최신 정보:

더 많은 사람들이 바닐라 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 주소를 네트워크 인터페이스와 상관시킬 수 있습니다.


를 사용하면 -e각 줄에 하나의 MAC 주소 만 인쇄됩니다. 들어오는 패킷의 경우 소스 MAC이므로 도착한 인터페이스를 식별하는 데별로 유용하지 않습니다.
kasperd

1

나는 그것에 대한 대답도 모른다. 나는 그것에 대한 옵션을 찾지 못하고, 결코 본 적이 없으며 tcpdump 형식에 인터페이스 식별자가 포함되어 있지 않다고 확신합니다. 각 인터페이스마다 하나의 tcpdump 인스턴스를 시작하고 각 파일에 로그해야한다고 생각합니다.


동의합니다. 일반적으로 트래픽을 스니핑 할 때 트래픽이 어디에서 왔는지 또는 어디로 가고 있는지 알고 있습니다. 내가 알아 내야한다면, 나는 먼저 더 큰 생선을 튀길 것이다 ...
Corey S.

2
이 기능은 정말 자주 필요합니다. IGP와 BGP가있는 여러 인터페이스, 많은 VLAN 인터페이스가 있습니다. 패킷이 흐르는 방식을 찾는 것이 매우 중요합니다. 현재 라우팅 테이블을 검사하여 아웃 바운드 인터페이스를 수동으로 확인할 수 있습니다. 그러나 인터넷에서 패킷이 들어오는 방식을 찾아야하는 경우 가장 가능성이 높은 인터페이스에서 tcpdump를 시작하여 맹검 검사를 수행해야하는 경우가 있습니다. :(
mdrozdziel

1

Mac에서 실행중인 경우 다른 유용한 메타 데이터 중에서 인터페이스 이름을 덤프하는 pktap 인터페이스를 사용중인 경우에 대한 -k옵션이 tcpdump있습니다.

   -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의 훌륭한 bash 스크립트에 추가하십시오. 이 줄에서 실패했기 때문에 그의 스크립트를 단순화해야했다 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;

https://github.com/the-tcpdump-group/tcpdump/issues/296 에서이 기능 생략과 관련된 현재 github 이슈 티켓에 관심이있을 수 있습니다 .


0

이것이 Linux에 있다고 가정하면 찾고있는 패킷과 일치하도록 iptables 규칙을 추가하고 기록 할 수 있습니다. IPP 로그에는 무엇보다도 수신 및 송신 인터페이스가 포함됩니다.


0
for interface in `ifconfig | grep '^[a-z0-9]' | awk '{print $1}'`;do echo $interface;tcpdump -i $interface -nn -c 25;done

필요에 따라 -c를 조정하십시오.


0

인터페이스 감지 라인을 수정하면 리눅스에서 별칭 주소 인터페이스를 제거 할 수 있습니다. 아래 샘플 ..

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.