ฉันถูกขัดจังหวะtcpdump
ด้วยCtrl+ Cและได้รับบทสรุปทั้งหมดนี้:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
"แพ็คเก็ตที่ถูกลดลงโดยเคอร์เนล" คืออะไร? ทำไมถึงเกิดขึ้น?
ฉันถูกขัดจังหวะtcpdump
ด้วยCtrl+ Cและได้รับบทสรุปทั้งหมดนี้:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
"แพ็คเก็ตที่ถูกลดลงโดยเคอร์เนล" คืออะไร? ทำไมถึงเกิดขึ้น?
คำตอบ:
จากคู่มือของ tcpdump:
แพ็คเก็ต `` ดร็อปโดยเคอร์เนล '' (นี่คือจำนวนแพ็กเก็ตที่ถูกดร็อปเนื่องจากการขาดพื้นที่บัฟเฟอร์โดยกลไกการดักจับแพ็กเก็ตในระบบปฏิบัติการที่ tcpdump ทำงานอยู่หากระบบปฏิบัติการรายงานข้อมูลไปยังแอปพลิเคชัน มิฉะนั้นจะถูกรายงานเป็น 0)
คำอธิบายเล็กน้อย:
tcpdump
จับแพ็กเก็ตดิบผ่านอินเตอร์เฟซเครือข่าย แพ็กเก็ตต้องถูกวิเคราะห์คำและกรองตามกฎที่ระบุโดยคุณในบรรทัดคำสั่งและใช้เวลาพอสมควรดังนั้นแพ็กเก็ตที่เข้ามาจะต้องถูกบัฟเฟอร์ (เข้าคิว) เพื่อการประมวลผล บางครั้งมีแพ็คเก็ตมากเกินไปพวกเขาจะถูกบันทึกลงในบัฟเฟอร์ แต่พวกเขาจะถูกบันทึกไว้เร็วกว่าการประมวลผลดังนั้นในที่สุดบัฟเฟอร์หมดพื้นที่ดังนั้นเคอร์เนลจะลดลงแพ็คเก็ตต่อไปทั้งหมดจนกว่าจะมีพื้นที่ว่างในบัฟเฟอร์
คุณสามารถเพิ่มขนาดบัฟเฟอร์ด้วยตัวเลือก-B
( --buffer-size
) ดังนี้:
tcpdump -B 4096 ....
โปรดทราบว่าขนาดที่ระบุเป็นกิโลไบต์ดังนั้นบรรทัดด้านบนจะตั้งค่าขนาดบัฟเฟอร์เป็น 4MB
tcpdump -B 4096
ที่คุณสามารถทำได้
อีกสิ่งหนึ่งที่ควรพิจารณา / ลองใช้คือtcpdump
อาจใช้เวลาทำแบบสอบถาม DNS เพื่อแก้ไข IP เป็นชื่อโดเมน หากคุณไม่ต้องการสิ่งเหล่านั้นลองโยน-n
ธง (ไม่มีการค้นหา) เช่น:
tcpdump -n port 80
-nn -B 4096
อนุญาตให้ฉันได้รับ0 packets dropped by kernel
ตามman tcpdump
:
แพ็กเก็ตที่ถูกปล่อยโดยเคอร์เนล (นี่คือจำนวนของแพ็กเก็ตที่ถูกดร็อปเนื่องจากพื้นที่บัฟเฟอร์ไม่เพียงพอโดยกลไกการดักจับแพ็กเก็ตในระบบปฏิบัติการที่ tcpdump ทำงานอยู่หาก OS รายงานข้อมูลนั้นไปยังแอปพลิเคชันถ้าไม่ใช่ จะถูกรายงานเป็น 0)
เคอร์เนลทำให้จับแพ็กเก็ตในขนาดคงที่บัฟเฟอร์การจับภาพ หากtcpdump
ไม่ล้างบัฟเฟอร์นั้นเร็วพอเคอร์เนลจะเริ่มเขียนทับแพ็กเก็ตเก่าในบัฟเฟอร์และเพิ่มตัวนับที่ลดลงตามลำดับ ค่าของตัวนับนั้นคือสิ่งที่คุณเห็นว่า "ตกหล่นโดยเคอร์เนล"
โดยวิธีการที่คุณสามารถปรับขนาดบัฟเฟอร์จับภาพ : ผ่านตัวเลือกที่มีขนาดโอเคtcpdump
-B
นอกจากสิ่งที่ man page พูดแล้วมีเหตุผลเพิ่มเติมว่าทำไมแพ็กเก็ตอาจถูกดร็อปโดยเคอร์เนล ฉันพบแพ็กเก็ตลดลง 100% จากtcpdump
จุดที่ปริมาณการใช้งานเฉพาะบนเครือข่ายคือหนึ่งแพ็คเก็ต PRB 512B ต่อวินาที เห็นได้ชัดว่าคำอธิบายพื้นที่บัฟเฟอร์ไม่สมเหตุสมผลที่นี่ - ฉันคิดว่าเคอร์เนลสามารถจัดการ 0.5kiB / s
บางสิ่งที่มาพร้อมกับ distro ของฉัน (Ubuntu 14.04) อาจทำการกรองอัจฉริยะบางอย่างที่เลเยอร์ลิงก์ที่ไม่ชอบแพ็คเก็ตทดสอบของฉัน วิธีแก้ปัญหาของฉันคือการสร้างเนมสเปซเครือข่ายใหม่ดังนี้
sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up
ในnetns
เปลือกด้านในสิ่งที่กระบวนการระบบปฏิบัติการที่ก่อให้เกิดปัญหาก่อนที่จะออกจากภาพและtcpdump
แสดงให้ฉันเห็นทุกแพ็กเก็ตที่ฉันคาดหวัง
ฉันพบว่ามีประโยชน์โดยใช้tcpdump -c
ตัวเลือก วิธีนี้คุณสามารถตั้งค่าจำนวนแพ็คเก็ตแล้วหยุดและคุณไม่สามารถกรอกบัฟเฟอร์ได้
ตัวอย่างเช่นอันนี้จะจับคำขอ tcp บน localhost
tcpdump -ni lo tcp -c 20