Python을 사용하여 VPN 연결

Migel Hewage Nimesha 2023년10월10일
  1. VPN이란 무엇입니까
  2. Python을 사용하여 VPN 연결
  3. 결론
Python을 사용하여 VPN 연결

세상에서 보안과 프라이버시는 사람들의 주요 관심사가 되었습니다. 해결책을 찾기 위해 개발자들은 VPN을 만들었습니다.

VPN이란 무엇입니까

VPN이라고도 하는 가상 사설망은 온라인 개인 정보를 보호하기 위해 사설 네트워크를 생성하는 소프트웨어입니다. VPN은 우리에게 많은 이점을 제공하지만 개인 정보 보호 및 데이터 암호화가 사용자에게 주요 이점입니다.

  1. 개인정보 보호

    VPN은 공용 네트워크 내에 사설망을 만들기 때문에 인터넷에서 우리가 하는 일을 가상으로 추적할 수 없습니다. 그것은 우리의 IP 주소를 숨겨서 제3자가 우리의 활동을 추적할 수 없습니다.

    IP를 숨기는 것은 VPN을 통해 방문하는 웹사이트가 VPN 서버를 트래픽의 출처로 보는 것을 의미합니다.

    따라서 VPN은 사용자의 IP 주소를 숨기고 VPN 서버의 IP를 볼 수 있습니다. 가장 중요한 것은 이 프로세스가 사용자의 위치 및 트래픽 악용을 방지한다는 것입니다. 따라서 사용자의 개인 정보가 보호됩니다.

  2. 데이터 암호화

    VPN은 온라인 데이터도 암호화합니다. VPN은 우리가 인터넷을 통해 보내는 데이터를 암호화하여 해커 및 기타 제3자가 데이터를 검색할 수 없도록 합니다.

    검색하더라도 콘텐츠를 이해하거나 데이터를 해독할 수 없습니다.

    이제 VPN이 무엇인지 잘 이해했으므로 연결해 보겠습니다. 이 기사에서는 Python을 사용하여 VPN을 연결하는 방법에 대해 설명합니다.

Python을 사용하여 VPN 연결

이 튜토리얼은 VPNGateOpenVPN 소프트웨어의 무료 VPN 서비스를 사용합니다. VPNGate는 무료로 사용할 수 있는 공용 VPN 클라우드 서비스입니다.

OpenVPN을 사용하려면 시스템에 설치해야 합니다. Windows OS의 경우 수동으로 다운로드하여 설치할 수 있습니다.

Linux 또는 Ubuntu 사용자의 경우 아래 명령을 사용하십시오.

OpenVPN 설치:

$ apt-get install openvpn easy-rsa

설치 후 Python 스크립트를 작성하여 VPN에 연결할 수 있습니다. 터미널에서 이 스크립트를 실행할 때 국가를 인수로 제공해야 합니다.

구문은 다음과 같습니다.

Python3 <filename.py> <countryname>

국가 이름을 지정할 때 두 가지 옵션이 있습니다.

  1. 나라의 긴 이름

    $ python3 vpn.py Japan
    
  2. 국가의 짧은 이름

    $ python3 vpn.py JP
    

첫 번째 단계로 다음 라이브러리를 스크립트로 가져와야 합니다.

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]

여기 첫 번째 줄에서 총 인수가 2가 아닌지 확인합니다. 일치하면 해당 국가로 계속 진행합니다. 그렇지 않으면 주의를 기울이고 종료합니다.

다음으로 사용자가 국가의 긴 이름 또는 짧은 이름을 제공했는지 확인할 수 있습니다. 사용자가 한 글자를 입력하면 오류 메시지가 표시될 수 있습니다.

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

이제 VPNGate 웹사이트에서 사용 가능한 무료 VPN 서버 목록을 검색할 수 있습니다. 목록과 함께 HostName, IP, Score, Ping 등과 같은 VPN 서버의 레이블과 해당 값을 얻을 수 있습니다.

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)

이제 OpenVPN 도구를 지원하는 서버 수를 표시해야 합니다. 이 도구를 사용하여 VPN에 연결하기 때문에 지원하는 VPN 서버가 있어야 하며 그런 다음 이를 필터링할 수 있습니다.

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

지원되는 서버를 필터링했으므로 핑이 가장 낮고 속도와 점수가 가장 높은 최상의 서버를 선택해야 합니다.

그런 다음 for 루프를 사용하여 속성(레이블)을 표시할 수 있습니다. 마지막으로 국가를 표시할 수 있습니다.

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

출력:

최상의 서버

VPN을 시작하기 전에 DNS 설정으로 resolveconf를 업데이트해야 합니다. 또한 문자열 형식이어야 합니다.

기본적으로 바이너리 형식으로 제공됩니다. base64 decode를 사용하여 문자열로 변환할 수 있습니다.

그런 다음 VPN을 시작할 수 있습니다.

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

실행하면 다음과 같은 결과를 얻을 수 있습니다.

vpn 시작

Initialization Sequence Competed와 같은 메시지가 표시되면 성공적으로 연결된 것입니다.

초기화 시퀀스 완료

이제 VPN에 성공적으로 연결되었습니다. 아래에서 성공적인 연결 후 볼 수 있는 VPNGate 서버 정보를 볼 수 있습니다.

또한 OpenVPN을 VPN 서버에 연결하는 데 필요한 시간을 설정할 수 있습니다. 아래 코드 청크를 통해 이를 달성할 수 있습니다.

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

VPN 연결을 종료하려면 Ctrl+C를 사용하세요. 그런 다음 연결이 종료되고 시스템은 사용자에게 알리는 메시지를 표시합니다.

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

출력:

vpn 종료

전체 코드:

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

출력(종료하지 않음):

종료하지 않고

결론

이 기사 전체에서 VPN의 정의와 이점에 대해 논의했습니다. 그런 다음 Python을 사용하여 무료 VPN 서비스를 연결합니다.

목표에 도달하는 다른 방법이 있지만 이 방법을 통해 VPN에 연결하는 기본 개념을 쉽게 이해할 수 있습니다.

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.