一、前言
在使用云上IPSEC VPN打通到云下IDC的场景,因为本地网络规划问题或其它原因,IDC和云上现有的网段存在冲突,不能互通,因此中间需要借助私有NAT来完成地址转换。
比如下面这个架构图:
明面上看,192.168.1.0/24和10.100.1.0/24没有冲突,但由于云下IDC网络,比如已经和10.100.1.0/24有其它通信隧道的路由了,不能再和云上进行互通,需要云上转换一下IP段。因此,这里说的网段冲突,是站在云下的角度,不能再和云上的当前网段进行打通,需要进行中间地址转换才能打通。
本文将使用云联网类型VPN、CCN多路由表、私网NAT来解决网段冲突的问题,优化后架构如下:
二、VPN隧道的建立与协商
2.1 创建VPN网关
在VPN网关控制台,创建CCN类型的VPN网关:
2.2 创建VPN通道
2.2.1 基本配置
需要注意:
- VPN网关要选择我们刚刚创建的云联网类型的VPN网关;
- 对端网关写云下IPsec VPN设备的公网出口IP;
- 设置并记住预共享密钥,待会需和云下保持一致;
- SPD网段,本端写和云下没有冲突的网段,即待会我们需要SNAT后的网段地址,对端写云下对接的内网网段。
2.2.2 高级配置(加密算法、认证等)
DPD检测和健康检查探测,没有需求场景的话,这里保持关闭,其他参数设置可参照这张图:
最后点击创建。
2.3 云下RouterOS配置IPsec VPN(CLI)
云下协商参数需和云上协商参数保持一致。篇幅原因这里只演示命令行方式如何创建IPsec VPN和云上建立协商,更为详细的介绍可参考笔者的这篇文章,里面包含了GUI和CLI两种方式建立云上和ros的通信。
2.3.1 配置IPsec Profile
[RokasYang@MikroTik] > /ip ipsec profile
[RokasYang@MikroTik] /ip/ipsec/profile> add dh-group=modp768 hash-algorithm=sha1 enc-algorithm=aes-128 name=To_tencent
[RokasYang@MikroTik] /ip/ipsec/profile>
DH group用来确定密钥交换过程中使用的密钥强度,强度越高开销也会越高,对应比特位参考如下表格:
DH group | Modulus |
---|---|
1 | 768 bits |
2 | 1024 bits |
5 | 1536 bits |
14 | 2048 bits |
15 | 3072 bits |
16 | 4096 bits |
19 | ecp256 bits |
20 | ecp384 bits |
21 | ecp521 bits |
云上配置的是DH1,因此云下也配置的是modp768,生产环境建议不要使用DH group 1/2/5,加密的比特位较低,可能存在安全风险。
2.3.2 配置对端Peer
[RokasYang@MikroTik] /ip/ipsec/peer> /ip ipsec profile
[RokasYang@MikroTik] /ip/ipsec/profile> /ip ipsec peer
[RokasYang@MikroTik] /ip/ipsec/peer> add address=119.91.229.51 name=to_tencent profile=To_tencent exchange-mode=ike2
[RokasYang@MikroTik] /ip/ipsec/peer> print where name~"_tencent"
-
注意这里的profile的参数,引用的是2.3.1这一步的To_tencent配置文件。
-
address为对端VPN网关的IP;
-
exchange-mode为协商模式,对应云上的ikev2。
2.3.3 配置身份验证(Identities)
预共享密钥设置和云上保持一致,同时peer参数引用是2.3.2这一步骤的to_tencent配置文件。
[RokasYang@MikroTik] /ip/ipsec/peer> ..
[RokasYang@MikroTik] /ip/ipsec> identity add peer=to_tencent auth-method=pre-shared-key secret=123456
[RokasYang@MikroTik] /ip/ipsec>
- auth-method:验证方法指定为预共享密钥;
- secret:预共享密钥指定为123456,和云上保持一致,实际生产环境建议设置更高强度的密钥。
2.3.4 配置IPsec Proposal
[RokasYang@MikroTik] /ip/ipsec> proposal add name=to_tencent auth-algorithms=sha1 enc-algorithms=aes-128-cbc pfs-group=none
[RokasYang@MikroTik] /ip/ipsec> proposal print where name="to_tencent"
Flags: X - disabled; * - default
0 name="to_tencent" auth-algorithms=sha1 enc-algorithms=aes-128-cbc lifetime=30m pfs-group=none
[RokasYang@MikroTik] /ip/ipsec>
- auth-algorithms:认证算法和云上保持一致,设置为sha1;
- enc-algorithms:加密算法和云上保持一致,设置为aes-128-cbc;
- pfs-group:云上是disabled的,因此这里也写为none。
2.3.5 配置感兴趣流(Policies)
[RokasYang@MikroTik] /ip/ipsec> policy add peer=to_tencent tunnel=yes src-address=192.168.1.0/24 dst-address=172.16.1.0/24 protocol=all proposal=to_tencent
[RokasYang@MikroTik] /ip/ipsec>
- address:本端网段;
- dst-addres:对端网段,对端网段是云上做完SNAT后的映射网段。
2.3.6 增加一条到云上的路由
注意,增加路由后,这里把增加的这条路由,从第23条移动到了第一条:
[RokasYang@MikroTik] /ip/firewall/nat> add action=accept chain=srcnat src-address=192.168.1.0/24 dst-address=172.16.1.0/24
[RokasYang@MikroTik] /ip/firewall/nat> print where dst-address="172.16.1.0/24"
Flags: X - disabled, I - invalid; D - dynamic
23 chain=srcnat action=accept src-address=192.168.1.0/24 dst-address=172.16.1.0/24
[RokasYang@MikroTik] /ip/firewall/nat> move 23 0
[RokasYang@MikroTik] /ip/firewall/nat>
此时在UI界面看,也是生效的:
2.4 云下RouterOS配置IPsec VPN(GUI)
2.4.1 配置IPsec Profile
winbox登录到RouterOS后,在IP–>IPsec选项里打开IPsec的配置界面:
首先配置IPsec profile:
最后点击右下角的Apply应用,配置参数和CLI的参数相对应,不再赘述,看上图标注即可。
2.4.2 配置对端Peer
配置对端网关、协商模式、引用的ipsec profile等:
2.4.3 配置身份验证(Identities)
配置用于身份验证的字段,包括本端标识、对端表示、预共享密钥等:
2.4.4 配置IPsec Proposal
配置ipsec提议,指定认证算法、加密算法等:
2.4.5 配置感兴趣流(Policies)
对应云上的SPD网段,如下配置策略,指定本端和对端通信的网段即协议,并采用隧道模式(Tunnel):
2.4.6 增加NAT ACCEPT规则
增加一条ACCEPT允许规则,并把优先级调整到第一位:
首先进入到IP –> Firewall 界面:
如下增加一条accpet允许规则:
之后鼠标拖动让此规则置顶。
2.5 验证两端VPN隧道是否已经建立成功
云上VPN通道标记为“已联通”:
云下Routeros的IPsec策略标记为Established,此时说明VPN隧道已经建立起来:
[RokasYang@MikroTik] /ip/firewall/nat> /ip ipsec policy print where ph2-state="established"
Flags: A - ACTIVE
Columns: PEER, TUNNEL, SRC-ADDRESS, DST-ADDRESS, PROTOCOL, ACTION, LEVEL, PH2-COUNT
# PEER TUNNEL SRC-ADDRESS DST-ADDRESS PROTOCOL ACTION LEVEL PH2-COUNT
1 A to_tencent yes 192.168.1.0/24 172.16.1.0/24 all encrypt require 1
[RokasYang@MikroTik] /ip/firewall/nat>
到此,仅仅是VPN隧道协商起来而已,云上还没有配置任何路由,因此内网还是通不了的,接着往下看。
三、配置CCN多路由表、私网NAT、IP映射规则
3.1 创建CCN
在CCN控制台新建CCN后,进入到CCN的路由表页面:
3.2 创建多路由表
创建两个路由表,名称分别为rtb1、rtb2:
3.3 业务VPC绑定至CCN路由表
已知业务VPC(即云上需要和云下打通的VPC)为 vpc-6sbvxdzj(10.100.1.0/24),将业务VPC关联到路由表1:
3.4 增加路由接收策略
回到CCN路由表1中,点击 路由表接收策略–>添加策略:
添加一条允许业务VPC的策略,添加完成后如下:
3.5 创建CCN型私网NAT并添加至CCN路由表
登录私网NAT网关控制台,新建私网NAT网关,注意类型一定要选择云联网,关联实例选择我们上面创建的云联网实例id:
创建后,点开基本信息页面,可以看到本端VPC、对端VPC,记住这两个VPC,关联CCN路由表时需要用到。
回到云联网控制台的路由表界面,将私网NAT的本端VPC绑定到CCN实例的路由表1中,绑定完成后如下:
在CCN路由表1中设置路由接收策略,添加一条允许私网NAT的本端VPC的规则,添加完成后如下:
紧接着,将私网NAT的对端VPC绑定到CCN实例的路由表2中,并配置路由接收策略允许接收私网NAT对端VPC的路由。
3.6 配置IP映射规则
找到我们前面创建CCN型私网NAT网关,点进去添加SNAT规则。
新增一条SNAT规则,这里我们使用三层NAT映射,当然也可以写四层(IP+端口),根据需求选择:
如上图,我们将云上10.100.1.6的实例,映射给了172.16.1.6,记住这个IP,连通性验证阶段需要用到。
需要注意,三层只能一对一映射,不能映射为IP池,四层则可以映射为IP池。
3.7 将VPN网关关联至路由表
将上面创建的CCN型VPN网关,关联至CCN实例的路由表2中:
并且路由接收策略增加一条允许VPN网关的接收策略:
3.8 将VPN网关路由表发布到CCN
到VPN网关控制台的发布网段页面,将到IDC网段的路由发布,进行勾选:
注意:发布路由至CCN,仅当VPN通道为SPD策略型时,才需要在VPN网关这里手动将路由发布至CCN。
四、配置和发布VPC路由至CCN
4.1 私网NAT的本端VPC路由配置和发布
回到私网NAT控制台,点击本端VPC,去本端VPC的默认路由表里新增路由:
新增一条到IDC网段的路由(比如下图中的最后一条路由就是新增的路由条目,IDC网段是:192.168.1.0/24),下一跳给CCN型的私网NAT网关,并且一定要点击将这条路由发布给云联网,只操作这一条路由就行,上面的路由不要动:
4.2 私网NAT的对端VPC路由配置和发布
同理,找到对端VPC的默认路由表,新增一条目的端为NAT映射后的IP,下一跳给私网NAT网关的路由,并且将这条路由发布到云联网:
五、连通性验证
5.1 ping、mtr、traceroute验证
在云上测试到云下,连通性正常:
云下测试云上,注意此时要访问的是云上映射后的IP,比如我们映射的IP是172.16.1.6,云下任意找一台机器访问云上映射后的IP,连通性测试正常:
5.2 抓包验证
5.2.1 云下、云上同时抓包验证
在云上使用10.100.1.6机器ping 云下192.168.1.8机器的情况下,在云上云下同时抓ICMP的报文。
云上机器抓包可以是:
tcpdump -i any -nn -s 0 icmp and host 192.168.1.8 -v -w cloud.pcap
云下机器抓包:
tcpdump -i any -nn -s 0 icmp -v -w idc.pcap
可以看到,云上机器10.100.1.6和云下192.168.1.8进行通信时,云下收到的ping请求,因为在云上做了SNAT地址转换,来源变成了172.16.1.6,其余诸如ip.id、icmp.seq等字段不会修改:
5.2.2 私网NAT抓包验证
在私网NAT抓包可以看到,10.100.1.6访问192.168.1.8时,私网NAT先把源地址snat到172.16.1.6映射后的IP,再发给对端;收到对端过来的响应给172.16.1.6 icmp reply时,再将172.16.1.6修改为10.100.1.6发送给源端。
六、总结
到此,本文详细介绍了如何通过云联网类型VPN、CCN多路由表和私网NAT,解决云上和云下IDC之间的网段冲突问题,实现两端互通。首先,创建VPN网关和通道,并在云下配置IPsec VPN,确保两端协商一致;然后,通过CCN多路由表和私网NAT进行地址转换和路由管理,绑定业务VPC和NAT实例,并配置IP映射规则,并将路由发布至CCN;最后,进行连通性验证,确保云上和云下能够正常通信,同时在云上、云下、私网NAT抓包,观测中间过程发生的IP转换。