Dalam kasus saya, saya menggunakan opsi -s0, mengubahnya ke -s1600 (tepat di atas MTU) menyelesaikannya untuk saya.
LatinSuD
Jawaban:
50
Dari manual tcpdump:
paket `` Drop by kernel '' (ini adalah jumlah paket yang dijatuhkan, karena kurangnya ruang buffer, oleh mekanisme paket capture di OS di mana tcpdump berjalan, jika OS melaporkan informasi itu ke aplikasi; jika tidak, itu akan dilaporkan sebagai 0).
Sedikit penjelasan:
The tcpdumpmenangkap paket raw melewati antarmuka jaringan. Paket-paket harus diurai dan disaring sesuai dengan aturan yang ditentukan oleh Anda di baris perintah, dan itu membutuhkan waktu, sehingga paket yang masuk harus buffered (antri) untuk diproses. Kadang-kadang ada terlalu banyak paket, mereka disimpan ke buffer, tetapi mereka disimpan lebih cepat dari yang diproses, sehingga akhirnya buffer kehabisan ruang, sehingga kernel menjatuhkan semua paket lebih lanjut sampai ada beberapa ruang kosong di buffer.
Anda dapat menambah ukuran buffer dengan opsi -B( --buffer-size) seperti ini:
tcpdump -B 4096 ....
Perhatikan bahwa ukurannya ditentukan dalam kilobyte, jadi baris di atas menetapkan ukuran buffer menjadi 4MB.
Juga saya dengan sengaja mengubah kibi- / mebi- menjadi kilo- / mega- dan menghapus kata tentang libpcap agar tidak membingungkan orang.
Dmitry Vasilyanov
4
Perhatikan juga bahwa dukungan untuk "opsi panjang" di tcpdump relatif baru; dalam versi yang lebih lama (kecuali untuk versi yang jauh lebih tua, yang tidak mendukung pengaturan ukuran buffer) yang dapat Anda lakukan tcpdump -B 4096.
Catatan lain, perlu waktu untuk menyiapkan buffer besar. Jika Anda mengatur buffer menjadi sesuatu yang gila, Anda mungkin kehilangan paket (tcpdump melaporkannya sebagai "paket yang dijatuhkan oleh kernel") selama waktu inisialisasi itu.
dgreene
27
Satu hal lagi yang perlu dipertimbangkan / coba adalah bahwa tcpdumpmungkin menghabiskan banyak waktu melakukan permintaan DNS untuk menyelesaikan IP ke nama domain. Jika Anda tidak membutuhkannya, cobalah melempar -nbendera (tanpa pencarian). misalnya:
Ini adalah penyelamat. Tidak menyadari bahwa tcpdump melakukan resolusi terbalik ketika membuang ke file !! Menggunakan -nn -B 4096memungkinkan saya untuk mendapatkan0 packets dropped by kernel
Blanka
11
Menurut man tcpdump:
paket yang dijatuhkan oleh kernel (ini adalah jumlah paket yang dijatuhkan, karena kurangnya ruang buffer, oleh mekanisme penangkapan paket di OS di mana tcpdump berjalan, jika OS melaporkan informasi itu ke aplikasi; jika tidak, itu akan dilaporkan sebagai 0).
Kernel menempatkan paket yang diambil dalam buffer tangkapan ukuran tetap . Jika tcpdumptidak mengosongkan buffer itu dengan cukup cepat, kernel akan mulai menimpa paket-paket lama dalam buffer dan secara bersamaan menambah counter yang dijatuhkan . Nilai penghitung itu adalah apa yang Anda lihat sebagai "dijatuhkan oleh kernel".
Selain apa yang dikatakan halaman manual, tampaknya ada beberapa alasan tambahan mengapa paket-paket dapat dibuang oleh kernel. Saya mengalami penurunan paket 100% dari tcpdumpmana satu-satunya lalu lintas di jaringan adalah satu paket PRB 512B per detik. Jelas penjelasan ruang buffer tidak masuk akal di sini - saya pikir kernel dapat menangani 0.5kiB / s.
Sesuatu yang menyertai distro saya (Ubuntu 14.04) mungkin telah melakukan semacam pemfilteran pintar pada lapisan tautan yang tidak menyukai paket pengujian saya. Solusi saya adalah membuat namespace jaringan baru sebagai berikut:
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
Di bagian dalam netnsshell, apa pun proses OS yang menyebabkan masalah sebelum keluar dari gambar dan tcpdumpmenunjukkan kepada saya semua paket yang saya harapkan untuk dilihat.
Saya menemukan berguna menggunakan tcpdump -copsi. Dengan cara ini Anda dapat mengatur jumlah paket dan kemudian berhenti dan Anda tidak dapat mengisi buffer.
Misalnya yang ini akan menangkap permintaan tcp di localhost.
Jawaban:
Dari manual tcpdump:
Sedikit penjelasan:
The
tcpdump
menangkap paket raw melewati antarmuka jaringan. Paket-paket harus diurai dan disaring sesuai dengan aturan yang ditentukan oleh Anda di baris perintah, dan itu membutuhkan waktu, sehingga paket yang masuk harus buffered (antri) untuk diproses. Kadang-kadang ada terlalu banyak paket, mereka disimpan ke buffer, tetapi mereka disimpan lebih cepat dari yang diproses, sehingga akhirnya buffer kehabisan ruang, sehingga kernel menjatuhkan semua paket lebih lanjut sampai ada beberapa ruang kosong di buffer.Anda dapat menambah ukuran buffer dengan opsi
-B
(--buffer-size
) seperti ini:Perhatikan bahwa ukurannya ditentukan dalam kilobyte, jadi baris di atas menetapkan ukuran buffer menjadi 4MB.
sumber
tcpdump -B 4096
.Satu hal lagi yang perlu dipertimbangkan / coba adalah bahwa
tcpdump
mungkin menghabiskan banyak waktu melakukan permintaan DNS untuk menyelesaikan IP ke nama domain. Jika Anda tidak membutuhkannya, cobalah melempar-n
bendera (tanpa pencarian). misalnya:sumber
-nn -B 4096
memungkinkan saya untuk mendapatkan0 packets dropped by kernel
Menurut
man tcpdump
:Kernel menempatkan paket yang diambil dalam buffer tangkapan ukuran tetap . Jika
tcpdump
tidak mengosongkan buffer itu dengan cukup cepat, kernel akan mulai menimpa paket-paket lama dalam buffer dan secara bersamaan menambah counter yang dijatuhkan . Nilai penghitung itu adalah apa yang Anda lihat sebagai "dijatuhkan oleh kernel".By the way, Anda dapat mengubah ukuran capture penyangga : Pass
tcpdump
yang-B
pilihan dengan ukuran KiB.sumber
Selain apa yang dikatakan halaman manual, tampaknya ada beberapa alasan tambahan mengapa paket-paket dapat dibuang oleh kernel. Saya mengalami penurunan paket 100% dari
tcpdump
mana satu-satunya lalu lintas di jaringan adalah satu paket PRB 512B per detik. Jelas penjelasan ruang buffer tidak masuk akal di sini - saya pikir kernel dapat menangani 0.5kiB / s.Sesuatu yang menyertai distro saya (Ubuntu 14.04) mungkin telah melakukan semacam pemfilteran pintar pada lapisan tautan yang tidak menyukai paket pengujian saya. Solusi saya adalah membuat namespace jaringan baru sebagai berikut:
Di bagian dalam
netns
shell, apa pun proses OS yang menyebabkan masalah sebelum keluar dari gambar dantcpdump
menunjukkan kepada saya semua paket yang saya harapkan untuk dilihat.sumber
Saya menemukan berguna menggunakan
tcpdump -c
opsi. Dengan cara ini Anda dapat mengatur jumlah paket dan kemudian berhenti dan Anda tidak dapat mengisi buffer.Misalnya yang ini akan menangkap permintaan tcp di localhost.
sumber