Tantangan saya
Saya perlu melakukan tcpdumping banyak data - sebenarnya dari 2 antarmuka yang tersisa dalam mode promiscuous yang dapat melihat banyak lalu lintas.
Singkatnya
- Log semua lalu lintas dalam mode promiscuous dari 2 antarmuka
- Antarmuka tersebut tidak diberi alamat IP
- file pcap harus diputar per ~ 1G
- Ketika 10 TB file disimpan, mulailah memotong yang tertua
Apa yang saya lakukan saat ini
Saat ini saya menggunakan tcpdump seperti ini:
ifconfig ethX promisc
ifconfig ethX promisc
tcpdump -n -C 1000 -z /data/compress.sh -i any -w /data/livedump/capture.pcap $FILTER
The $FILTER
berisi filter src / dst sehingga saya bisa menggunakan -i any
. Alasan untuk ini adalah, bahwa saya memiliki dua antarmuka dan saya ingin menjalankan dump dalam satu utas daripada dua.
compress.sh
menangani pemberian tar ke inti CPU lain, kompres data, berikan nama file yang masuk akal dan pindahkan ke lokasi arsip.
Saya tidak dapat menentukan dua antarmuka, jadi saya memilih untuk menggunakan filter dan membuang dari any
antarmuka.
Saat ini, saya tidak melakukan pembersihan, tetapi saya berencana untuk memonitor disk dan ketika saya memiliki 100G kiri saya akan mulai menghapus file tertua - ini seharusnya baik-baik saja.
Dan sekarang; masalahku
Saya melihat paket yang jatuh. Ini dari dump yang telah berjalan selama beberapa jam dan mengumpulkan sekitar 250 gigs file pcap:
430083369 packets captured
430115470 packets received by filter
32057 packets dropped by kernel <-- This is my concern
Bagaimana saya bisa menghindari begitu banyak paket yang jatuh?
Hal-hal ini sudah saya coba atau lihat
Mengubah nilai /proc/sys/net/core/rmem_max
dan /proc/sys/net/core/rmem_default
yang memang membantu - sebenarnya hanya menangani sekitar setengah dari paket yang dijatuhkan.
Saya juga telah melihat tegukan - masalah dengan tegukan adalah, bahwa itu tidak mendukung banyak antarmuka dalam satu proses dan itu menjadi marah jika antarmuka tidak memiliki alamat IP. Sayangnya, itu adalah pemecah kesepakatan dalam kasus saya.
Masalah berikutnya adalah, bahwa ketika lalu lintas mengalir melalui pipa, saya tidak bisa mendapatkan rotasi otomatis. Mendapatkan satu file 10 TB besar tidak terlalu efisien dan saya tidak memiliki mesin dengan 10TB + RAM yang dapat saya jalankan wireshark, jadi itu keluar.
Apakah Anda punya saran? Mungkin bahkan cara yang lebih baik untuk melakukan dump traffic sama sekali.
sumber
Jawaban:
tcpdump menyimpan data yang masuk dalam buffer cincin. Jika buffer overflow sebelum tcpdump memproses isinya, maka Anda kehilangan paket.
Ukuran buffer cincin default mungkin adalah 2048 (2MiB).
Untuk menambah ukuran buffer, tambahkan
-B
opsi:Anda juga harus mencoba menggunakan penyimpanan disk yang lebih cepat.
sumber
Saya akhirnya menemukan solusi untuk hidup bersama. Paket yang dijatuhkan telah menurun dari 0,0047% menjadi .00013% - yang pada awalnya tidak banyak, tetapi ketika kita berbicara jutaan paket, jumlahnya cukup banyak.
Solusinya terdiri dari beberapa hal. Salah satunya adalah mengubah ukuran buffer cincin seperti yang disarankan oleh Michael Hampton.
Juga, saya membuat ramf dan melakukan dumping langsung untuk itu, menulis ulang skrip kompres saya untuk memindahkan dump dari ramf ke disk. Ini hanya mengurangi jumlah yang sangat sedikit, tetapi cukup untuk menjadi terkenal - meskipun semua pengujian dan pembandingan disk menunjukkan, bahwa disk tidak boleh menjadi hambatan. Saya kira waktu akses sangat penting di sini.
Menonaktifkan hyper threading juga menghasilkan lebih dari yang Anda duga.
sumber