使用Python连接VPN

在世界上,安全和隐私已成为人们的主要关切。为了寻找解决方案,开发商制造了VPN。

什么是VPN

虚拟专用网络,也被称为VPN,是一种软件,它创建一个私人网络,以保护我们的在线隐私。VPN给我们带来许多好处,但保护隐私和数据加密是用户的主要优势。

  1. 受保护的隐私

    由于VPN在公共网络中创建了一个私人网络,我们在互联网上所做的事情实际上无法被追踪。它隐藏了我们的IP地址,所以第三方无法跟踪我们的活动。

    隐藏IP意味着我们通过VPN访问的网站将VPN服务器视为流量的来源。

    所以,VPN会掩盖用户的IP地址,而VPN服务器的IP则是可见的。最重要的是,这一过程可以防止利用用户的位置和流量;因此,用户的隐私得到保护。

  2. 数据加密

    VPN还对我们的在线数据进行加密。VPN对我们在整个互联网上发送的数据进行加密,使黑客和其他第三方无法检索到它们。

    即使他们检索到了,也无法了解内容或解密数据。

    既然我们现在对什么是VPN有了很好的了解,那么我们就尝试连接它吧。在这篇文章中,我们讨论如何用Python连接VPN。

使用Python连接VPN

本教程将使用来自VPNGateOpenVPN 软件的免费VPN服务。VPNGate 是一个公共VPN云服务,我们可以免费使用。

要使用OpenVPN ,我们需要在我们的系统上安装它。对于Windows操作系统,你可以手动下载并安装它。

对于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, os, sys, tempfile, subprocess, base64, time, 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)

因此,现在我们可以从VPNGate 网站检索可用的免费VPN服务器列表。随着列表的出现,我们可以得到VPN服务器的标签,如HostName,IP,Score,Ping, 等等,以及它们的值。

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

由于我们已经过滤了支持的服务器,我们需要在其中选择一个最好的服务器,其ping值最低,速度和分数最高。

然后我们可以使用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])

输出:

使用Python连接VPN

在启动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 2nup /etc/openvpn/update-resolv-confndown /etc/openvpn/update-resolv-conf')
file.close()
vpnR = subprocess.Popen(['sudo', 'openvpn', '--config', path])

在我们启动它之后,我们可以得到以下输出。

使用Python连接VPN

如果你得到一个类似Initialization Sequence Competed 的信息,我们就连接成功了。

使用Python连接VPN

现在我们已经成功连接到了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')

输出:

使用Python连接VPN

完整的代码:

import requests, os, sys, tempfile, subprocess, base64, time, 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 2nup /etc/openvpn/update-resolv-confndown /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')

输出(没有终止):

使用Python连接VPN

总结

在这篇文章中,我们讨论了什么是VPN以及它的好处。然后我们用Python连接了一个免费的VPN服务。

还有其他方法可以达到我们的目标,但我们可以通过这种方法轻松地理解连接到VPN的基本概念。