拓扑图
如上,分支flexVNF yb(左下)在路由器R-yb LAN侧,yb通过R-yb SNAT后连通到WAN;
versa VNF分支liuhao(右上)在路由器R-other LAN侧,刘浩通过R-other后连通到WAN。
分支pl 有WAN侧地址,任何在SNAT后的分支,都能很顺利的和他建立vxlan隧道。
但是yb和liuhao都在SNAT后面,他们是否能直接打通vxlan隧道呢?
答案是肯定的,接下来我们通过实验来分析一下。
穿NAT实验
地址分配
- vIOS 路由器 (WAN路由器)
- g0/0 101.1.1.1/24
- g0/1 102.0.0.1/24
- g0/2 103.1.1.1/24
- g0/3 104.0.0.1/24
- controller
- 101.1.1.2
- yb 分支flex vnf
- Lan 33.1.1.1/24
- e1 (wan0) 102.1.1.10
- R-yb 路由器
- g0/0 102.1.1.1/24 (模拟内网地址)
- g0/1 102.0.0.2/24 (模拟wan地址)
- snat规则,将102.1.1.0/24 转换成102.0.0.2
- liuhao 分支flex vnf
- e1 (wan0) 104.1.1.2 (dhcp方式获取)
- Lan33.1.3.1/24
- R-other 路由器
- g0/0 104.1.1.1/24(模拟内网地址)
- g0/1 104.0.0.2/24(模拟wan地址)
- snat规则,将104.1.1.0/24 转换成104.0.0.2
测试连通性
yb分支vpc4 (33.1.1.10) ping 33.1.3.10
两个在SNAT后面的分支直接通过路由器上WAN侧地址建立起来了vxlan隧道。
原理分析
通过抓包,不难发现,vxlan的UDP数据包源目标端口都是4790,在R-yb上查看NAT表:
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
udp 102.0.0.2:4790 102.1.1.10:4790 101.1.1.2:4790 101.1.1.2:4790
udp 102.0.0.2:4790 102.1.1.10:4790 103.1.1.100:4790 103.1.1.100:4790
udp 102.0.0.2:4790 102.1.1.10:4790 104.0.0.2:4790 104.0.0.2:4790
102.1.1.2:4790 -> 104.0.0.2:4790 被SNAT转换为 102.0.0.2:4790 -> 104.0.0.2:4790
转换后的数据包是能顺利发送到R-other上的,R-other并不一定能将数据包转换给内网的liuhao。
而这个时候,如果liuhao也正在穿SNAT,那么R-other上正好产生了相反的转换表项,如下,我们登录到R-ohter上查看NAT表:
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
udp 104.0.0.2:4790 104.1.1.2:4790 101.1.1.2:4790 101.1.1.2:4790
udp 104.0.0.2:4790 104.1.1.2:4790 102.0.0.2:4790 102.0.0.2:4790
udp 104.0.0.2:4790 104.1.1.2:4790 103.1.1.100:4790 103.1.1.100:4790
可以看到对方的公网路由器R-other上正好有NAT会话表是对应的,于是双向SNAT被打通了,vxlan数据包完成转换,发送到liuhao:
102.0.0.2:4790 -> 104.0.0.2:4790 根据snat会话,反向转换 102.0.0.2:4790 -> 104.1.1.2:4790
问题思考
以上双向SNAT穿透,数据包的源目标端口都是4790,而且通过路由器转换,源端口也没有变化,两个路由器产生的snat会话正好能够对上,感觉穿透是一个巧合。
问题
动态的SNAT,源端口转不转换不是绝对的,而一旦源端口变化了,很可能分支之间就无法打通了。
设想一下,万一路由器R-yb ,将 102.1.1.2:4790 转换成 102.0.0.2:5000,发送出去,而liuhao发送的vxlan包目的地却是102.0.0.2:4790 ,他在R-other产生的SNAT会话和R-yb发出来的数据包对不上,那就完成不了穿越了。
设想的解法
- 两个分支要打通双向SNAT,他们先连到controller,与controller实时通信;
- 当分支间打不通的时候,controller给双方随机分配一个端口,分支间用新的端口作为源目标端口继续尝试打通vxlan隧道(总能找到不会被SNAT更改的源端口)
- 反复尝试,直到建立成功
实际验证结果
- 验证方法:
R-yb内网新增一个分支jilin,通过SNAT转换成同一个地址出去。如果jilin也能和liuhao建立起vxlan隧道,那么versa就解决了snat后分支间打通隧道的问题。
- 将yb和jilin都启动后:
R-yb上查看ip nat表:
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
udp 102.0.0.2:4790 102.1.1.10:4790 101.1.1.2:4790 101.1.1.2:4790
udp 102.0.0.2:4790 102.1.1.10:4790 103.1.1.100:4790 103.1.1.100:4790
udp 102.0.0.2:4790 102.1.1.10:4790 104.0.0.2:4790 104.0.0.2:4790
udp 102.0.0.2:1024 105.1.1.10:4790 101.1.1.2:4790 101.1.1.2:4790
udp 102.0.0.2:1026 105.1.1.10:4790 103.1.1.100:4790 103.1.1.100:4790
udp 102.0.0.2:1025 105.1.1.10:4790 104.0.0.2:4790 104.0.0.2:4790
udp 102.0.0.2:1027 105.1.1.10:4790 104.1.1.2:4790 104.1.1.2:4790
由于都是去连liuhao 104.0.0.2:4790, jilin 105.1.1.10:4790被snat成102.0.0.2:1025, 而对方R-other上找不到对应的转换表项,因此vxlan数据包发送不到liuhao。vxlan隧道不通!
在jilin上查看路由,也发现没有到liuhao LAN的路由:
Routes for Routing instance : networktcpip-LAN-VR AFI: ipv4 SAFI: unicast
Codes: E1 - OSPF external type 1, E2 - OSPF external type 2
IA - inter area, iA - intra area,
L1 - IS-IS level-1, L2 - IS-IS level-2
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
RTI - Learnt from another routing-instance
+ - Active Route
Prot Type Dest Address/Mask Next-hop Age Interface name
---- ---- ----------------- -------- --- --------------
BGP N/A +33.1.1.0/24 10.0.0.4 00:55:17 Indirect
BGP N/A +33.1.2.0/24 10.0.0.6 00:55:25 Indirect
conn N/A +33.1.5.0/24 0.0.0.0 00:55:37 vni-0/1.0
local N/A +33.1.5.1/32 0.0.0.0 00:55:37 directly connected
结论
versa只能穿越源端口没有转换的SNAT,当多个分支穿越一个SNAT,需要与远端同样是SNAT后的分支之间通信了,有一个分支是打不通的。