0x01 前言
最近在对接港交所的衍生产品市场,这是通过物理专线连接,直接从港交所接收组播数据,获取第一手数据的一款产品。而在正式开通服务前需要进行一系列测试、产品对接等工作,紧接着还需要经过港交所的验收后才能申请开通正式服务接收数据。
目前处于前期的调试阶段,港交所提供了可本地部署的系统测试辅助工具,通过这套工具可以通过重放数据的方式来模拟正式环境。而我一侧的环境是基于VMware的虚拟化环境,基础设施是清一色的华为,因此配置起来与裸金属的部署方式多了虚拟化的环节。
相关文档可以从下面的链接找到:
这篇文章会用到以下文档:
0x02 基本信息及架构
从上面链接中还可以找到以下文档,内有较为详细的架构:
- 「香港交易所领航星」巿场数据平台接驳指南-衍生产品市场数据(版本1.14)
港交所一侧的架构图如下:
港交所有两套集群,分别是Primary与Backup;两个集群中都有重传服务器,也就是图中的Re-transmission;不同集群中都有两套组播源,分别对应用户上一层的SDNet路由器。可以留意下Client Server上一层中的SDNet Link A和Link B所转发的组播段。
港交所也要求SDNet中的两台路由器必须使用主备模式,路由器之间通过心跳线检测存活情况,客户侧的网关IP为虚拟IP,由客户自行检测SDNet路由器的存活情况以便确认使用哪条线路。当我们需要接收某个产品的数据时,只需要加入对应的组播组即可。
其实从SDNet路由器开始往上都不需要我们调整,我们只需要负责Client Server的部分即可。因为涉及到组播,又因为港交所对服务的可靠性有强制性要求,所以必须要做到网络服务稳定可靠。On-Boarding Tools User Guide中的模拟环境架构图如下:
从上图中可以看到有两种方案,主要差别是重传服务器与私有化服务器是否在同一台服务器上,为了最大程度模拟真实环境,我选择第二种架构。其实不严谨来说,两者是差不多的。
这里需要讲解下基本的架构,在正常情况下,数据会从主集群通过组播的方式向外发送,但也有可能会因为网络问题等诸多因素导致数据中断,这时候的业务系统就会访问RTS Simulator申请重传某个时间段的数据。而这个RTS Simulator也就是Re-transmission服务器会缓存一个时间段内的全部数据,当我们有需要的时候就通过TCP协议进行通讯,因为重传要保证可靠性。
回到测试架构图,可以看到Tcpreplay重放服务器作为组播源对外发送数据,RTS Simulator和业务系统分别都需要加入组播组以接收数据,当网络出现故障时,业务系统会通过TCP协议向RTS Simulator请求缺失的数据,简单明了。
现在再深入一层,加入VMware虚拟化架构与华为的交换机和路由器,架构如下:
实际的架构如上图,两个集群间用路由器互联,路由器下面的部分为真实环境的HKEX。因为集群中使用VMware的SDN软件,也就是NSX,所以配置起来会比一般架构多些NSX Edge的配置步骤。另外,从安全层面来看,华为路由器的部分也需要进一步配置,需要精细化控制组播源IP以及接收者,这部分工作既需要在华为路由器中配置,也需要在NSX防火墙中配置,以确保数据安全。
0x03 OMD测试组件部署
本节中所用到的所有软件及数据包均需要通过邮件向HKEX索取。
0x03.1 网络部署
这里使用VMware NSX和VMware vCloud,所以配置起来会比较繁琐。首先到集群1中的华为交换机配置相关vlan并放行相关vlan:
<S0000>dis cur int eth1 # interface Eth-Trunk1 port link-type trunk port trunk allow-pass vlan 66 stp edged-port enable stp instance 0 cost 10000 mode lacp # return
为了与生产流量区分开,所以需要另开vlan并在vCloud中添加其为外部网络,此时需要到vCenter中添加一个vDPG:
完成后即可到vCloud中添加外部网络:
添加外部网络的时候需要填写网关,这个网关也就是后面创建Edge的网关,建议为外部网络配置静态IP池,方便添加Edge的时候自动配置IP。完成后需要到路由器中添加对应的vlan,并在该端口中配置IP,这个IP就是刚刚在vCloud中配置的外部网络的网关:
<Ar0000>dis cur int eth0.66 [*] # interface Eth-Trunk0.66 dot1q termination vid 66 ip address 10.xxx.xxx.xxx 255.255.255.240 pim sm igmp enable # return
在这里可以看到路由器的端口配置中含有igmp相关的信息。
接下来需要添加OVDC,如果有需要,还可以新建独立的PVDC。进入OVDC租户门户中添加Edge:
然后在该Edge下新建网络并配置静态IP池以便后续实现自动开设虚拟机:
紧接着来到vCenter,进入该Edge的配置界面,按需配置OSPF或iBGP,以便将上一步中配置的网络IP网段传播到华为路由器,因为组播的前提是各个网段的单播需要互通:
完成后需要到路由器上确认路由情况:
<Ar0000>dis ospf routing OSPF Process x with Router ID xxx.xxx.xxx.xxx Routing Tables Routing for Network Destination Cost Type NextHop AdvRouter Area 10.xxx.xxx.xxx/28 1 Transit 10.xxx.xxx.xxx 10.xxx.xxx.xxx 0.0.0.xx 10.xxx.xxx.xxx/28 1 Transit 10.xxx.xxx.xxx 10.xxx.xxx.xxx 0.0.0.xx 10.xxx.xxx.xxx/28 2 Stub 10.xxx.xxx.xxx 10.xxx.xxx.xxx 0.0.0.xx 10.xxx.xxx.xxx/28 2 Stub 10.xxx.xxx.xxx 10.xxx.xxx.xxx 0.0.0.xx
可以看到上面有4个IP段,这是因为Cluster2也已经完成配置,相关的路由也已经传播到路由器。
最后来到多播页面,将多播功能打开:
对于依赖VMware的组播,有一些局限性和特性,具体可以留意以下文档:
将上面的步骤在Cluster2中执行一遍。至此,网络配置工作已完成。
0x03.2 Tcpreplay部署
按前文所说的,我们至少需要准备3台虚拟机分别用于Tcpreplay、RTS Simulator和作为接收者的VM。回到vCloud创建虚拟机即可,在这里我是用Debian:
完成后即可参照文档进行部署。首先将以下文件上传至Tcpreplay虚拟机:
# 数据包rewrite及重放工具 cannedDataLocalizingTool.tar.gz # 真实环境的数据包 20200708-e2e.pcap.zip
在执行前需要执行以下命令安装相关软件:
apt-get install tcpreplay
紧接着将数据包解压并放在cannedDataLocalizingTool目录下的pcap文件夹内,最后执行以下命令即可:
数据包为50G,因为需要重写IP及MAC地址,建议将其放在IO性能较优及CPU性能较好的虚拟机中执行:
完成后会在pacp目录下生成两个新文件:
20200708-e2e.pcap_PLAYBACK.rewrite.tag 20200708-e2e.pcap_PLAYBACK.rewrite
最终执行以下命令即可重放数据:
tcpreplay -i ens192 -I ens192 -x 10 -c \ ./pcap/20200708-e2e.pcap_PLAYBACK.rewrite.tag \ ./pcap/20200708-e2e.pcap_PLAYBACK.rewrite
当然,还可以用screen让其在后台执行:
screen -dmS hkex bash -c 、 'cd /root/hkex/cannedDataLocalizingTool/ && ./playback.sh'
执行命令后可以通过iftop看到相关流量:
至此,Tcpreplay服务的部署工作已完成。
0x03.3 RTS Simulator部署
来到RTS Simulator虚拟机,将以下文件解压并将其放置到指定位置:
# 文件名 OMD Simulator.zip # 复制到指定路径 /opt/hkex/
然后修改配置文件:
# 修改文件 nano config/xdp-rts-client-sim.xml
分别修改Point B、C和D:
其中Point B中的两个IP可以一致,完成后保存即可。
在运行RTS Simulator前请确认虚拟机的内存在4G或以上,建议使用6G或8G内存,然后执行以下命令:
/opt/hkex/xdp/release/bin/start_simulation.sh
确认服务是否正常:
此外,你可能还需要编辑配置文件以便缓存合适的组播地址。于此同时,可以在Tcpreplay服务器上执行重放命令,然后在RTS Simulator服务器中检查流量情况,如果能收到则说明一切正常。
至此,RTS Simulator的配置工作已完成。
0x04 检查及测试
因为是途径路由器的跨集群组播,所以可以在路由器中检查相关信息,首先是邻居:
<Ar0000>dis pim neighbor VPN-Instance: public net Total Number of Neighbors = 2 Neighbor Interface Uptime Expires Dr-Priority BFD-Session 10.xxx.xxx.xxx Eth-Trunk0.66 21:54:58 00:01:17 1 N 10.xxx.xxx.xxx Eth-Trunk0.67 21:55:20 00:01:27 1 N
然后是rp info
<Ar0000>dis pim rp-info VPN-Instance: public net PIM-SM BSR RP Number:2 Group/MaskLen: 224.0.0.0/4 RP: 10.xxx.xxx.xxx (local) Priority: 0 Uptime: 21:57:08 Expires: 00:02:08 Group/MaskLen: 224.0.0.0/4 RP: 10.xxx.xxx.xxx (local) Priority: 0 Uptime: 21:57:08 Expires: 00:02:08
可以注意到,上面的两个RP IP均是Edge网关的IP。紧接着检查路由情况:
<Ar0000>dis pim routing-table brief VPN-Instance: public net Total 4 (*, G) entries; 80 (S, G) entries 00001.(*, 224.2.2.2) Upstream interface:Register Number of downstream:1 Number of receive vrf:0 00002.(10.xxx.xxx.xxx, 239.1.1.128) Upstream interface:Register Number of downstream:0 Number of receive vrf:0
可以留意到00002路由中的源地址为Tcpreplay虚拟机的IP。
接着来到集群2中使用vCloud创建一台虚拟机用于接收集群1中Tcpreplay虚拟机的组播数据,在这里需要借助smcroutectl这个命令,在需要加入组播组的虚拟机中执行以下命令安装:
apt-get install smcroute
完成后分别执行以下命令加入组播组:
smcroutectl join ens192 239.1.1.158
然后执行以下命令检查所加入的组播组:
root@hkex-linux01:~# smcroutectl show ROUTE (S,G) INBOUND PACKETS BYTES OUTBOUND (10.xxx.xxx.82, 239.1.127.151) ens192 0000022914 0003627000 (10.xxx.xxx.82, 239.1.127.180) ens192 0001154428 1671894056 (10.xxx.xxx.82, 239.1.1.158) ens192 0000589451 0819256104 (10.xxx.xxx.98, 239.1.1.158) ens192 0000008572 0000274304 (10.xxx.xxx.98, 224.2.2.2) ens192 0000010070 0000322890 (10.xxx.xxx.98, 239.1.127.180) ens192 0000009454 0000302684 (10.xxx.xxx.98, 239.1.127.151) ens192 0000009453 0000302496
完成后再使用iftop命令在Cluster2上的测试机检查流量情况:
至此,所有配置均已完成。
0x05 结语
以上仅是初步配置,还需要进一步微调,另外还需要通过ACL及Policy等配置进一步提升安全性,避免因意外导致数据流入其他集群或环境。
针对VMware文档中所指出的一些缺陷及局限性,还需要进一步测试及调整以提升服务可靠性。