想要实现的目标:
1.通过公司内网的网段可以直接访问阿里云上的服务器主机,VPN 可以将一个机构的多个数据中心通过隧道的方式连接起来,让机构感觉像是在一个数据中心里面。
2.在公司之外,无论在祖国各地,五湖四海,只要是能联网的地方,就能访问到公司内网。
具体的实现
1.打通公司内网到阿里云的VPN通道
首先要说的就是通过公司内网访问阿里云上的服务器。
这样说比较抽象,举个例子,如果我阿里云上的某台服务器的ip是188.100.100.1
,那我要实现的效果是:
1
ping 188.100.100.1
能够ping通,当然首先要保证的是我这台服务器的ip和公司内网的网段不冲突,也就是说阿里云的vpc(Virtual Private Cloud可以理解为分配给服务器的私有网段)和公司内网正常办公的网段不冲突。
在这里要注意的一点,是先设置路由器,然后在去阿里云上做设置。
在阿里云中做这些设置:
vpn网关:
这里的vpn网关,一般指的是公司服务器集群总的网关,是一个固定IP作为网络的输入口,这里我们是不用新建设置的。注意这里的ip,是我们要用到的。
用户网关:
用户网关这里的ip就是我们公司的外网ip,获得外网ip的方法有很多种,比如访问http://www.ip138.com/
,这里需要我们新建创建用户网关
来填入我们的ip。
IPsec连接:
这一步就是集大成的关键性一步了。
这里的VPN网关和用户网关都选择我们上一步设置好的选择就好。这里的本端网段
填写的是阿里云的VPC网段。而对端网段
填写的是我们公司内网分配给设备上网的网段。
还有就是约定好喝公司的网关路由器上的共享秘钥。和加密算法之类的,保证云上和本地配置的一致。
重要的一点
:如果你保证你配置的没问题,但还是提示‘第二阶段协商未成功’这样的错误。很可能是因为比较玄学,要先去路由器做好配置,然后在阿里云上做好配置,要保证一个顺序的先后性。
2.打通外部到公司内部的VPN通道
也就是下图中的移动办公的这种场景:
要达到的效果说的实例化一点就是
1
ping 188.100.100.1
能够ping通,值得注意的一点是这里的188.100.100.1
是阿里云上服务器的内网ip,也就是说,并不只是从公司外访问公司内的某台设备那样简单,而是要穿过两层vpn隧道。
这里要在网关上分配一个网段,来给进来的设备。相当于从外部访问的设备进来后,就相当于一个内网的设备。
采用的是PPTP协议连接。在路由器上做些配置就OK了。
Windows电脑自带PPTP,Mac电脑可以用Shimo软件连接。填写公司的ip地址,和分配给你的username和password就好了。
这样后,可以ping通内网设备,但是并不能ping的通188.100.100.1
。这个问题很奇葩。查了很多资料,终于找到了这个办法试了试。
但这里值得注意的一点是:在一些路由器上,如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示例代码:
Powered by 雷神HTTP © | 粤ICP备20015550号 广州星易装饰工程有限公司版权所有 用户登录
自动登录 忘记密码?
还没帐号?立即注册 用户注册 已有账号?立即登录 忘记密码 返回登录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
在线咨询
客服电话
微信