在Linux上负载均衡和NAT多个ISP连接

我有两个互联网连接来自两个不同的ISP,我需要平衡来自和来自我的networking之间的两个ISP之间的stream量。 我正在使用Debian GNU / Linux。

我的设置是这样的 –

eth0 (192.168.0.0/24) – 本地networking

eth1 (192.168.1.0/24) – ISP#1

eth2 (192.168.2.0/24) – ISP#2

我的本地networking通过eth0连接到此服务器,并且该框是LAN中所有机器的DHCP服务器和网关。

服务器需要在两个ISP之间进行负载均衡,还需要进行NAT

我遵循lartc.org上的路由指示,但我仍然需要指示来正确地进行NAT。

任何帮助将不胜感激。

PS – 我知道pFsense,但我需要使用Linux。

我已经使用lartc.org和iptables方法做了负载平衡,我发现iptables方法更容易理解和实现。 唯一的缺点是你需要一个相当新的iptables版本才能使用统计模块

我们假设一些事情:

局域网:eth0:192.168.0.1/24

ISP1:eth1:192.168.1.1/24,网关:192.168.1.2/24

ISP2:eth2:192.168.2.1/24,网关:192.168.2.2/24

所以这里是我将如何使用iptables方法:

路线表

首先编辑/ etc / iproute2 / rt_tables以在路由表号码和ISP名称之间添加映射

 ... 10 ISP1 20 ISP2 ... 

所以表10和20分别针对ISP1和ISP2。 我需要用这个代码片段(从hxxp://linux-ip.net/html/adv-multi-internet.html取得)从主表中填充这些表格。

 ip route show table main | grep -Ev '^default' \ | while read ROUTE ; do ip route add table ISP1 $ROUTE done 

并通过该ISP1的网关添加到ISP1的默认网关:

 ip route add default via 192.168.1.2 table ISP1 

对ISP2也一样

所以现在我有2个路由表,每个ISP有1个。

iptables的

现在我可以使用iptables将数据包平均分配给每个路由表。 更多信息如何在这里find这项工作( http://www.diegolima.org/wordpress/?p=36 )和这里( http://home.regit.org/?page_id=7

 # iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark # iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT # iptables -t mangle -A PREROUTING -j MARK --set-mark 10 # iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20 # iptables -t mangle -A PREROUTING -j CONNMARK --save-mark 

NAT

那么NAT很简单:

 # iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE # iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE 

mefat的答案帮了我很多,而不是将所有主表规则的副本都复制到两个ISP表中,更好的方法是使用规则prio在主表之后添加默认规则。

正常设置/ etc / iproute2 / rt_tables:

 ... 10 ISP1 20 ISP2 ... 

注意

 ip rule show 

显示规则0->本地,32766->主要和32767->默认。 请参阅man ip了解更多详情。

至关重要的路由过程将工作从低prio规则高prio …但32767不是最高的规则#。 因此,如果主路由表没有默认路由 (但可能包含各种dynamic变化的vpns路由等),那么如果不进行匹配,则默认路由(通常为空),然后查找更高的prio规则。

请参阅这里的“扔”部分: http : //linux-ip.net/html/routing-tables.html

所以现在设置

 ip route add default dev $ISP1_IFACE table ISP1 ip route add default dev $ISP2_IFACE table ISP2 

并确保他们在主表后查看:

 ip rule add fwmark 20 table ISP1 prio 33000 ip rule add fwmark 10 table ISP2 prio 33000 

使用

 ip rule show 

再次validation这些规则比主要更高

然后使用CONNMARK作为mefat说:

 # iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark # iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT # iptables -t mangle -A PREROUTING -j MARK --set-mark 10 # iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20 # iptables -t mangle -A PREROUTING -j CONNMARK --save-mark 

需要注意的是:pppd需要nodefaultroute否则设置为main; 当设备重新启动时,ISP1 / ISP2表被清除,因此需要使用脚本进行恢复。

我在/etc/ppp/ip-{up,down}.d/dual-routing中使用脚本

 # One of my connections is ~2x faster than the other BALANCED=0.3 ALL_ISP1=0 ALL_ISP2=1 RULENUM=4 set_balance() { iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2 } # if both up set_balance $BALANCED # if ppp1 down: set_balance $ALL_ISP1 # if ppp0 down: set_balance $ALL_ISP2 

这是基于连接的负载平衡,所以我要看看使用负载监视和replace统计规则: iptables -t mangle -R PREROUTING <n>从用户空间。 所以如果在一个连接上有一个长时间的下载,而另一个连接是轻载的,我们应该select轻载连接。