上云之路之企业级云上网络解决方案
2017年,越来越多的企业处于内部部署解决方案和云环境拆分的混合IT世界中。为了适应产品的服务模式和公司未来的业务运营模式,结合公司2018年业务发展计划。计划将部分系统迁移部署在云平台,从而产生对混合云策略的需求,为企业产品提供更大的灵活性以及更多部署工作负载的选项。
混合云
在“互联网+”国家战略的驱动下,越来越多的业务应用需要通过互联网来提供服务,公有云因此受到越来越多的用户亲睐,然而对于传统IT的核心数据与业务,受安全性、兼容性等多方面因素的影响,无法采用公有云来承载,此因混合云成为企业云架构的不二之选。
混合云对于已有自建IDC的企业实现云化有很大的好处:按需定制,满足业务的个性化需求;多级容灾,能够规避单一的采购商风险;兼得私有环境安全独立的优势和公有云弹性伸缩、快速编排定制的优势;最后,对已有的IT重资产最大化的保护和利用,极大降低成本。
解决方案
产品对比
混合云私网通信包括两类产品:专线(高速通道)和VPN,两者没有绝对的优劣,只是所针对的客户定义不同。
专线就是自建高速公路,具有网络带宽高、时延低的优点,但是建设周期长,成本更高;VPN就是在公有网络上承包一条线路作为专用,价格更为经济便宜,而且即开即用,但是时延相对专线来说更高。
高速通道 (物理专线)
帮助不同网络环境间实现高速、稳定、安全的私网通信,包括云上跨地域/跨用户的VPC内网互通、云下IDC专线接入云上等场景,提高网络拓扑灵活性和跨网通信质量。
网络整体架构
通用方案 (云购VPN)
VPN网关是一款基于Internet,通过加密通道将企业数据中心、企业办公网络、或internet终端和阿里云专有网络(VPC)安全可靠连接起来的服务。阿里云VPN网关在国家相关政策法规下提供服务,不提供访问Internet功能。
云上网络架构
基于阿里云VPC和相关产品,用户可自主规划并搭建满足各种业务场景下的网络架构。
本架构能够解决
- 云上网络安全隔离
- 应对海量访问流量
- 云上云下数据互通
- 多业务共享带宽
网络整体架构
通用方案(自建VPN)
云上VPC和私有IDC是如何实现IPSEC-VPN对接的。如上图所示,右边边为云上VPC,且VPC上有多台ECS,左边是私有IDC,IDC里包含传统的服务器,两端都是私网口。
IPsec VPN 服务器
Docker 上的 IPsec VPN 服务器,使用这个 Docker 镜像快速搭建 IPsec VPN 服务器。支持 IPsec/L2TP 和 Cisco IPsec 协议。本镜像以 Debian 9 (Stretch) 为基础,并使用 Libreswan (IPsec VPN 软件) 和 xl2tpd (L2TP 服务进程)。
安装 Docker
首先,在你的 Linux 服务器上 安装并运行 Docker。
yum update yum install docker -y
下载镜像
预构建的可信任镜像可在 Docker Hub registry 下载:
docker pull hwdsl2/ipsec-vpn-server
如何使用镜像
环境变量
这个 Docker 镜像使用以下三个变量,可以在一个 env 文件中定义。执行以下命令,vim vpn.env:
Define your own values for these variables # - DO NOT put "" or '' around values, or add space around = # - DO NOT use these special characters within values: \ " ' VPN_IPSEC_PSK=your_ipsec_pre_shared_key VPN_USER=your_vpn_username VPN_PASSWORD=your_vpn_password
这将创建一个用于 VPN 登录的用户账户,它可以在你的多个设备上使用 。 IPsec PSK (预共享密钥) 由 VPN_IPSEC_PSK 环境变量指定。 VPN 用户名和密码分别在 VPN_USER 和 VPN_PASSWORD 中定义。
注: 在你的 env 文件中,不要为变量值添加 "" 或者 '',或在 = 两边添加空格。不要在值中使用这些字符: " '。
运行 IPsec VPN 服务器
重要: 首先在 Docker 主机上加载 IPsec NETKEY 内核模块:
sudo modprobe af_key
使用本镜像创建一个新的 Docker 容器 (将 ./vpn.env 替换为你自己的 env 文件):
docker run \ --name ipsec-vpn-server \ --env-file ./vpn.env \ --restart=always \ -p 500:500/udp \ -p 4500:4500/udp \ -v /lib/modules:/lib/modules:ro \ -d --privileged \ hwdsl2/ipsec-vpn-server
获取 VPN 登录信息
如果你在上述 docker run 命令中没有指定 env 文件,VPN_USER 会默认为 vpnuser,并且 VPN_IPSEC_PSK 和 VPN_PASSWORD 会被自动随机生成。要获取这些登录信息,可以查看容器的日志:
docker logs ipsec-vpn-server
查看服务器状态
如需查看你的 IPsec VPN 服务器状态,可以在容器中运行 ipsec status 命令:
docker exec -it ipsec-vpn-server ipsec status
或者查看当前已建立的 VPN 连接:
docker exec -it ipsec-vpn-server ipsec whack --trafficstatus
脚本一键安装
首先,在你的 Linux 服务器* 上全新安装一个 Ubuntu LTS, Debian 或者 CentOS 系统。
使用以下命令快速搭建 IPsec VPN 服务器:
wget https://git.io/vpnsetup -O vpnsetup.sh && sudo sh vpnsetup.sh
如果使用 CentOS,请将上面的地址换成 https://git.io/vpnsetup-centos。 你的 VPN 登录凭证将会被自动随机生成,并在安装完成后显示在屏幕上。
你也可以将你自己的 VPN 登录凭证定义为环境变量:
# 所有变量值必须用 '单引号' 括起来 # *不要* 在值中使用这些字符: \ " ' wget https://git.io/vpnsetup -O vpnsetup.sh && sudo \ VPN_IPSEC_PSK='你的IPsec预共享密钥' \ VPN_USER='你的VPN用户名' \ VPN_PASSWORD='你的VPN密码' sh vpnsetup.sh
IPsec/L2TP VPN 客户端
Linux(CentOS )
首先安装以下软件包:
yum -y install epel-release yum -y install strongswan xl2tpd
配置 strongSwan
编辑/etc/strongswan/ipsec.conf文件
# ipsec.conf - strongSwan IPsec configuration file # basic configuration config setup # strictcrlpolicy=yes # uniqueids = no # Add connections here. # Sample VPN connections conn %default ikelifetime=60m keylife=20m rekeymargin=3m keyingtries=1 keyexchange=ikev1 authby=secret ike=aes128-sha1-modp1024,3des-sha1-modp1024! esp=aes128-sha1-modp1024,3des-sha1-modp1024! conn myvpn keyexchange=ikev1 left=%defaultroute auto=add authby=secret type=transport leftprotoport=17/1701 rightprotoport=17/1701 right=VPN服务器IP
编辑/etc/strongswan/ipsec.secrets文件
: PSK "你的PSK"
配置 xl2tpd
编辑/etc/xl2tpd/xl2tpd.conf文件
[lac myvpn] lns = VPN服务的IP ppp debug = yes pppoptfile = /etc/ppp/options.xl2tpd.client length bit = yes
编辑/etc/ppp/options.xl2tpd.client文件
ipcp-accept-local ipcp-accept-remote refuse-eap require-chap noccp noauth mtu 1280 mru 1280 noipdefault defaultroute usepeerdns connect-delay 5000 name 你的帐户 password 你的密码
chmod 600 /etc/ppp/options.l2tpd.client
至此 VPN 客户端配置已完成。按照下面的步骤进行连接。
创建xl2tpd控制文件
mkdir -p /var/run/xl2tpd touch /var/run/xl2tpd/l2tp-control
启动脚本vpnc.sh
#!/bin/bash SUDO='' if [ "$USER" != "root" ] then SUDO='sudo' fi $SUDO systemctl restart strongswan.service $SUDO systemctl restart xl2tpd.service sleep 1 $SUDO strongswan up myvpn $SUDO tee /var/run/xl2tpd/l2tp-control > /dev/null <<< "c myvpn" while ! $(ip route | grep -i ppp0 &>/dev/null) do sleep 1 done ip link | grep -i ppp0 # 检查你现有的默认路由 ip route 在输出中查找以下行: default via X.X.X.X ...。记下这个网关IP # 并且在下面的两个命令中使用。 $SUDO route add 你的VPN服务器IP gw x.x.x.x # 如果你的 VPN 客户端是一个远程服务器,则必须从新的默认路由中排除你的本地电脑的公有 IP,以避免 # SSH 会话被断开 (替换为实际值): $SUDO route add 你的本地电脑的公有IP gw x.x.x.x $SUDO route add default dev ppp0 ip route | grep -i ppp0 ip address | grep -i ppp0 # 检查 VPN 是否正常工作,以上命令应该返回 你的 VPN 服务器 IP。 wget -qO- http://ipv4.icanhazip.com; echo
停止脚本 vpnd.sh
#!/bin/bash SUDO='' if [ "$USER" != "root" ] then SUDO='sudo' fi $SUDO route del default dev ppp0 # 删除掉VPN服务器IP 和 本地电脑公网IP $SUDO ip route del x.x.x.x $SUDO ip route del x.x.x.x $SUDO tee /var/run/xl2tpd/l2tp-control > /dev/null <<< "d vultr" $SUDO strongswan down myvpn ip link | grep -i ppp0 ip route | grep -i ppp0 $SUDO systemctl stop strongswan.service $SUDO systemctl stop xl2tpd.service
启动脚本命令,测试一下VPN服务器内网地址是否连通:
[root@iz2ze7tgu9zb2gr6av1tysz vpn]# ping 172.17.120.102 PING 172.17.120.102 (172.17.120.102) 56(84) bytes of data. 64 bytes from 172.17.120.102: icmp_seq=1 ttl=63 time=1.96 ms 64 bytes from 172.17.120.102: icmp_seq=2 ttl=63 time=2.01 ms 64 bytes from 172.17.120.102: icmp_seq=3 ttl=63 time=1.92 ms 64 bytes from 172.17.120.102: icmp_seq=4 ttl=63 time=1.94 ms ^C --- 172.17.120.102 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 1.926/1.961/2.010/0.062 ms
启动脚本命令,以上命令可以ping通,说明安装配置成功。
知识补充
内网定义
内网IP有3种:
- 第一种10.0.0.0~10.255.255.255
- 第二种172.16.0.0~172.31.255.255
- 第三种192.168.0.0~192.168.255.255
相关端口
协议 | 端口 |
---|---|
PPTP | 1723 |
L2TP | UDP:500 (isakmp) UDP:4500 (nat-t) UDP:1701 (l2tp) |
IPSEC/L2TP方式的VPN基础
参考:https://blog.52itstyle.com/archives/2457/#%E7%9F%A5%E8%AF%86%E8%A1%A5%E5%85%85
参考文档
setup-ipsec-vpn:https://github.com/hwdsl2/setup-ipsec-vpn
setup-ipsec-vpn:https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md
ppp:http://en.wikipedia.org/wiki/Point-to-Point_Tunneling_Protocol
l2tp: http://en.wikipedia.org/wiki/Layer_2_Tunneling_Protocol
l2tp: https://baike.baidu.com/item/L2TP/609253?fr=aladdin
pptp:http://en.wikipedia.org/wiki/Point-to-Point_Tunneling_Protocol
ipsec: http://en.wikipedia.org/wiki/IPsec
ipsec: http://bbs.51cto.com/viewthread.php?tid=1119459
ipsec: https://baike.baidu.com/item/ipsec/2472311?fr=aladdin
strongSwan: https://baike.baidu.com/item/strongSwan/2873029?fr=aladdin
An Illustrated Guide to IPsec: http://www.unixwiz.net/techtips/iguide-ipsec.html
gre:http://en.wikipedia.org/wiki/Generic_Routing_Encapsulation
ms-chap-v2破解:https://www.cloudcracker.com/blog/2012/07/29/cracking-ms-chap-v2/
strongswan: https://www.strongswan.org/docs/OSTD_2013.pdf
ISAKMP、IKE、IKEv1、IKEv2、NAT-Tranversal:http://security.hsr.ch/lectures/Information_Security_2/Vorlesungsunterlagen/04.6-IKE_Notes.pdf
推荐阅读
-
探索“云上新空间” 山西插上数字之翼
-
2019 GNTC 阿里云参会分享:云原生SDWAN网络2.0 一站式上云服务 云计算金融c制造
-
关于pm2在云服务器上造成磁盘不足的解决方案
-
【华为云技术分享】#探索鲲鹏#之“在鲲鹏上使用编程语言——C语言
-
网络穿透/动态组网/视频上云网关EasyNTS组网平台如何检测MQTT端口是否被占用?
-
网络穿透/动态组网/视频上云网关EasyNTS组网平台输入账号和密码无法登陆,如何解决
-
RTSP协议网络摄像头安防视频上云网关产品EasyNVR视频服务上传宣传位图片报错
-
安防视频监控系统视频上云解决方案EasyCVR集成海康EHome私有协议系列:设备录像流数据进行PS包分割
-
上云之路之企业级云上网络解决方案
-
阿里云发布边缘计算视频上云解决方案 为海量视图处理提供城市级云基础设施