Linux에서 TCP 트래픽 데이터를 스니핑하는 가장 쉬운 방법은 무엇입니까?


79

Linux 상자의 모든 인터페이스를 통과하는 모든 TCP 데이터 (TCP 헤더 또는 다른 것은 아님)를 표시하는 간단한 방법을 원합니다.

예를 들어, 내가 할 경우 다음과 같은 마법의 명령이 필요합니다.

magic_commmand_I_want port=1234

내 컴퓨터의 포트 1234에서 수신 대기하는 서버가 있고 누군가가 한 경우 :

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

그러면 마법의 명령이 출력됩니다.

hello

나는 "tcpdump", "ethereal", "tethereal", "tshark"등을 시도했지만 어떻게 그것들을 얻는 지 분명하지 않습니다.

  • IP 주소 또는 기타 메타 데이터를 표시하지 않습니다
  • 개별 패킷과 헤더가 아닌 "데이터"만 전송
  • 패킷 오프셋 마커가 아닌 16 진수가 아닌 그대로 데이터를 인쇄합니다.
  • 모든 네트워크 트래픽을 스니핑 하십시오 ( eth0 또는 eth1 또는 lo 등).

예, 파이프 된 유닉스 명령 세트를 함께 묶을 수는 있지만 다음 번에는 기억하기가 쉽지 않습니다. :)

이 작업을 수행하는 정확한 명령 줄에 대한 간단한 예가 있다면 그게 내가 원하는 것입니다.


2
tcpdump는 원하는 마술 명령입니다. Wireshark는 tcpdump가 사용하는 라이브러리 위에 멋진 GUI입니다.
Vinko Vrsalovic

3
나는 이것이 오래된 질문이라는 것을 알고 있지만 왜 "서버 측"에 nc를 사용하는 것이 옵션이 아닌지 궁금합니다. "nc -l 1234"는 포트 1234에서 수신 대기하고 서버로 전송 된 모든 것을 인쇄하고 연결을 닫는 서버를 작성합니다. 연결을 유지하고 연결을 끊지 않으려면 "-k"옵션을 추가하십시오.
StFS

2
@StFS는 실행중인 포트를 스니핑하고 nc가 불평하기 때문에.
infoclogged

답변:


106

최신 정보:

주석에서 Michal이 지적한 것처럼 : tcpflow 버전 1.3부터 ​​-e 옵션은 스캐너 이름을 지정하는 데 사용됩니다. 따라서 "잘못된 스캐너 이름 '8983'"오류가 인쇄됩니다. 올바른 명령은

sudo tcpflow -i any -C -J port 1234

( 최신 릴리스 -J에서도 변경 -g되었습니다)


" tcpflow " 를 가리키는 yves에게 감사합니다 . 명령 줄은 다음과 같습니다.

tcpflow -i any -C -e port 1234  # as root, or with sudo

이것은 내가 원하는 모든 것을한다

  • 바이트 단위로 데이터를 표시합니다.
  • 다른 메타 데이터를 표시하지 않습니다
  • 모든 인터페이스에서 수신 (기계 내부 및 외부에서 들어오는 데이터 캡처)

" -C"는 파일 대신 콘솔에 덤프하도록 지시합니다. " -e"는 색상을 가능하게하여 클라이언트-> 서버 및 서버-> 클라이언트가 시각적으로 구별됩니다.

간단히 수행하여 tcpflow를 설치했습니다.

sudo apt-get install tcpflow

2
와. tcpflow는 굉장합니다, 감사합니다! wireshark로 인한 고통의 톤을 구했습니다. Wireshark, tcpdump 등은 너무 많은 정보를 가지고 있으며 원래의 질문에서 실제로 수행하지 않습니다. tcpflow는 이것에 완벽합니다.
Russ

10
tcpflow 버전 1.3부터이 -e옵션은 스캐너 이름을 지정하는 데 사용됩니다. 따라서 "잘못된 스캐너 이름 '8983'"오류가 인쇄됩니다. 올바른 명령은sudo tcpflow -i any -C -J port 1234
Michal Kováč

6
참고 -J로 변경되었습니다 -g최신 버전 (들).
tvon

2
누군가는 "후진 호환성"이라는 용어의 의미를 도구 작성자에게 설명해야합니다!
Sridhar Sarnobat

그것은 "사물"을 두 번 인쇄합니다. 왜 그런 겁니까 ? lpaste.net/3984129577801744384
user1198559

29

socat은 당신이 요구하는 도구입니다. 프록시 역할을 할 수 있습니다.

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

응용 프로그램은 1234에 직접 연결하는 대신 포트 4444를 연결해야합니다.

-v 옵션은 socat이 표준 오류 (stderr)에서 수신 한 모든 것을 인쇄하는 것입니다.

최신 정보:

컴퓨터에서 socat을 사용할 수없는 경우 여전히 netcat을 사용하여 해당 방식을 에뮬레이트 할 수 있습니다.

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

경고 :이 옵션은 단방향입니다. 두 번째 netcat 인스턴스는 서버에서 표준 출력으로 응답을 인쇄합니다. 그래도 여전히 할 수 있습니다 :

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo

클라이언트와 서버를 제어 할 수 없거나 중지하고 싶지 않다면 어떤 포트가 관여하거나 트래픽을 가로 챌지를 변경할 수 없습니다. 그리고 뭐?

20

Wireshark를 사용해보십시오 . Linux와 Windows를 모두 대상으로하는 우수한 프로토콜 분석기입니다.


3
내 경험은 인터페이스가 실제로 리눅스를 빨아 먹는다는 것입니다.
Joe Phillips

젠장, 당신은 내 앞에 도착, wireshark에 +1

예제 명령 줄을 제공 할 수 있습니까?

이 링크 wiki.wireshark.org/Tools를 보십시오 . wireshark를위한 명령 행 도구 목록을 제공합니다. Dumpcap을 찾으십시오.
Kevin Boyd

13

tcpflow는 원하는 것입니다. 매뉴얼 페이지에서 추출하십시오.

설명
tcpflow는 TCP 연결 (흐름)의 일부로 전송 된 데이터를 캡처하고 프로토콜 분석 또는 디버깅에 편리한 방식으로 데이터를 저장하는 프로그램입니다. tcpdump (4)와 같은 프로그램은 유선에서 볼 수있는 패킷의 요약을 보여 주지만 실제로 전송되는 데이터는 저장하지 않습니다. 반대로 tcpflow는 실제 데이터 스트림을 재구성하고 나중에 분석 할 수 있도록 각 플로우를 별도의 파일에 저장합니다. tcpflow는 TCP 시퀀스 번호를 이해하고 재전송 또는 순서가 잘못된 전달에 관계없이 데이터 스트림을 올바르게 재구성합니다.

tcpflow는 캡처 된 모든 데이터를 형식의 이름을 가진 파일로 저장합니다

192.168.101.102.02345-010.011.012.013.45103

위 파일의 내용은 호스트 192.168.101.102 포트 2345에서 호스트 10.11.12.13 포트 45103으로 전송되는 데이터입니다.

애플리케이션 앱에서 서버로 연결을 설정하십시오. 연결이 작동 중일 때 tcpflow는 여전히 데이터를 캡처 할 수 있습니다.

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

모든 데이터는 127.000.000.001.48842-127.000.000.001.05555라는 파일에 저장됩니다.

-Cs 옵션을 사용하여 표준 출력에서이를 리디렉션 할 수 있습니다. 매뉴얼 페이지를 읽고 tcpflow로 캡처 할 paquets를 조정하기 위해 expression을 사용하십시오.


2

ngrep이것에 매우 좋습니다. 패킷 내에서 검색하려면 BPF 문자열과 선택적 문자열이 필요하며 패킷 내용을 매우 유용한 형식으로 화면에 덤프합니다. 또한 선택적으로 pcap_dump 파일로 덤프하여 나중에 Wireshark에서 더 자세히 조사 할 수 있습니다.


0

Chaosreader를 살펴 보십시오 . 그것은 당신이 요구하는 것보다 조금 더하고 약간 다르게하지만, 아마도 당신이 원하는 것을하기 위해 코드를 수정할 수 있습니다.


-1

예를 들어 tcpdump에 대한 래퍼를 작성하면 모든 중복 정보가 제거됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.