วิธีที่ง่ายที่สุดในการดมกลิ่นข้อมูลปริมาณการใช้ TCP บน Linux คืออะไร


79

ฉันต้องการวิธีง่ายๆในการแสดงข้อมูล TCP ทั้งหมด (ไม่ใช่ส่วนหัว TCP หรืออะไรก็ได้) ไปยังส่วนต่อประสานใด ๆ บนกล่อง Linux ของฉัน

ตัวอย่างเช่นฉันต้องการคำสั่งเวทมนต์ที่ถ้าฉันทำ:

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 หรือข้อมูลเมตาอื่น ๆ
  • แสดงเฉพาะ "data" ที่ถูกส่งไม่ใช่เฉพาะแพ็กเก็ตและส่วนหัว
  • พิมพ์ข้อมูลตามที่เป็นอยู่ไม่เป็นเลขฐานสิบหกและไม่ใช่ด้วยเครื่องหมายแพ็คเก็ตออฟเซ็ต
  • sniff การรับส่งข้อมูลเครือข่ายทั้งหมด (ไม่ว่าจะเป็นบนeth0หรือeth1หรือlo , etc ... )

ใช่คุณอาจจะรวมชุดคำสั่ง unix แบบไพพ์เข้าด้วยกันเพื่อทำสิ่งนี้ แต่นั่นไม่ใช่เรื่องง่ายที่จะจดจำในครั้งต่อไป :)

หากคุณมีตัวอย่างง่ายๆของบรรทัดคำสั่งที่ถูกต้องที่ทำเช่นนี้นั่นคือสิ่งที่ฉันต้องการ


2
tcpdump เป็นคำสั่งเวทย์มนตร์ที่คุณต้องการ Wireshark เป็นดี GUI ด้านบนของ tcpdump ห้องสมุดใช้
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เป็นเวอร์ชั่นล่าสุด)


ขอบคุณ yves ที่ชี้ให้ฉันไปที่ " tcpflow " นี่คือ commmand-line:

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

ทำทุกอย่างที่ฉันต้องการ

  • แสดง data byte-for-byte ตามที่ปรากฏ
  • ไม่แสดงข้อมูลเมตาอื่น ๆ
  • ฟังอินเทอร์เฟซทั้งหมด (ดังนั้นจึงจับข้อมูลที่มาจากภายในเครื่องและภายนอก)

" -C" บอกให้ถ่ายโอนข้อมูลไปยังคอนโซลแทนไฟล์ " -e" เปิดใช้งานสีเพื่อให้ไคลเอ็นต์ -> เซิร์ฟเวอร์และเซิร์ฟเวอร์ -> ไคลเอ็นต์มีความแตกต่างทางสายตา

ฉันติดตั้ง tcpflow เพียงแค่ทำ

sudo apt-get install tcpflow

2
ว้าว. tcpflow ยอดเยี่ยมขอบคุณ! บันทึกความเจ็บปวดของฉันให้กับฉันด้วย wireshark Wireshark, tcpdump, etc มีข้อมูลมากเกินไปและไม่ได้ทำในสิ่งที่คำถามเดิมถาม 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

แอปพลิเคชันของคุณจะต้องเชื่อมต่อพอร์ต 4444 แทนที่จะเชื่อมต่อกับ 1234 โดยตรง

-v ตัวเลือกสำหรับ socat เพื่อพิมพ์ทุกอย่างที่ได้รับในข้อผิดพลาดมาตรฐาน (stderr)

ปรับปรุง:

หาก socat ไม่สามารถใช้ได้ในเครื่องของคุณคุณอาจเลียนแบบได้ด้วย netcat:

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

คำเตือน: ตัวเลือกนี้เป็นทิศทางเดียว อินสแตนซ์ netcat ตัวที่สองจะพิมพ์ reponse ใด ๆ จากเซิร์ฟเวอร์ของคุณไปยังเอาต์พุตมาตรฐาน คุณยังสามารถทำได้:

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

สมมติว่าฉันไม่สามารถควบคุมไคลเอ็นต์และเซิร์ฟเวอร์ (หรือฉันไม่ต้องการหยุด) ดังนั้นฉันไม่สามารถเปลี่ยนพอร์ตที่เกี่ยวข้องหรือขัดขวางการรับส่งข้อมูล แล้วไง?

20

ลองWireshark มันเป็นตัววิเคราะห์โปรโตคอลที่ยอดเยี่ยมสำหรับ Linux และ Windows


3
ประสบการณ์ของฉันคืออินเทอร์เฟซ sucks บน linux จริงๆ
Joe Phillips

เจ้าไปถึงที่นั่นก่อนฉัน +1 ที่ wireshark

คุณสามารถให้บรรทัดคำสั่งตัวอย่างได้หรือไม่

ดูที่ลิงค์นี้wiki.wireshark.org/Toolsมันให้รายการของเครื่องมือบรรทัดคำสั่งสำหรับ wireshark ระวัง Dumpcap
เควินบอยด์

13

tcpflow คือสิ่งที่คุณต้องการ แยกจากหน้าคน:

DESCRIPTION
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 เก็บ


2

ngrepดีมากสำหรับสิ่งนี้ มันต้องใช้สตริง BPF และสตริงตัวเลือกเพื่อค้นหาภายในแพ็คเก็ตแล้วทิ้งเนื้อหาแพ็กเก็ตไปที่หน้าจอในรูปแบบที่มีประโยชน์มาก นอกจากนี้ยังมีทางเลือกที่จะทิ้งไปยังไฟล์ pcap_dump ที่คุณสามารถตรวจสอบเพิ่มเติมใน Wireshark ในภายหลัง


0

ลองดูที่Chaosreader แม้ว่ามันจะทำอะไรได้มากกว่าที่คุณถามและแตกต่างออกไปเล็กน้อย แต่คุณอาจแก้ไขโค้ดของมันเพื่อทำสิ่งที่คุณต้องการ


-1

บางทีคุณสามารถเขียน wrapper สำหรับ tcpdump ตัวอย่างเช่นซึ่งจะลบข้อมูลที่ซ้ำซ้อนทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.