
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/#知識補充
參考文檔
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
