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])