실시간으로 tcpdump 스트림을 구문 분석하는 방법은 무엇입니까?

실시간으로 tcpdump 스트림을 구문 분석하는 방법은 무엇입니까?

OEM에서 내가 식별할 수 없는 여러 프로세스를 실행하고 있는 데비안 설치가 있는데, 이러한 프로세스 중 전화 접속이 이루어지는지 확인하고 싶습니다.

나는 달렸다sudo tcpdump | grep ^e <ssh_ip>

그러나 파이프는 계속해서 파손되었습니다. SSH를 통해 연결했는데 grep ^e에서 클라이언트의 SSH IP를 생략했습니다. 아웃바운드 요청에 대한 네트워크 연결을 지속적으로 모니터링하는 방법이 있습니까? 나는 이것이 집이라고 부르는 곳이 어디인지, 특히 이 문제와 관련 없는 다른 행동으로부터 그것이 집이라고 의심되는 곳이 어디인지 모릅니다.

깨진 파이프는 일반적으로 연결이 끊어졌음을 의미하지만 내 SSH 연결은 괜찮았습니다. 이는 tcpdump가 수행해야 하는 다른 작업인 것 같습니다.

답변1

존재하다:

sudo tcpdump | grep ^e <ssh_ip>

첫째, ^e껍질에 따라 의미가 다릅니다.

  • Bourne 셸에서 는 ^(원래 이전 Thompson 셸의 파이프 연산자와 유사하게 렌더링됨)에 대한 별칭이므로 파이프를 통해 명령을 실행할 수 있습니다.|^grepe
  • fish3.2 이전 버전 에서는 ^stderr(의 약자 2>)을 리디렉션하는 데 사용됩니다.
  • in rc과 파생어는 ^연결 연산자이므로 grep ^e가 됩니다 grepe.
  • in 은 zsh -o extendedglob음수 ^전역 연산자이므로 ^e이름이 지정된 파일을 제외하고 현재 디렉터리에서 숨겨지지 않은 모든 파일로 확장됩니다 e.
  • csh/// 에서는 줄의 시작 부분과 기록 확장이 비활성화되지 않은 경우에만 특수 처리됩니다 tcsh. bash그러니 여기는 아닙니다.zsh^
  • 대부분의 다른 쉘에서는 ^e문자 그대로 grep.

따라서 다음 셸 중 하나를 가정하면 명령은 다른 셸로 파이프된 입력과 동시에 시작되고 출력 sudo tcpdump됩니다 .grep ^e <ssh_ip>

매개변수의 구문은 ( 선택적 부분을 나타냄) grep입니다 . 파일이 없으면 표준 입력을 grep하십시오. 옵션은 역할로 시작됩니다.grep [<options>] <regular-expression> [<files>][...]grep-

이것은 ^e정규식과 <ssh_ip>해당 정규식과 일치하는 행을 찾는 데 사용되는 파일입니다.

정규식으로, ^e다음 줄의 시작 부분과 일치하므로 e로 시작하는 줄이 보고됩니다 e.

여기서는 파일이 <ssh_ip>존재하지 않을 가능성이 높으므로 grep즉시 오류가 반환됩니다.

이 시점에서 tcpdumps에서 상속받은 stdout은 sudo깨진 파이프가 되므로 처음으로 tcpdump무언가를 출력하려고 하면 SIGPIPE 신호를 받고 죽거나, 신호를 무시하면 write()오류와 함께 실패 하게 됩니다 EPIPE. 여기서 tcpdump는 신호를 무시하고 실패를 보고하거나 write()처리기가 있고 종료하기 전에 수신을 보고함을 나타내는 오류 메시지를 작성합니다.

의 출력에서 ​​IP 주소가 포함된 행을 필터링하려면 where 와 here를 하나의 매개변수로 묶어서 표현 tcpdump해야 합니다.grep -Fvw <ssh_ip>-F-v-w

  • F정규식 대신 고정 문자열과 일치합니다 ( 정규식에서와 같이 단일 문자가 아닌 .리터럴과 일치하는 데 사용됨)..
  • Rematch v: 일치하는 행을 반환합니다.아니요성냥.
  • 주문만 일치합니다(예: ==는 해당 항목에서 w찾을 수 없습니다 <ssh_ip>).10.10.10.10210.10.10.109

기본적으로 tcpdump는 출력이 터미널로 전송되지 않는 것을 감지하면 블록 버퍼링으로 되돌아가므로 출력이 나오는 즉시 확인하려면 -ltcpdump에 옵션을 추가하여 다시 활성화 해야 할 수도 있습니다.철사완충기.

그러나 어쨌든 tcpdump는 자체적으로 패킷을 필터링할 수 있습니다. 여기에서 특정 IP 주소와의 패킷을 제외하려면 다음을 수행하면 됩니다.

sudo tcpdump not host <ssh_ip>

또는 해당 IP 주소의 SSH 트래픽만 필터링합니다.

sudo tcpdump 'not (host <ssh_ip> and tcp port ssh)'

(Ssh 연결이 기본 포트 22에 있다고 가정합니다.)

이러한 필터(Berkeley Packet Filters, BPF)는 커널( setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, filter)적어도 Linux에서는)에 전달되는 바이너리 필터 표현식으로 컴파일됩니다. 필터링은 여기에서 수행되므로 실제로 tcpdump가 모든 트래픽을 요청하고 이를 모두 디코딩하여 grep에 전달하는 것보다 tcpdump 및 시스템에 대한 작업이 더 적습니다.

wireshark, 해당 명령줄 인터페이스는 tshark여기에서도 고려할 수 있는 고급 트래픽 분석 애플리케이션입니다. 두 가지 유형의 필터를 지원합니다. 위에서 BPF라고 불리는 필터입니다.캡처 필터(통과 -f) 및필터 표시(통과 -Y) Wireshark의 자체 필터 구문과 고급 기능을 사용하여 커널에서 반환된 패킷에 추가로 적용됩니다.


또는 현재 작업 디렉토리로 재귀적으로 이동합니다( 최신 버전의 GNU 구현에 -r/ 옵션이 제공된 경우).-Rgrep

관련 정보