使用Python连接VPN
在世界上,安全和隐私已成为人们的主要关切。为了寻找解决方案,开发商制造了VPN。
什么是VPN
虚拟专用网络,也被称为VPN,是一种软件,它创建一个私人网络,以保护我们的在线隐私。VPN给我们带来许多好处,但保护隐私和数据加密是用户的主要优势。
-
受保护的隐私
由于VPN在公共网络中创建了一个私人网络,我们在互联网上所做的事情实际上无法被追踪。它隐藏了我们的IP地址,所以第三方无法跟踪我们的活动。
隐藏IP意味着我们通过VPN访问的网站将VPN服务器视为流量的来源。
所以,VPN会掩盖用户的IP地址,而VPN服务器的IP则是可见的。最重要的是,这一过程可以防止利用用户的位置和流量;因此,用户的隐私得到保护。
-
数据加密
VPN还对我们的在线数据进行加密。VPN对我们在整个互联网上发送的数据进行加密,使黑客和其他第三方无法检索到它们。
即使他们检索到了,也无法了解内容或解密数据。
既然我们现在对什么是VPN有了很好的了解,那么我们就尝试连接它吧。在这篇文章中,我们讨论如何用Python连接VPN。
使用Python连接VPN
本教程将使用来自VPNGate
和OpenVPN
软件的免费VPN服务。VPNGate
是一个公共VPN云服务,我们可以免费使用。
要使用OpenVPN
,我们需要在我们的系统上安装它。对于Windows操作系统,你可以手动下载并安装它。
对于Linux或Ubuntu用户,使用下面的命令。
安装OpenVPN
:
$ apt-get install openvpn easy-rsa
安装后,我们可以建立一个Python脚本来连接到VPN。当我们在终端运行这个脚本时,我们必须提供一个国家作为参数。
语法如下。
Python3 <filename.py> <countryname>
在提供国家名称时,有两个选项。
-
国家的长名称
$ python3 vpn.py Japan
-
国家的短名称
$ 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])
输出:
在启动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])
在我们启动它之后,我们可以得到以下输出。
如果你得到一个类似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')
输出:
完整的代码:
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