Pitón

Construyendo su propio monitor de red con PyShark

Construyendo su propio monitor de red con PyShark

Herramientas existentes

Muchas herramientas para el análisis de redes existen desde hace bastante tiempo. Bajo Linux, por ejemplo, estos son Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack así como velocímetro y ettercap. Para obtener una descripción detallada de ellos, puede echar un vistazo a la comparación de Silver Moon [1].

Entonces, ¿por qué no utilizar una herramienta existente y escribir una propia?? Las razones que veo son una mejor comprensión de los protocolos de red TCP / IP, aprender a codificar correctamente o implementar solo la función específica que necesita para su caso de uso porque las herramientas existentes no le brindan lo que realmente necesita. Además, las mejoras de velocidad y carga en su aplicación / sistema también pueden desempeñar un papel que lo motive a moverse más en esta dirección.

En la naturaleza, existen bastantes bibliotecas de Python para el procesamiento y análisis de redes. Para la programación de bajo nivel, la biblioteca de conectores [2] es la clave. Las bibliotecas de alto nivel basadas en protocolos son httplib, ftplib, imaplib y smtplib. Para monitorear los puertos de red y los candidatos competitivos del flujo de paquetes, se utilizan python-nmap [3], dpkt [4] y PyShark [5]. Tanto para monitorear como para cambiar el flujo de paquetes, la biblioteca scapy [6] se usa ampliamente.

En este artículo, echaremos un vistazo a la biblioteca de PyShark y supervisaremos qué paquetes llegan a una interfaz de red específica. Como verá a continuación, trabajar con PyShark es sencillo. La documentación en el sitio web del proyecto lo ayudará en los primeros pasos; con ella, logrará un resultado utilizable muy rápidamente. Sin embargo, cuando se trata del meollo de la cuestión, se necesitan más conocimientos.

PyShark puede hacer mucho más de lo que parece a primera vista y, desafortunadamente, en el momento de escribir este artículo, la documentación existente no lo cubre en su totalidad. Esto hace que sea innecesariamente difícil y proporciona una buena razón para mirar más profundamente debajo del capó.

Sobre PyShark

PyShark [8] es un contenedor de Python para Tshark [10]. Simplemente usa su capacidad para exportar datos XML usando su análisis. Tshark en sí es la versión de línea de comandos de Wireshark. Tanto Tshark como PyShark dependen de la biblioteca Pcap que realmente captura paquetes de red y se mantiene bajo el capó de Tcpdump [7]. PyShark es desarrollado y mantenido continuamente por Dan (usa el nombre KimiNewt en Twitter).

Para evitar posibles confusiones, existe una herramienta de sonido similar, Apache Spark [11], que es un motor de análisis unificado para el procesamiento de datos a gran escala. El nombre PySpark se usa para la interfaz Python para Apache Spark, que no discutimos aquí.

Instalación de PyShark

PyShark requiere que se instalen tanto la biblioteca Pcap como Tshark. Los paquetes correspondientes para Debian GNU / Linux 10 y Ubuntu se denominan libpcap0.8 y tshark y se puede configurar de la siguiente manera usando apt-get:

Listado 1: Instalación de la biblioteca Pcap y Tshark

# pip3 instalar python-pyshark

Si aún no está instalado, también deben agregarse Python3 y Pip. Los paquetes correspondientes para Debian GNU / Linux 10 y Ubuntu se denominan python3 y python3-pip y se pueden instalar de la siguiente manera usando apt-get:

Listado 2: Instale Python 3 y PIP para Python 3

# apt-get install python3 python3-pip

Ahora es el momento de agregar PyShark. Según nuestra investigación, PyShark aún no está empaquetado para ninguna distribución importante de Linux. La instalación se realiza utilizando el instalador de paquetes Python pip3 (pip para Python 3) como un paquete para todo el sistema de la siguiente manera:

Listado 3: Instale PyShark usando PIP

# pip3 instalar python-pyshark

Ahora, PyShark está listo para usarse en scripts de Python en su sistema Linux. Tenga en cuenta que debe ejecutar los scripts de Python a continuación como usuario administrativo, por ejemplo, usando sudo porque la biblioteca Pcap no le permite buscar paquetes como usuario regular.

La siguiente declaración agrega el contenido del módulo PyShark al espacio de nombres de su secuencia de comandos de Python:

Listado 4: Importar el módulo PyShark

importar pyshark

Métodos de captura de paquetes

De fábrica, PyShark viene con dos modos diferentes con los que ofrece recopilar paquetes de la interfaz de red observada. Para la recopilación continua, use el método LiveCapture () y para guardar en un archivo local, use el método FileCapture () del módulo PyShark. El resultado es una lista de paquetes (objeto iterador de Python) que le permite revisar los datos capturados paquete por paquete. Los listados a continuación demuestran cómo utilizar los dos métodos.

Listado 5: Use PyShark para capturar desde la primera interfaz Wifi wlan0

importar pyshark
capture = pyshark.LiveCapture (interfaz = 'wlan0')

Con las declaraciones anteriores, los paquetes de red capturados se guardan en la memoria. La memoria disponible puede ser limitada, sin embargo, almacenar los paquetes capturados en un archivo local es una alternativa. Está en uso el formato de archivo Pcap [9]. Esto le permite procesar e interpretar los datos capturados por otras herramientas que también están vinculadas a la biblioteca Pcap.

Listado 6: use PyShark para almacenar los paquetes capturados en un archivo local

importar pyshark
capture = pyshark.FileCapture ('/ tmp / networkpackages.gorra')

Al ejecutar los listados 5 y 6, todavía no tendrá ninguna salida. El siguiente paso es reducir los paquetes que se recopilarán con mayor precisión en función de los criterios deseados.

Seleccionar paquetes

El objeto de captura introducido anteriormente establece una conexión con la interfaz deseada. A continuación, los dos métodos sniff () y sniff_continuously () del objeto de captura recopilan los paquetes de red. sniff () vuelve a la persona que llama tan pronto como se hayan recopilado todos los paquetes solicitados. Por el contrario, sniff_continuously () entrega un solo paquete a la persona que llama tan pronto como se recopila. Esto permite una transmisión en vivo del tráfico de la red.

Además, los dos métodos le permiten especificar varias limitaciones y mecanismos de filtrado de paquetes, por ejemplo, el número de paquetes que utilizan el parámetro packet_count y el período durante el cual los paquetes se recopilarán mediante el parámetro timeout. El Listado 7 demuestra cómo recopilar 50 paquetes de red, solo, como una transmisión en vivo, utilizando el método sniff_continuously ().

Listado 7: recopile 50 paquetes de red de wlan0

importar pyshark
capture = pyshark.LiveCapture (interfaz = 'wlan0')
para paquetes en captura.sniff_continuously (packet_count = 5):
imprimir (paquete)

Varios detalles del paquete son visibles usando la impresión de la declaración (paquete) (vea la Figura 1).

Figura 1: contenido del paquete

En el listado 7, recopiló todo tipo de paquetes de red sin importar qué protocolo o puerto de servicio. PyShark le permite realizar un filtrado avanzado, utilizando el llamado filtro BPF [12]. El Listado 8 demuestra cómo recopilar 5 paquetes TCP que ingresan a través del puerto 80 e imprimen el tipo de paquete. La información se almacena en el atributo de paquete capa_máxima.

Listado 8: Recopilación de paquetes TCP, solo

importar pyshark
capture = pyshark.LiveCapture (interfaz = 'wlan0', bpf_filter = 'puerto tcp 80')
capturar.olfatear (cuenta_paquetes = 5)
imprimir (capturar)
para paquetes en captura:
imprimir (paquete.capa_más alta)

Guarde el listado 8, como el archivo tcp-sniff.py y ejecute el script de Python. El resultado es el siguiente:

Listado 9: La salida del Listado 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Desembalaje de los paquetes capturados

El objeto capturado funciona como una muñeca rusa Matroska: capa por capa, contiene el contenido del paquete de red correspondiente. Desembalar se siente un poco como Navidad: nunca se sabe qué información se encuentra dentro hasta que lo abre. El Listado 10 demuestra la captura de 10 paquetes de red y la revelación de su tipo de protocolo, tanto el puerto de origen como el de destino y la dirección.

Listado 10: Muestra el origen y el destino del paquete capturado

importar pyshark
tiempo de importación
# definir interfaz
networkInterface = "enp0s3"
# definir objeto de captura
capture = pyshark.LiveCapture (interfaz = networkInterface)
print ("escuchando en% s"% networkInterface)
para paquetes en captura.sniff_continuously (packet_count = 10):
# salida ajustada
intentar:
# obtener marca de tiempo
localtime = tiempo.asctime (tiempo.localtime (tiempo.hora()))
# obtener contenido del paquete
protocolo = paquete.capa_transporte # tipo de protocolo
src_addr = paquete.ip.src # dirección de origen
src_port = paquete [protocolo].srcport # puerto de origen
dst_addr = paquete.ip.dst # dirección de destino
dst_port = paquete [protocolo].dstport # puerto de destino
# información del paquete de salida
print ("% s IP% s:% s <-> % s:% s (% s) "% (localtime, src_addr, src_port, dst_addr, dst_port, protocolo))
excepto AttributeError como e:
# ignorar paquetes que no sean TCP, UDP e IPv4
aprobar
impresión (" ")

El script genera una salida, como se muestra en la Figura 2, una sola línea por paquete recibido. Cada línea comienza con una marca de tiempo, seguida de la dirección IP y el puerto de origen, luego la dirección IP y el puerto de destino y, finalmente, el tipo de protocolo de red.


Figura 2: Origen y destino de los paquetes capturados

Conclusión

Crear su propio escáner de red nunca ha sido más fácil que eso. Basado en los cimientos de Wireshark, PyShark le ofrece un marco integral y estable para monitorear las interfaces de red de su sistema de la manera que lo requiera.

Enlaces y referencias

  • [1] Silver Moon: 18 comandos para monitorear el ancho de banda de la red en el servidor Linux, https: // www.mareas binarias.com / linux-commands-monitor-network /
  • [2] Biblioteca de sockets de Python, https: // docs.pitón.org / 3 / library / socket.html
  • [3] python-nmap, https: // pypi.org / project / python3-nmap /
  • [4] dpkt, https: // pypi.org / project / dpkt /
  • [5] PyShark, https: // pypi.org / project / pyshark /
  • [6] scapy, https: // pypi.org / proyecto / scapy /
  • [7] Tcpdump y libpcap, http: // www.tcpdump.org /
  • [8] PyShark, sitio web del proyecto, http: // kiminewt.github.io / pyshark /
  • [9] Formato de archivo Libpcap, Wireshark Wiki, https: // gitlab.com / Wireshark / Wireshark / - / wikis / Desarrollo / LibpcapFileFormat
  • [10] Tshark, https: // www.Wirehark.org / docs / man-pages / tshark.html
  • [11] Apache Spark, https: // chispa.apache.org /
  • [12] Filtro BPF, https: // wiki.Wirehark.org / CaptureFilters
Cómo usar AutoKey para automatizar juegos de Linux
AutoKey es una utilidad de automatización de escritorio para Linux y X11, programada en Python 3, GTK y Qt. Usando su funcionalidad de scripting y MAC...
Cómo mostrar el contador de FPS en juegos de Linux
Los juegos de Linux obtuvieron un gran impulso cuando Valve anunció el soporte de Linux para el cliente Steam y sus juegos en 2012. Desde entonces, mu...
Cómo descargar y jugar Sid Meier's Civilization VI en Linux
Introducción al juego Civilization 6 es una versión moderna del concepto clásico introducido en la serie de juegos Age of Empires. La idea era bastant...