转载声明:本文转载自「爪哇笔记」。
混合云
在“互联网+”国家战略的驱动下,越来越多的业务应用需要通过互联网来提供服务,公有云因此受到越来越多的用户亲睐,然而对于传统IT的核心数据与业务,受安全性、兼容性等多方面因素的影响,无法采用公有云来承载,此因混合云成为企业云架构的不二之选。
混合云对于已有自建IDC的企业实现云化有很大的好处:按需定制,满足业务的个性化需求;多级容灾,能够规避单一的采购商风险;兼得私有环境安全独立的优势和公有云弹性伸缩、快速编排定制的优势;最后,对已有的IT重资产最大化的保护和利用,极大降低成本。
混合云私网通信包括两类产品:专线(高速通道)和V**,两者没有绝对的优劣,只是所针对的客户定义不同。
专线就是自建高速公路,具有网络带宽高、时延低的优点,但是建设周期长,成本更高;V**就是在公有网络上承包一条线路作为专用,价格更为经济便宜,而且即开即用,但是时延相对专线来说更高。
帮助不同网络环境间实现高速、稳定、安全的私网通信,包括云上跨地域/跨用户的VPC内网互通、云下IDC专线接入云上等场景,提高网络拓扑灵活性和跨网通信质量。
V**网关是一款基于Internet,通过加密通道将企业数据中心、企业办公网络、或internet终端和阿里云专有网络(VPC)安全可靠连接起来的服务。阿里云V**网关在国家相关政策法规下提供服务,不提供访问Internet功能。
基于阿里云VPC和相关产品,用户可自主规划并搭建满足各种业务场景下的网络架构。
云上VPC和私有IDC是如何实现IPSEC-V**对接的。如上图所示,右边边为云上VPC,且VPC上有多台ECS,左边是私有IDC,IDC里包含传统的服务器,两端都是私网口。
Docker 上的 IPsec V** 服务器,使用这个 Docker 镜像快速搭建 IPsec V** 服务器。支持 IPsec/L2TP 和 Cisco IPsec 协议。本镜像以 Debian 9 (Stretch) 为基础,并使用 Libreswan (IPsec V** 软件) 和 xl2tpd (L2TP 服务进程)。
首先,在你的 Linux 服务器上 安装并运行 Docker。
yum updateyum install docker -y
预构建的可信任镜像可在 Docker Hub registry 下载:
docker pull hwdsl2/ipsec-V**-server
这个 Docker 镜像使用以下三个变量,可以在一个 env 文件中定义。执行以下命令,vim V**.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: \ " 'V**_IPSEC_PSK=your_ipsec_pre_shared_keyV**_USER=your_V**_usernameV**_PASSWORD=your_V**_password
这将创建一个用于 V** 登录的用户账户,它可以在你的多个设备上使用 。 IPsec PSK (预共享密钥) 由 V**IPSECPSK 环境变量指定。 V** 用户名和密码分别在 V**USER 和 V**PASSWORD 中定义。
注: 在你的 env 文件中,不要为变量值添加 "" 或者 '',或在 = 两边添加空格。不要在值中使用这些字符: \ " '。
重要: 首先在 Docker 主机上加载 IPsec NETKEY 内核模块:
sudo modprobe af_key
使用本镜像创建一个新的 Docker 容器 (将 ./V**.env 替换为你自己的 env 文件):
docker run \ --name ipsec-V**-server \ --env-file ./V**.env \ --restart=always \ -p 500:500/udp \ -p 4500:4500/udp \ -v /lib/modules:/lib/modules:ro \ -d --privileged \ hwdsl2/ipsec-V**-server
如果你在上述 docker run 命令中没有指定 env 文件,V**USER 会默认为 V**user,并且 V**IPSECPSK 和 V**PASSWORD 会被自动随机生成。要获取这些登录信息,可以查看容器的日志:
docker logs ipsec-V**-server
如需查看你的 IPsec V** 服务器状态,可以在容器中运行 ipsec status 命令:
docker exec -it ipsec-V**-server ipsec status
或者查看当前已建立的 V** 连接:
docker exec -it ipsec-V**-server ipsec whack --trafficstatus
首先,在你的 Linux 服务器* 上全新安装一个 Ubuntu LTS, Debian 或者 CentOS 系统。
使用以下命令快速搭建 IPsec V** 服务器:
wget https://git.io/V**setup -O V**setup.sh && sudo sh V**setup.sh
如果使用 CentOS,请将上面的地址换成 https://git.io/V**setup-centos。 你的 V** 登录凭证将会被自动随机生成,并在安装完成后显示在屏幕上。
你也可以将你自己的 V** 登录凭证定义为环境变量:
# 所有变量值必须用 '单引号' 括起来# *不要* 在值中使用这些字符: \ " 'wget https://git.io/V**setup -O V**setup.sh && sudo \V**_IPSEC_PSK='你的IPsec预共享密钥' \V**_USER='你的V**用户名' \V**_PASSWORD='你的V**密码' sh V**setup.sh
首先安装以下软件包:
yum -y install epel-releaseyum -y install strongswan xl2tpd
编辑/etc/strongswan/ipsec.conf文件
# ipsec.conf - strongSwan IPsec configuration file# basic configurationconfig setup # strictcrlpolicy=yes # uniqueids = no# Add connections here.# Sample V** connectionsconn %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 myV** keyexchange=ikev1 left=%defaultroute auto=add authby=secret type=transport leftprotoport=17/1701 rightprotoport=17/1701 right=V**服务器IP
编辑/etc/strongswan/ipsec.secrets文件
: PSK "你的PSK"
编辑/etc/xl2tpd/xl2tpd.conf文件
[lac myV**]lns = V**服务的IPppp debug = yespppoptfile = /etc/ppp/options.xl2tpd.clientlength bit = yes
编辑/etc/ppp/options.xl2tpd.client文件
ipcp-accept-localipcp-accept-remoterefuse-eaprequire-chapnoccpnoauthmtu 1280mru 1280noipdefaultdefaultrouteusepeerdnsconnect-delay 5000name 你的帐户password 你的密码
chmod 600 /etc/ppp/options.l2tpd.client
至此 V** 客户端配置已完成。按照下面的步骤进行连接。
mkdir -p /var/run/xl2tpdtouch /var/run/xl2tpd/l2tp-control
#!/bin/bashSUDO=''if [ "$USER" != "root" ]then SUDO='sudo'fi$SUDO systemctl restart strongswan.service$SUDO systemctl restart xl2tpd.servicesleep 1$SUDO strongswan up myV**$SUDO tee /var/run/xl2tpd/l2tp-control > /dev/null <<< "c myV**"while ! $(ip route | grep -i ppp0 &>/dev/null)do sleep 1doneip link | grep -i ppp0# 检查你现有的默认路由 ip route 在输出中查找以下行: default via X.X.X.X ...。记下这个网关IP # 并且在下面的两个命令中使用。$SUDO route add 你的V**服务器IP gw x.x.x.x# 如果你的 V** 客户端是一个远程服务器,则必须从新的默认路由中排除你的本地电脑的公有 IP,以避免 # SSH 会话被断开 (替换为实际值):$SUDO route add 你的本地电脑的公有IP gw x.x.x.x$SUDO route add default dev ppp0ip route | grep -i ppp0ip address | grep -i ppp0# 检查 V** 是否正常工作,以上命令应该返回 你的 V** 服务器 IP。wget -qO- http://ipv4.icanhazip.com; echo
#!/bin/bashSUDO=''if [ "$USER" != "root" ]then SUDO='sudo'fi$SUDO route del default dev ppp0# 删除掉V**服务器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 myV**ip link | grep -i ppp0ip route | grep -i ppp0$SUDO systemctl stop strongswan.service$SUDO systemctl stop xl2tpd.service
启动脚本命令,测试一下V**服务器内网地址是否连通:
[root@iz2ze7tgu9zb2gr6av1tysz V**]# ping 172.17.120.102PING 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 ms64 bytes from 172.17.120.102: icmp_seq=2 ttl=63 time=2.01 ms64 bytes from 172.17.120.102: icmp_seq=3 ttl=63 time=1.92 ms64 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 3003msrtt min/avg/max/mdev = 1.926/1.961/2.010/0.062 ms
启动脚本命令,以上命令可以ping通,说明安装配置成功。
内网IP有3种:
IPSEC/L2TP方式的V**基础
IPSec V**是目前V**技术中点击率非常高的一种技术,同时提供V**和信息加密两项技术。
IPSec V**的应用场景分为3种:
为何AH使用较少呢?因为AH无法提供数据加密,所有数据在传输时以明文传输,而ESP提供数据加密;其次AH因为提供数据来源确认(源IP地址一旦改变,AH校验失败),所以无法穿越NAT。当然,IPSec在极端的情况下可以同时使用AH和ESP实现最完整的安全特性,但是此种方案极其少见。
IPSec封装模式介绍完IPSec V**的场景和IPSec协议组成,再来看一下IPSec提供的两种封装模式(传输Transport模式和隧道Tunnel模式)
上图是传输模式的封装结构,再来对比一下隧道模式:
可以发现传输模式和隧道模式的区别:
从上图我们还可以验证上一节所介绍AH和ESP的差别。下图是对传输模式、隧道模式适用于何种场景的说明。
从这张图的对比可以看出:
隧道模式虽然可以适用于任何场景,但是隧道模式需要多一层IP头(通常为20字节长度)开销,所以在PC到PC的场景,建议还是使用传输模式。
为了使大家有个更直观的了解,我们看看下图,分析一下为何在Site-to-Site场景中只能使用隧道模式:
如上图所示,如果发起方内网PC发往响应方内网PC的流量满足网关的兴趣流匹配条件,发起方使用传输模式进行封装:
IPSec协商
IPSec除了一些协议原理外,我们更关注的是协议中涉及到方案制定的内容:
我们以最常见的IPSec隧道模式为例,解释一下IPSec的协商过程:
上图描述了由兴趣流触发的IPSec协商流程,原生IPSec并无身份确认等协商过程,在方案上存在诸多缺陷,如无法支持发起方地址动态变化情况下的身份确认、密钥动态更新等。伴随IPSec出现的IKE(Internet Key Exchange)协议专门用来弥补这些不足:
IPSec中安全性还体现在第二阶段SA永远是单向的:
从上图可以发现,在协商第二阶段SA时,SA是分方向性的,发起方到响应方所用SA和响应放到发起方SA是单独协商的,这样做的好处在于即使某个方向的SA被破解并不会波及到另一个方向的SA。这种设计类似于双向车道设计。 IPSec虽然只是5个字母的排列组合,但其所涉及的协议功能众多、方案又极其灵活。