1.背景介绍
场景跟前面提到的fullnat是一样的。
如下组网,ADS集群内存在计算节点1(10.0.103.96)写sysdb保存数据的情景;而sysdb的服务器可能在计算节点2(10.0.103.97)、计算节点3(10.0.103.98)上,通过SLB对外提供接入服务,如10.0.104.107:10000。
因此,计算节点1写sysdb时,需要从10.0.103.96发报文到10.0.104.107(源地址:目的地址为10.0.103.96:10.0.104.107),然后SLB做FULLNAT,将源地址、目的地址替换为10.0.103.107:10.0.103.97。
这里有一个问题,就是如何指导计算节点1将报文发送给SLB(10.0.104.107)?
2.解决方法
2.1 粗暴的解决方法
很简单,就是在各个计算节点上配置路由为SLB的内部IP(10.0.103.107),即报文直接经VLAN 60转给SLB,报文从eth1口送上去给SLB;应答报文仍然经过eth1送给计算节点。
但这要求用户手工配置计算节点的路由,在部署的时候略为麻烦(部署时还需要yum安装一些包,但这必须配置路由为网关)。
2.2 正确的解决方法
按照最早的想法,如果将计算节点的网关配置为vlan 60的地址,报文可以经过vlan 60转到vlan 70,然后从eth0口上送给SLB;SLB将报文处理完毕后,根据目的地址将应答报文再从eth1发送给计算节点。
但实测发现,SLB直接将报文丢弃了,并没有应答,连接建立失败,而且也没有应答ICMP差错报文。
linux有一个叫做反向过滤(reverse path filter)的功能,简单来说就是为了防DDOS攻击,会检查报文源地址的合法性,如果反查源地址的路由表,发现源地址下一跳的最佳出接口并不是收到报文的入接口,则将报文丢弃。所以只