Por: @vilmarschm
Publicado em: 2019-01-31

Python Socket

Para o monitoramento dos clientes OpenVPN é necessário buscar informações desses clientes conectados em uma determinada instância.

OpenVPN fornece informações de clientes conectados por meio de conexão socket. Conexão socket nada mais é, um cliente conectado em uma porta para enviar e recebe mensagens do servidor.

O Python possui biblioteca para devolvimento de server e client socket, segue exemplo abaixo:

Exemplo Server

#!/usr/bin/env python

import socket

HOST = '127.0.0.1'
PORT = 65432

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

Exemplo Client

#!/usr/bin/env python

import socket

HOST = '127.0.0.1'
PORT = 65432

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Received', repr(data))

Para extrair as informações dos clientes conectados na instância OpenVPN. A instância deve ter configurado o parâmetro management:

management 127.0.0.1 11900

Segue o exemplo em python utilizando socket para busca de algumas informações do OpenVPN:

#!/usr/bin/env python

import socket

HOST = "127.0.0.1"
PORT = 11900

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    msg = s.recv(1024)
    msg = msg.decode()
    header = msg.find("Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since")
    clients = [find_index:].split("\n")[1:]

    for line in clients:
        client = line.split(",")
        if len(client) == 5:
            print("Common Name     ::: ", client[0])
            print("Real Address    ::: ", client[1])
            print("Virtual Address ::: ", client[2])