Python

Membangun Monitor Jaringan Anda sendiri dengan PyShark

Membangun Monitor Jaringan Anda sendiri dengan PyShark

Alat yang ada

Banyak alat untuk analisis jaringan telah ada selama beberapa waktu. Di Linux, misalnya, ini adalah Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack serta speedometer dan ettercap. Untuk penjelasan rinci tentang mereka, Anda mungkin melihat perbandingan Silver Moon [1].

Jadi, mengapa tidak menggunakan alat yang sudah ada, dan menulis sendiri sebagai gantinya? Alasan yang saya lihat adalah pemahaman yang lebih baik tentang protokol jaringan TCP/IP, mempelajari cara membuat kode dengan benar, atau menerapkan hanya fitur spesifik yang Anda perlukan untuk kasus penggunaan Anda karena alat yang ada tidak memberikan apa yang sebenarnya Anda butuhkan. Selain itu, peningkatan kecepatan dan beban ke aplikasi/sistem Anda juga dapat memainkan peran yang memotivasi Anda untuk lebih banyak bergerak ke arah ini.

Di alam liar, ada beberapa perpustakaan Python untuk pemrosesan dan analisis jaringan. Untuk pemrograman tingkat rendah, perpustakaan soket [2] adalah kuncinya. Pustaka berbasis protokol tingkat tinggi adalah httplib, ftplib, imaplib, dan smtplib. Untuk memantau port jaringan dan kandidat kompetitif aliran paket, digunakan python-nmap [3], dpkt [4], dan PyShark [5]. Baik untuk memantau dan mengubah aliran paket, perpustakaan scapy [6] banyak digunakan.

Pada artikel ini, kita akan melihat pustaka PyShark dan memantau paket mana yang tiba di antarmuka jaringan tertentu. Seperti yang akan Anda lihat di bawah, bekerja dengan PyShark sangatlah mudah. Dokumentasi di situs web proyek akan membantu Anda untuk langkah pertama - dengan itu, Anda akan mencapai hasil yang dapat digunakan dengan sangat cepat. Namun, ketika sampai pada seluk beluknya, diperlukan lebih banyak pengetahuan.

PyShark dapat melakukan lebih dari yang terlihat pada pandangan pertama, dan sayangnya, pada saat penulisan ini, dokumentasi yang ada tidak mencakupnya secara penuh. Ini membuatnya sulit dan memberikan alasan yang baik untuk melihat lebih dalam di bawah kap mesin.

Tentang PyShark

PyShark [8] adalah pembungkus Python untuk Tshark [10]. Itu hanya menggunakan kemampuannya untuk mengekspor data XML menggunakan penguraiannya. Tshark sendiri adalah versi baris perintah dari Wireshark. Baik Tshark dan PyShark bergantung pada pustaka Pcap yang benar-benar menangkap paket jaringan dan dikelola di bawah kap Tcpdump [7]. PyShark dikembangkan dan terus dipelihara oleh Dan (dia menggunakan nama KimiNewt di Twitter).

Untuk mencegah kemungkinan kebingungan, ada alat yang terdengar serupa, Apache Spark [11], yang merupakan mesin analitik terpadu untuk pemrosesan data skala besar. Nama PySpark digunakan untuk antarmuka Python ke Apache Spark, yang tidak akan kita bahas di sini.

Menginstal PyShark

PyShark membutuhkan perpustakaan Pcap dan Tshark untuk diinstal. Paket yang sesuai untuk Debian GNU/Linux 10 dan Ubuntu diberi nama libpcap0.8 dan tshark dan dapat diatur sebagai berikut menggunakan apt-get:

Daftar 1: Menginstal perpustakaan Pcap dan Tshark

# pip3 instal python-pyshark

Jika belum diinstal, Python3 dan Pip harus ditambahkan juga. Paket yang sesuai untuk Debian GNU/Linux 10 dan Ubuntu diberi nama python3 dan python3-pip dan dapat diinstal sebagai berikut menggunakan apt-get:

Daftar 2: Instal Python 3 dan PIP untuk Python 3

# apt-get install python3 python3-pip

Sekarang saatnya menambahkan PyShark. Berdasarkan penelitian kami, PyShark belum dikemas untuk distribusi Linux utama apa pun. Instalasinya dilakukan menggunakan penginstal paket Python pip3 (pip untuk Python 3) sebagai paket seluruh sistem sebagai berikut:

Daftar 3: Instal PyShark menggunakan PIP

# pip3 instal python-pyshark

Sekarang, PyShark siap digunakan dalam skrip Python di sistem Linux Anda. Harap perhatikan untuk mengeksekusi skrip Python di bawah ini sebagai pengguna administratif, misalnya, menggunakan sudo karena pustaka Pcap tidak mengizinkan Anda untuk mencari paket sebagai pengguna biasa.

Pernyataan berikut menambahkan konten modul PyShark ke namespace skrip Python Anda:

Daftar 4: Impor modul PyShark

impor pyshark

Metode Menangkap Paket

Di luar kotak, PyShark hadir dengan dua mode berbeda yang ditawarkan untuk mengumpulkan paket dari antarmuka jaringan yang diamati. Untuk pengumpulan berkelanjutan, gunakan metode LiveCapture(), dan untuk menyimpan ke file lokal, gunakan metode FileCapture() dari modul PyShark. Hasilnya adalah daftar paket (objek iterator Python) yang memungkinkan Anda menelusuri paket data yang diambil per paket. Daftar di bawah ini menunjukkan cara menggunakan kedua metode tersebut.

Daftar 5: Gunakan PyShark untuk menangkap dari antarmuka Wifi pertama wlan0

impor pyshark
tangkap = pyshark.LiveCapture(antarmuka='wlan0')

Dengan pernyataan sebelumnya, paket jaringan yang diambil disimpan dalam memori. Memori yang tersedia mungkin terbatas, namun, menyimpan paket yang diambil dalam file lokal adalah alternatifnya. Yang digunakan adalah format file Pcap [9]. Ini memungkinkan Anda untuk memproses dan menafsirkan data yang diambil oleh alat lain yang juga terhubung ke perpustakaan Pcap.

Daftar 6: Gunakan PyShark untuk menyimpan paket yang diambil dalam file lokal

impor pyshark
tangkap = pyshark.FileCapture('/tmp/networkpackages.topi')

Menjalankan daftar 5 dan 6, Anda belum memiliki output apa pun. Langkah selanjutnya adalah mempersempit paket yang akan dikumpulkan lebih tepat berdasarkan kriteria yang Anda inginkan.

Memilih Paket

Objek tangkapan yang diperkenalkan sebelumnya membuat koneksi ke antarmuka yang diinginkan. Selanjutnya, dua metode sniff() dan sniff_continuously() dari objek capture mengumpulkan paket jaringan. sniff() kembali ke pemanggil segera setelah semua paket yang diminta telah dikumpulkan. Sebaliknya, sniff_continuously() mengirimkan satu paket ke pemanggil segera setelah dikumpulkan. Ini memungkinkan streaming langsung lalu lintas jaringan.

Selanjutnya, kedua metode memungkinkan Anda untuk menentukan berbagai batasan dan mekanisme penyaringan paket, misalnya, jumlah paket menggunakan parameter packet_count, dan periode pengumpulan paket menggunakan parameter timeout. Listing 7 mendemonstrasikan cara mengumpulkan 50 paket jaringan, hanya, sebagai streaming langsung, menggunakan metode sniff_continuously().

Daftar 7: Kumpulkan 50 paket jaringan dari wlan0

impor pyshark
tangkap = pyshark.LiveCapture(antarmuka='wlan0')
untuk paket dalam penangkapan.sniff_continuously(packet_count=5):
cetak (paket)

Berbagai detail paket terlihat menggunakan pernyataan print(packet) (lihat Gambar 1).

Gambar 1: isi paket

Dalam daftar 7, Anda mengumpulkan semua jenis paket jaringan apa pun protokol atau port layanannya. PyShark memungkinkan Anda melakukan pemfilteran lanjutan, menggunakan apa yang disebut filter BPF [12]. Daftar 8 menunjukkan cara mengumpulkan 5 paket TCP yang masuk melalui port 80 dan mencetak jenis paket. Informasi disimpan dalam atribut paket high_layer.

Daftar 8: Mengumpulkan paket TCP, hanya

impor pyshark
tangkap = pyshark.LiveCapture(interface='wlan0', bpf_filter='tcp port 80')
menangkap.mengendus(jumlah_paket=5)
cetak (tangkap)
untuk paket yang di tangkap:
cetak (paket).lapisan_tertinggi)

Simpan daftar 8, sebagai file tcp-sniff.py, dan jalankan skrip Python. Outputnya adalah sebagai berikut:

Listing 9: Output dari Listing 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Membuka kotak paket yang diambil

Objek yang ditangkap berfungsi sebagai boneka Matroska Rusia - lapis demi lapis, berisi konten paket jaringan yang sesuai. Unboxing terasa seperti Natal - Anda tidak pernah tahu informasi apa yang Anda temukan di dalamnya sampai Anda membukanya. Daftar 10 menunjukkan menangkap 10 paket jaringan dan mengungkapkan jenis protokolnya, baik port dan alamat sumber maupun tujuan.

Daftar 10: Menampilkan sumber dan tujuan paket yang diambil

impor pyshark
waktu impor
# tentukan antarmuka
networkInterface = "enp0s3"
# tentukan objek tangkapan
tangkap = pyshark.LiveCapture (antarmuka = ​​antarmuka jaringan)
print("mendengarkan %s" % networkInterface)
untuk paket dalam penangkapan.sniff_continuously(packet_count=10):
# keluaran yang disesuaikan
mencoba:
# dapatkan stempel waktu
waktu setempat = waktu.asctime(waktu.waktu setempat (waktu.waktu()))
# dapatkan isi paket
protokol = paket.transport_layer # jenis protokol
src_addr = paket.aku p.src # alamat sumber
src_port = paket[protokol].srcport # port sumber
dst_addr = paket.aku p.dst # alamat tujuan
dst_port = paket[protokol].dstport # port tujuan
# info paket keluaran
print("%s IP %s:%s <-> %s:%s (%s)" % (waktu lokal, src_addr, src_port, dst_addr, dst_port, protokol))
kecuali AttributeError sebagai e:
# abaikan paket selain TCP, UDP dan IPv4
lulus
cetak ("")

Script menghasilkan output, seperti yang ditunjukkan pada Gambar 2, satu baris per paket yang diterima. Setiap baris dimulai dengan stempel waktu, diikuti dengan alamat IP dan port sumber, kemudian alamat IP dan port tujuan, dan terakhir, jenis protokol jaringan.


Gambar 2: Sumber dan tujuan untuk paket yang diambil

Kesimpulan

Membangun pemindai jaringan Anda sendiri tidak pernah semudah itu. Berdasarkan fondasi Wireshark, PyShark menawarkan kerangka kerja yang komprehensif dan stabil untuk memantau antarmuka jaringan sistem Anda sesuai kebutuhan.

Tautan dan Referensi

  • [1] Silver Moon: 18 Perintah untuk Memantau Bandwidth Jaringan di server Linux, https://www.pasang surut.com/linux-commands-monitor-network/
  • [2] Pustaka soket Python, https://docs.ular piton.org/3/library/socket.html
  • [3] python-nmap, https://pypi.org/project/python3-nmap/
  • [4] dpkt, https://pypi.org/proyek/dpkt/
  • [5] PyShark, https://pypi.org/proyek/pyshark/
  • [6] scapy, https://pypi.org/proyek/scapy/
  • [7] Tcpdump dan libpcap, http://www.tcpdump.organisasi/
  • [8] PyShark, situs web proyek, http://kiminewt.github.io/pyshark/
  • [9] Format File Libpcap, Wiki Wireshark, https://gitlab.com/wireshark/wireshark/-/wikis/Development/LibpcapFileFormat
  • [10] Tshark, https://www.wireshark.org/docs/man-pages/tshark.html
  • [11] Apache Spark, https://spark.apache.organisasi/
  • [12] Filter BPF, https://wiki.wireshark.org/CaptureFilter
Cara mengunduh dan Memainkan Civilization VI Sid Meier di Linux
Pengenalan permainan Civilization 6 adalah konsep modern dari konsep klasik yang diperkenalkan dalam seri game Age of Empires. Idenya cukup sederhana;...
Cara Menginstal dan Memainkan Doom di Linux
Pengantar Doom Seri Doom berasal dari tahun 90-an setelah rilis Doom. Itu adalah hit instan dan sejak saat itu seri game telah menerima banyak penghar...
Vulkan untuk Pengguna Linux
Dengan setiap generasi baru kartu grafis, kami melihat pengembang game mendorong batas kesetiaan grafis dan selangkah lebih dekat ke fotorealisme. Tet...