三千年读史无外乎功名利禄,九万里悟道终归是诗酒田园。

「最佳实践」通过IPsec VPN+CCN多路由表+私网NAT解决IDC与云上资源网段冲突

一、前言

在使用云上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转换。

赞(30)
转载请注明出处:RokasYang's Blog » 「最佳实践」通过IPsec VPN+CCN多路由表+私网NAT解决IDC与云上资源网段冲突