Ferramentas existentes
Muitas ferramentas para análise de rede já existem há algum tempo. No Linux, por exemplo, são Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack, bem como velocímetro e ettercap. Para uma descrição detalhada deles, você pode dar uma olhada na comparação de Silver Moon [1].
Então, por que não usar uma ferramenta existente e escrever sua própria, em vez? As razões que vejo são uma melhor compreensão dos protocolos de rede TCP / IP, aprender a codificar corretamente ou implementar apenas o recurso específico de que você precisa para seu caso de uso, porque as ferramentas existentes não fornecem o que você realmente precisa. Além disso, as melhorias de velocidade e carga em seu aplicativo / sistema também podem desempenhar um papel que o motiva a se mover mais nessa direção.
Em estado selvagem, existem várias bibliotecas Python para processamento e análise de rede. Para programação de baixo nível, a biblioteca de soquetes [2] é a chave. Bibliotecas de alto nível baseadas em protocolo são httplib, ftplib, imaplib e smtplib. Para monitorar as portas de rede e os candidatos competitivos do fluxo de pacotes, são usados o python-nmap [3], o dpkt [4] e o PyShark [5]. Para monitorar e alterar o fluxo de pacotes, a biblioteca scapy [6] é amplamente utilizada.
Neste artigo, daremos uma olhada na biblioteca PyShark e monitoraremos quais pacotes chegam a uma interface de rede específica. Como você verá abaixo, trabalhar com o PyShark é simples. A documentação no site do projeto irá ajudá-lo nos primeiros passos - com ela, você alcançará um resultado utilizável muito rapidamente. No entanto, quando se trata do âmago da questão, mais conhecimento é necessário.
O PyShark pode fazer muito mais do que parece à primeira vista e, infelizmente, no momento em que este livro foi escrito, a documentação existente não cobre isso por completo. Isso torna desnecessariamente difícil e fornece um bom motivo para olhar mais profundamente sob o capô.
Sobre PyShark
PyShark [8] é um wrapper Python para Tshark [10]. Ele simplesmente usa sua capacidade de exportar dados XML usando sua análise. O próprio Tshark é a versão de linha de comando do Wireshark. Ambos Tshark e PyShark dependem da biblioteca Pcap que realmente captura pacotes de rede e é mantida sob o capô do Tcpdump [7]. PyShark é desenvolvido e mantido continuamente por Dan (ele usa o nome KimiNewt no Twitter).
Para evitar possíveis confusões, existe uma ferramenta de som semelhante, Apache Spark [11], que é um motor analítico unificado para processamento de dados em grande escala. O nome PySpark é usado para a interface Python do Apache Spark, que não discutimos aqui.
Instalando o PyShark
O PyShark requer que a biblioteca Pcap e o Tshark estejam instalados. Os pacotes correspondentes para Debian GNU / Linux 10 e Ubuntu são nomeados libpcap0.8 e tshark e pode ser configurado da seguinte maneira usando apt-get:
Listagem 1: Instalando a biblioteca Pcap e Tshark
# pip3 install python-pysharkSe ainda não estiver instalado, Python3 e Pip também devem ser adicionados. Os pacotes correspondentes para Debian GNU / Linux 10 e Ubuntu são chamados de python3 e python3-pip e podem ser instalados da seguinte maneira usando apt-get:
Listagem 2: Instale Python 3 e PIP para Python 3
# apt-get install python3 python3-pipAgora é hora de adicionar o PyShark. Com base em nossa pesquisa, o PyShark ainda não foi empacotado para nenhuma distribuição Linux importante. A instalação dele é feita usando o instalador de pacote Python pip3 (pip para Python 3) como um pacote para todo o sistema da seguinte maneira:
Listagem 3: Instale o PyShark usando PIP
# pip3 install python-pysharkAgora, o PyShark está pronto para ser usado em scripts Python em seu sistema Linux. Observe para executar os scripts Python abaixo como um usuário administrativo, por exemplo, usando sudo porque a biblioteca Pcap não permite que você procure por pacotes como um usuário regular.
A instrução a seguir adiciona o conteúdo do módulo PyShark ao namespace do seu script Python:
Listagem 4: Importar o módulo PyShark
importar pysharkMétodos de captura de pacotes
Pronto para usar, o PyShark vem com dois modos diferentes com os quais oferece a coleta de pacotes da interface de rede observada. Para coleta contínua, use o método LiveCapture (), e para salvar em um arquivo local, use o método FileCapture () do módulo PyShark. O resultado é uma lista de pacotes (objeto iterador Python) que permite que você percorra o pacote de dados capturados por pacote. As listas abaixo demonstram como usar os dois métodos.
Listagem 5: Use o PyShark para capturar da primeira interface Wifi wlan0
importar pysharkcapture = pyshark.LiveCapture (interface = 'wlan0')
Com as declarações anteriores, os pacotes de rede capturados são mantidos na memória. A memória disponível pode ser limitada, no entanto, armazenar os pacotes capturados em um arquivo local é uma alternativa. Em uso está o formato de arquivo Pcap [9]. Isso permite que você processe e interprete os dados capturados por outras ferramentas que estão ligadas à biblioteca Pcap também.
Listagem 6: Use o PyShark para armazenar os pacotes capturados em um arquivo local
importar pysharkcapture = pyshark.FileCapture ('/ tmp / networkpackages.boné')
Executando as listagens 5 e 6, você ainda não terá nenhuma saída. A próxima etapa é restringir os pacotes a serem coletados com mais precisão com base nos critérios desejados.
Seleção de pacotes
O objeto de captura introduzido anteriormente estabelece uma conexão com a interface desejada. Em seguida, os dois métodos sniff () e sniff_continuously () do objeto de captura coletam os pacotes de rede. sniff () retorna ao chamador assim que todos os pacotes solicitados forem coletados. Em contraste, sniff_continuously () entrega um único pacote ao chamador assim que ele é coletado. Isso permite uma transmissão ao vivo do tráfego da rede.
Além disso, os dois métodos permitem que você especifique várias limitações e mecanismos de filtragem de pacotes, por exemplo, o número de pacotes usando o parâmetro packet_count e o período durante o qual os pacotes devem ser coletados usando o parâmetro timeout. A Listagem 7 demonstra como coletar 50 pacotes de rede, apenas, como uma transmissão ao vivo, usando o método sniff_continuously ().
Listagem 7: Colete 50 pacotes de rede de wlan0
importar pysharkcapture = pyshark.LiveCapture (interface = 'wlan0')
para pacote em captura.sniff_continuously (packet_count = 5):
imprimir (pacote)
Vários detalhes do pacote são visíveis usando a declaração de impressão (pacote) (ver Figura 1).
Figura 1: conteúdo do pacote
Na listagem 7, você coletou todos os tipos de pacotes de rede, independentemente do protocolo ou porta de serviço. PyShark permite que você faça filtragem avançada, usando o chamado filtro BPF [12]. A Listagem 8 demonstra como coletar 5 pacotes TCP vindos da porta 80 e imprimindo o tipo de pacote. A informação é armazenada no atributo de pacote mais alto_camada.
Listagem 8: Coletando pacotes TCP, apenas
importar pysharkcapture = pyshark.LiveCapture (interface = 'wlan0', bpf_filter = 'porta tcp 80')
capturar.sniff (packet_count = 5)
imprimir (capturar)
para pacote em captura:
imprimir (pacote.camada mais alta)
Salve a listagem 8, como o arquivo tcp-sniff.py, e execute o script Python. O resultado é o seguinte:
Listagem 9: A saída da Listagem 8
# python3 tcp-sniff.pyTCP
TCP
TCP
OCSP
TCP
#
Desempacotar os pacotes capturados
O objeto capturado funciona como uma boneca russa Matroska - camada por camada, ele contém o conteúdo do pacote de rede correspondente. Desembalar parece um pouco com o Natal - você nunca sabe quais informações encontrará lá dentro até abri-las. A Listagem 10 demonstra a captura de 10 pacotes de rede e a revelação de seu tipo de protocolo, tanto a porta de origem quanto de destino e o endereço.
Listagem 10: Mostrando origem e destino do pacote capturado
importar pysharktempo de importação
# define interface
networkInterface = "enp0s3"
# define o objeto de captura
capture = pyshark.LiveCapture (interface = networkInterface)
imprimir ("ouvindo em% s"% networkInterface)
para pacote em captura.sniff_continuously (packet_count = 10):
# saída ajustada
tentar:
# get timestamp
localtime = time.asctime (tempo.hora local (hora.Tempo()))
# obter o conteúdo do pacote
protocolo = pacote.transport_layer # protocol type
src_addr = pacote.ip.src # endereço de origem
src_port = pacote [protocolo].srcport # porta de origem
dst_addr = pacote.ip.dst # endereço de destino
dst_port = pacote [protocolo].dstport # porta de destino
# informação do pacote de saída
imprimir ("% s IP% s:% s <-> % s:% s (% s) "% (localtime, src_addr, src_port, dst_addr, dst_port, protocolo))
exceto AttributeError como e:
# ignorar pacotes diferentes de TCP, UDP e IPv4
passar
impressão (" ")
O script gera uma saída, conforme mostrado na Figura 2, uma única linha por pacote recebido. Cada linha começa com um carimbo de data / hora, seguido pelo endereço IP de origem e porta, então o endereço IP de destino e porta e, finalmente, o tipo de protocolo de rede.
Figura 2: Origem e destino dos pacotes capturados
Conclusão
Construir seu próprio scanner de rede nunca foi mais fácil do que isso. Com base nos fundamentos do Wireshark, o PyShark oferece uma estrutura abrangente e estável para monitorar as interfaces de rede do seu sistema da maneira que você precisar.
Links e referências
- [1] Silver Moon: 18 comandos para monitorar a largura de banda da rede no servidor Linux, https: // www.marés binárias.com / linux-command-monitor-network /
- [2] Biblioteca de soquetes Python, https: // docs.Pitão.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 / projeto / pyshark /
- [6] scapy, https: // pypi.org / projeto / scapy /
- [7] Tcpdump e libpcap, http: // www.tcpdump.org /
- [8] PyShark, site do projeto, http: // kiminewt.github.io / pyshark /
- [9] Formato de arquivo Libpcap, Wireshark Wiki, https: // gitlab.com / fioshark / fioshark / - / wikis / Development / LibpcapFileFormat
- [10] Tshark, https: // www.wirehark.org / docs / man-pages / tshark.html
- [11] Apache Spark, https: // spark.apache.org /
- [12] Filtro BPF, https: // wiki.wirehark.org / CaptureFilters