VPN mit Python verbinden

Migel Hewage Nimesha 15 Februar 2024
  1. Was ist ein VPN
  2. VPN mit Python verbinden
  3. Abschluss
VPN mit Python verbinden

In der Welt sind Sicherheit und Datenschutz zu wichtigen Anliegen der Menschen geworden. Auf der Suche nach einer Lösung haben Entwickler VPNs entwickelt.

Was ist ein VPN

Ein Virtual Private Network, auch bekannt als VPN, ist eine Software, die ein privates Netzwerk erstellt, um unsere Online-Privatsphäre zu schützen. VPN bietet uns viele Vorteile, aber geschützte Privatsphäre und Datenverschlüsselung sind die Hauptvorteile für die Benutzer.

  1. Geschützte Privatsphäre

    Da VPN ein privates Netzwerk innerhalb des öffentlichen Netzwerks erstellt, kann das, was wir im Internet tun, nicht virtuell nachverfolgt werden. Es verbirgt unsere IP-Adresse, sodass Dritte unsere Aktivitäten nicht verfolgen können.

    Das Verstecken der IP bedeutet, dass die Website, die wir über ein VPN besuchen, den VPN-Server als Ursprung des Datenverkehrs sieht.

    VPN maskiert also die IP-Adresse des Benutzers und die IP des VPN-Servers ist sichtbar. Am wichtigsten ist, dass dieser Prozess die Ausnutzung des Standorts des Benutzers und des Datenverkehrs verhindert; daher ist die Privatsphäre des Benutzers geschützt.

  2. Datenverschlüsselung

    VPN verschlüsselt auch unsere Online-Daten. Das VPN verschlüsselt die Daten, die wir über das Internet senden, sodass Hacker und andere Dritte sie nicht abrufen können.

    Selbst wenn sie sie abrufen, können sie den Inhalt nicht verstehen oder die Daten entschlüsseln.

    Da wir jetzt ein gutes Verständnis davon haben, was ein VPN ist, versuchen wir, es zu verbinden. In diesem Artikel besprechen wir, wie man VPN mit Python verbindet.

VPN mit Python verbinden

Dieses Tutorial verwendet einen kostenlosen VPN-Dienst von VPNGate und OpenVPN-Software. VPNGate ist ein öffentlicher VPN-Cloud-Dienst, den wir kostenlos nutzen können.

Um OpenVPN nutzen zu können, müssen wir es auf unserem System installieren. Für Windows-Betriebssysteme können Sie es manuell herunterladen und installieren.

Verwenden Sie für Linux- oder Ubuntu-Benutzer den folgenden Befehl.

OpenVPN installieren:

$ apt-get install openvpn easy-rsa

Nach der Installation können wir ein Python-Skript erstellen, um eine Verbindung zum VPN herzustellen. Wenn wir dieses Skript im Terminal ausführen, müssen wir ein Land als Argument angeben.

Die Syntax ist unten.

Python3 <filename.py> <countryname>

Bei der Angabe des Ländernamens gibt es zwei Möglichkeiten.

  1. Langer Name des Landes

    $ python3 vpn.py Japan
    
  2. Kurzname des Landes

    $ python3 vpn.py JP
    

Als ersten Schritt müssen wir die folgenden Bibliotheken in das Skript importieren.

import requests
import os
import sys
import tempfile
import subprocess
import base64
import time
import json

Manchmal kann ein Benutzer mehr als ein Land eingeben, wenn er das Skript ausführt. Um dies zu verhindern, können wir den folgenden Codeabschnitt verwenden.

Als ersten Schritt müssen wir die folgenden Bibliotheken in das Skript importieren.

if len(sys.argv) != 2:
    print("Enter one country at a time!")
    exit(1)
cntry = sys.argv[1]

Hier prüfen wir in der ersten Zeile, ob die Summe der Argumente ungleich zwei ist. Wenn es gleich ist, fahren wir mit dem angegebenen Land fort; Andernfalls setzen wir Vorsicht und Ausfahrt.

Als nächstes können wir überprüfen, ob der Benutzer den langen oder kurzen Namen des Landes angegeben hat. Wenn der Benutzer einen Buchstaben eingibt, können wir eine Fehlermeldung ausgeben.

if len(cntry) > 2:
    j = 5
elif len(cntry) == 2:
    j = 6
else:
    print("Cannot identify the country. Name is too short.")
    exit(1)

Jetzt können wir also eine Liste der verfügbaren kostenlosen VPN-Server von der VPNGate-Website abrufen. Zusammen mit der Liste können wir Bezeichnungen der VPN-Server wie HostName, IP, Score, Ping usw. und ihre Werte erhalten.

try:
    vpnServerListData = requests.get("http://www.vpngate.net/api/iphone/").text.replace(
        "\r", ""
    )
    freeServers = [line.split(",") for line in vpnServerListData.split("\n")]
    serverLabels = freeServers[1]
    serverLabels[0] = serverLabels[0][1:]
    freeServers = [srvrs for srvrs in freeServers[2:] if len(srvrs) > 1]
except:
    print("Something is wrong! Cannot load the VPN server's data")
    exit(1)

Dann müssen wir die verfügbaren Server abrufen und die Gesamtzahl abrufen. Dann können wir die Anzahl der verfügbaren Server anzeigen.

Wir können eine Nachricht ausgeben, in der dies erwähnt wird, und beenden, wenn keine Server verfügbar sind. Um diese Aufgabe zu erfüllen, können wir den folgenden Codeabschnitt verwenden.

availableServers = [srvrs for srvrs in freeServers if cntry.lower() in srvrs[j].lower()]
numOfServers = len(availableServers)
print("We found " + str(numOfServers) + " servers for " + cntry)
if numOfServers == 0:
    exit(1)

Nun soll angezeigt werden, wie viele Server das Tool OpenVPN unterstützen. Da wir dieses Tool verwenden, um eine Verbindung zu VPN herzustellen, ist es wichtig, unterstützende VPN-Server zu haben, und wir können sie dann herausfiltern.

supporteServers = [srvrs for srvrs in availableServers if len(srvrs[-1]) > 0]
print("There are " + str(len(supporteServers)) + " servers that support OpenVPN")

Da wir die unterstützten Server gefiltert haben, müssen wir unter ihnen den besten Server mit dem niedrigsten Ping und der höchsten Geschwindigkeit und Punktzahl auswählen.

Dann können wir seine Attribute (Labels) mit einer for-Schleife anzeigen. Und schließlich kann das Land angezeigt werden.

bestServer = sorted(
    supporteServers, key=lambda srvrs: float(srvrs[2].replace(",", ".")), reverse=True
)[0]
print("\n------------------Best server------------------")
labelPair = list(zip(serverLabels, bestServer))[:-1]
for (l, d) in labelPair[:4]:
    print(l + ": " + d)
print(labelPair[4][0] + ": " + str(float(labelPair[4][1]) / 10 ** 6) + " MBps")
print("Country: " + labelPair[5][1])

Ausgang:

bester Server

Bevor wir das VPN starten, sollten wir die resolveconf mit den DNS-Einstellungen aktualisieren. Außerdem sollten sie im String-Format vorliegen.

Standardmäßig wird es im Binärformat geliefert. Mit base64 decode können wir sie in Strings umwandeln.

Dann können wir das VPN starten.

print("\nLaunching VPN...")
_, path = tempfile.mkstemp()
file = open(path, "wb")
file.write(base64.b64decode(bestServer[-1]))
file.write(
    b"\nscript-security 2\nup /etc/openvpn/update-resolv-conf\ndown /etc/openvpn/update-resolv-conf"
)
file.close()
vpnR = subprocess.Popen(["sudo", "openvpn", "--config", path])

Nachdem wir es gestartet haben, können wir die folgende Ausgabe erhalten.

VPN starten

Wir haben eine erfolgreiche Verbindung, wenn Sie eine Meldung wie Initialization Sequence Competed erhalten.

Initialisierungssequenz abgeschlossen

Jetzt haben wir uns erfolgreich mit dem VPN verbunden. Unten sehen Sie die VPNGate-Serverinformationen, die wir nach einer erfolgreichen Verbindung sehen können.

Außerdem können wir die Zeit einstellen, die erforderlich ist, um OpenVPN mit dem VPN-Server zu verbinden. Durch den folgenden Codeabschnitt können wir dies erreichen.

try:
    # time required to connect the openvpn to connect the vpn server
    time.sleep(60)
    start_time = time.time()
    nUrl = "http://bot.whatismyipaddress.com/"
    nRet = requests.get(nUrl)
    if nRet.status_code == 200:
        with open('resp', "wb") as txtFile:
            txtFile.write(nRet.text)
            print('Time took to check Ip address  ',
                  (time.time() - start_time))
    vpnR.kill()

Um die VPN-Verbindung zu beenden, verwenden Sie Strg+C. Dann wird die Verbindung beendet und das System gibt eine Nachricht aus, um den Benutzer zu benachrichtigen.

except Exception as ex:
    try:
        vpnR.kill()
    except:
        pass
    while vpnR.poll() != 0:
        time.sleep(1)
    print('\nVPN has terminated')

Ausgang:

VPN beendet

Vollständiger Code:

import requests
import os
import sys
import tempfile
import subprocess
import base64
import time
import json

if len(sys.argv) != 2:
    print("Enter one country at a time!")
    exit(1)
cntry = sys.argv[1]

if len(cntry) > 2:
    j = 5
elif len(cntry) == 2:
    j = 6
else:
    print("Cannot identify the country. Name is too short.")
    exit(1)

try:
    vpnServerListData = requests.get("http://www.vpngate.net/api/iphone/").text.replace(
        "\r", ""
    )
    freeServers = [line.split(",") for line in vpnServerListData.split("\n")]
    serverLabels = freeServers[1]
    serverLabels[0] = serverLabels[0][1:]
    freeServers = [srvrs for srvrs in freeServers[2:] if len(srvrs) > 1]
except:
    print("Something is wrong! Cannot load the VPN server's data")
    exit(1)

    availableServers = [
        srvrs for srvrs in freeServers if cntry.lower() in srvrs[j].lower()
    ]
    numOfServers = len(availableServers)
    print("We found " + str(numOfServers) + " servers for " + cntry)
    if numOfServers == 0:
        exit(1)

    supporteServers = [srvrs for srvrs in availableServers if len(srvrs[-1]) > 0]
    print(str(len(supporteServers)) + " of these servers support OpenVPN")

    bestServer = sorted(
        supporteServers,
        key=lambda srvrs: float(srvrs[2].replace(",", ".")),
        reverse=True,
    )[0]
    print("\n== Best server ==")
    labelPair = list(zip(serverLabels, bestServer))[:-1]
    for (l, d) in labelPair[:4]:
        print(l + ": " + d)
    print(labelPair[4][0] + ": " + str(float(labelPair[4][1]) / 10 ** 6) + " MBps")
    print("Country: " + labelPair[5][1])

    print("\nLaunching VPN...")
    _, path = tempfile.mkstemp()
    file = open(path, "wb")
    file.write(base64.b64decode(bestServer[-1]))
    file.write(
        b"\nscript-security 2\nup /etc/openvpn/update-resolv-conf\ndown /etc/openvpn/update-resolv-conf"
    )
    file.close()
    vpnR = subprocess.Popen(["sudo", "openvpn", "--config", path])

try:
    # time required to connect the openvpn to connect the vpn server
    time.sleep(60)
    timeS = time.time()
    nUrl = "http://bot.whatismyipaddress.com/"
    nRet = requests.get(nUrl)
    if nRet.status_code == 200:
        with open("resp", "wb") as txtFile:
            txtFile.write(nRet.text)
    print("Time took to check Ip address  ", (time.time() - timeS))
    vpnR.kill()

except Exception as ex:
    try:
        vpnR.kill()
    except:
        pass
    while vpnR.poll() != 0:
        time.sleep(1)
    print("\nVPN has terminated")

Ausgabe (ohne Abschluss):

ohne zu beenden

Abschluss

In diesem Artikel haben wir besprochen, was ein VPN ist und welche Vorteile es hat. Dann verbinden wir einen kostenlosen VPN-Dienst mit Python.

Es gibt andere Methoden, um unser Ziel zu erreichen, aber wir können die grundlegenden Konzepte der Verbindung zu einem VPN durch diese Methode leicht verstehen.

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.