1. 需求背景
在云上网络的业务场景中,会存在前期地址规划不合理,导致后期地址互通时存在地址重叠的情况,如不同VPC之间的互通存在IP地址重叠,云上VPC和云下IDC互通存在地址重叠。
2. 技术分析
解决地址重叠互通的的核心是做Full-NAT,即相同地址之间互通时针对源地址和目标地址都做NAT,确保真实源地址发送数据包的目的地址是DNAT后的地址,真实目的地址接收到的数据包的源地址是SNAT后的地址。
针对重叠地址互通的场景,可能会存在单向互通和双向互通的情况,其中单向互通则只需要做单向的Full-NAT,双向互通则需要做双向的Full-NAT。
在NAT技术中,使用netfilter的NAT功能实现是一种比较常用的方式,该方式的NAT只需要做对应的iptables规则配置,适合在不做二层开发和对性能要求不高的场景。
3. 技术方案
针对重叠地址互通的场景,该方案主要是基于netfilter的NAT和策略路由的方式实现,通常提供NAT功能的虚拟机或者容器会有两个独立的网络接口用于对接不同方向。
其整体技术方案为实现私网NAT(实现VPC地址重叠的互通,以及VPC和IDC地址互通)提供对应的设计思路。
Full-NAT实现:
DNAT:iptables -i eth0 -t nat -A PREROUTING -d 30.138.10.10 -j DNAT --to-destination 192.168.10.10 #针对要访问的目的地址做DNAT,同时需要添加对应目标地址方向的网络接口
SNAT:iptables -o eth1 -t nat -A POSTROUTING -s 192.168.10.10 -j SNAT --to-source 30.138.20.20 #针对要访问的源地址做SNAT,同时需要添加对应源地址方向的网络接口
策略路由:
为了确保从一个方向网络接口收到的数据包在做对应的NAT规则后能按照正确的路由从对应的网络接口把数据包发出,通过策略路由的方式基于网络接口收到的数据包用于匹配到不同的路由表,同时在对应路由表中写下一跳时需要指定明确的出网络接口,即做到每个接口都有各自独立的路由表。
ip rule add from 0.0.0.0/0 iif eth0 table 101 #基于eth0接收的数据匹配到路由表101
ip route add default via 198.16.10.10 dev eth1 table 101 onlink #路由表101的默认路由通过eth1把数据包发出
ip rule add from 0.0.0.0/0 iif eth1 table 102 #基于eth1接收的数据匹配到路由表102
ip route add default via 192.168.100.10 dev eth0 table 102 onlink #路由表102的默认路由通过eth0把数据包发出
4. 技术案例验证