关于lvs nat 模式的一些想法。

lvs 的 dr 模式优点,控制流与数据流分开,可以调度很多机器,缺点 ,需要 real server 的系统功能的支持,

lvs nat 模式的优点,对后端没有任何要求,只要服务能够正常使用即可。缺点,数据双向穿越,消耗大量资源,可调度的机器数量有限。

lvs nat 不如 DR 模式主要就是因为 lvs 机器需要双向穿越数据,而且 real server 必须把默认网关指向 lvs server ,这样就造成了 nat 模式的瓶颈。

我想如果可以不把 real server 的 default geteway 指向 lvs server ,而是把这部分工作交给 lvs server 自己去处理,那么nat 就可以像 dr 模式一样无限的扩展了。

所以我建立如下测试环境。

                  | -->lvs(nat) -- |
DNS (rr)--> | -->lvs(nat) -- | --> { real server 1....N (web) }
                  | -->lvs(nat) -- |

我配置的 real server 不写 default gateway 这样由那台调度过来的数据 real 还会回给那台,这样就解决了 nat 模式瓶颈。
我在 lvs server 上启动 iptables 的 SNAT 进行逆向转发。
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to lvsserver 的内网地址
我测试的时候realserver抓包,发现不能伪装成功。
iptables 包穿越 PREROUTING --> FORWARD --> POSTROUTING
停止 ipvsadm 后单独用iptables 测试。
ipvsadm -C
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to lvsserver 的内网地址端口号
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to lvsserver 的内网地址
这样是成功的,抓包看到 数据包已经成功的伪装成了内网ip成功访问了。
我测试发现当 ipvsadm 调度包后,已经不经过 PREROUTING --> FORWARD --> POSTROUTING 这个模式了.
是否可以实现我的构想,如何实现.

Forums:

我也发现这个问题了,用了ipvsadmin NAT模式之后 iptables -t nat 就失效了,这个到底是怎么回事?

代码的工作流程:
ip_vs_in在
NF_INET_LOCAL_IN hook点上收到数据包之后会自己修改dest为real server地址,
然后把这个包偷走发送(返回的不是NF_ACCEPT,而是NF_STOLEN),
这个数据包不会再被netfilter处理。所以不再经过nat表的hook点,因此也就不起作
用了。