包级别的 TCP/UDP 负载均衡和NAT(Network Address Translate)不能并存。
这是什么意思呢?简单来说,如果你有动态IP的连接,一个使用私有IP地址的局域网,通过NAT(Network Address Translate)上网,现在觉得速度不够,想再加一条使到某一Internet主机的速度加倍(现在中国大陆的典型情况),对不起,你就死了这条心吧,这是不可能的。
这里所说的连接包括 Ethernet,PPPoE,PPPoA,PPP,以及SLIP等等。并且,这是TCP/UDP 协议的内在机制造成的,和软/硬件无关。任何架构在 TCP/UDP 之上的应用,不论硬件还是软件,皆不能绕过此限制。
注意,如果你的局域网使用公用IP(public IP)而不需要NAT,则不在此列。
如果你想知道原因或者质疑我的结论:),请继续往下读。
本文假设
①、你已经阅读过 Linux Advanced Routing & Traffic Control HOWTO,特别是 4.2 小节的 Routing for multiple uplinks/providers,4.2.1小节Split access 和4.2.2小节 Load balancing。此文(以下按惯例简称lartc)非常清楚的说明了连接级别的TCP/UDP 负载均衡。
上面这幅示意图即摘自 lartc,官方站点是 http://lartc.org/。为行文方便,列在这里并做轻微改动,特此说明。
②、为便于理解,以下以常见的Linux 下 ADSL PPPoE 拨号上网为例,但如前所述,讨论适用于其它各种情况。用数对(IP address, port)来表示一个连结的端点。假定
Host IP Port
-------------------------------------
local host 1 192.168.0.15000
Linux routeif1 100.0.0.16000
Linux routeif2 150.0.0.17000
remote host1 200.0.0.180
-------------------------------------
那么连接级别和包级别的负载均衡究竟有何不同?