当前位置:首页>帮助中心>雷神HTTP—如何解决动态IP导致的VPN失效

雷神HTTP—如何解决动态IP导致的VPN失效

发布日期:2020-06-20 11:11:31 来源:雷神HTTP

想要实现的目标:

1.通过公司内网的网段可以直接访问阿里云上的服务器主机,VPN 可以将一个机构的多个数据中心通过隧道的方式连接起来,让机构感觉像是在一个数据中心里面。
2.在公司之外,无论在祖国各地,五湖四海,只要是能联网的地方,就能访问到公司内网。

具体的实现

1.打通公司内网到阿里云的VPN通道

首先要说的就是通过公司内网访问阿里云上的服务器。
IPsec连接

这样说比较抽象,举个例子,如果我阿里云上的某台服务器的ip是188.100.100.1,那我要实现的效果是:

1
ping 188.100.100.1

能够ping通,当然首先要保证的是我这台服务器的ip和公司内网的网段不冲突,也就是说阿里云的vpc(Virtual Private Cloud可以理解为分配给服务器的私有网段)和公司内网正常办公的网段不冲突。

在这里要注意的一点,是先设置路由器,然后在去阿里云上做设置。

在阿里云中做这些设置:

阿里云vpc中的vpn设置

vpn网关:
这里的vpn网关,一般指的是公司服务器集群总的网关,是一个固定IP作为网络的输入口,这里我们是不用新建设置的。注意这里的ip,是我们要用到的。

vpn网关

用户网关:
用户网关这里的ip就是我们公司的外网ip,获得外网ip的方法有很多种,比如访问http://www.ip138.com/,这里需要我们新建创建用户网关来填入我们的ip。

用户网关

IPsec连接:
这一步就是集大成的关键性一步了。
IPsec连接
这里的VPN网关和用户网关都选择我们上一步设置好的选择就好。这里的本端网段填写的是阿里云的VPC网段。而对端网段填写的是我们公司内网分配给设备上网的网段。
新建A
还有就是约定好喝公司的网关路由器上的共享秘钥。和加密算法之类的,保证云上和本地配置的一致。
新建B

重要的一点:如果你保证你配置的没问题,但还是提示‘第二阶段协商未成功’这样的错误。很可能是因为比较玄学,要先去路由器做好配置,然后在阿里云上做好配置,要保证一个顺序的先后性。

2.打通外部到公司内部的VPN通道

也就是下图中的移动办公的这种场景:
移动办公VPN

要达到的效果说的实例化一点就是

1
ping 188.100.100.1

能够ping通,值得注意的一点是这里的188.100.100.1是阿里云上服务器的内网ip,也就是说,并不只是从公司外访问公司内的某台设备那样简单,而是要穿过两层vpn隧道。

这里要在网关上分配一个网段,来给进来的设备。相当于从外部访问的设备进来后,就相当于一个内网的设备。

采用的是PPTP协议连接。在路由器上做些配置就OK了。
在路由器的networks中设置

Windows电脑自带PPTP,Mac电脑可以用Shimo软件连接。填写公司的ip地址,和分配给你的username和password就好了。

这样后,可以ping通内网设备,但是并不能ping的通188.100.100.1。这个问题很奇葩。查了很多资料,终于找到了这个办法试了试。
v2ex上的v友的回答

但这里值得注意的一点是:在一些路由器上,如unifi路由器,在输入框中是不允许填写和内网网段重复的网段的。所以,我的做法是到路由器中,改写etc/pptpd.conf这个文件,设置remoteip,把它的网段改为和内网相同的网段。这里还有一点是值得注意的是,分配的ip不要和已有的分配给内网的设备的ip重复。所以我的做法是选择了ip网段的后面几位。localip是pptp的服务器的地址。如果用traceroute命令查看,访问非局域网,会有显示这个地址。
更改后,保存,并使其生效。重启生效的命令为:

1
sudo service pptpd restart

3.精华:解决动态IP导致的问题

如今,无论是对于家庭网络还是公司网络(家庭网络与公司网络一个重要的区别是:公司网络是上传和下载的速度相同),网络运营商默认提供的网络,都不是固定IP,而是动态IP。如果我们去找网络运营商去要求固定IP,运营商会很客服的告诉你,当然可以提供这项套餐的,然后转而告诉你,这个得加钱。而固定套餐的价格相比于动态IP的套餐的价格要高出数倍。

因为遇到了动态IP,使得我原有的设置,复杂了至少两倍。我所遇到的困难:

  • IP地址经常更换,每次重启路由器后,都会导致IP变化。这使得如果IP每次变化后,我都需要到阿里云上重新新建用户网关和IPsec连接,同时配置本地网络。还有pptpd.conf文件也会重新恢复原样。

  • Unifi网关的路由器系统的Linux版本,对linux包源进行了限制,比如wget都不能下载安装,所幸提供了Python,但是也仅仅支持Python2,Python的第三方包也不能下载,比如常用的requests包。

我们把这些问题拆分化,一一解决:

通过阿里云API接口来创建IPsec连接

对于创建用户网关和IPsec连接,阿里云是提供一个公共的API接口用户创建和删除的,可以参考这个链接阿里云VPN接口文档

当然并不只是看文档这么简单,文档里并没有提供Python的示例代码。搜索后发现一些都是Java代码,零星的几个Python代码还跑不起来。所有这里直接黏贴上我组合后的Python2代码,Python3只要稍稍改动部分,就可以跑的起来,这个我稍后会写。
Python2调用阿里云API示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# -*- coding: utf-8 -*-
import base64
import urllib
import hmac
from hashlib import sha1
import requests
import uuid
import time
import hmac,ssl
ALIYUN_ACCESS_KEY_ID=""#在阿里云上生成
ALIYUN_ACCESS_KEY_SECRET=""#在阿里云上生成

try:
   _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
   # Legacy Python that doesn't verify HTTPS certificates by default
   pass
else:
   # Handle target environment that doesn't support HTTPS verification
   ssl._create_default_https_context = _create_unverified_https_context

D = {
   'Format':'JSON',
   'Version':'2016-04-28',
   'SignatureMethod':'HMAC-SHA1'
   }
timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
D['SignatureNonce']=str(uuid.uuid1())
D['SignatureVersion']=1.0
D['AccessKeyId']=ALIYUN_ACCESS_KEY_ID
D['Timestamp']=timestamp


def percent_encode(encodeStr):
   encodeStr = str(encodeStr)
   #res = urllib.parse.quote(encodeStr)
   res = urllib.quote_plus(encodeStr)
   res = res.replace('+', '%20')
   res = res.replace('*', '%2A')
   res = res.replace('%7E', '~')
   res = res.replace('/', '%2F')  #That is for the LocalSubnet "/"
   return res
友情链接: 雷神HTTP 雷神IP

QQ:2703310661

电话/微信:16676871230

Powered by 雷神HTTP © | 粤ICP备20015550号 广州星易装饰工程有限公司版权所有

用户注册

图形验证码

短信获取

我已阅读并同意 《用户协议》

忘记密码

图形验证码

短信获取