在Linux上对多个ISP连接进行负载平衡和NAT处理


15

我有来自两个不同ISP的两个Internet连接,我需要平衡两个ISP之间发往我的网络的流量。我正在使用Debian GNU / Linux。

我的设置是这样的-

eth0 (192.168.0.0/24)-本地网络

eth1 (192.168.1.0/24)-ISP#1

eth2 (192.168.2.0/24)-ISP#2

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

服务器需要在两个ISP之间进行负载平衡,并且还需要进行NAT转换。

我已遵循lartc.org上的路由说明,但仍需要说明以正确进行NAT转换。

任何帮助将不胜感激。

PS-我了解pFsense,但是我需要使用Linux。


2
您需要哪种指示?一切都在lartc.org上进行了说明。你有什么特别的问题吗?
lorenzog

Answers:


19

我已经使用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将数据包平均分配到每个路由表。有关如何进行此工作的更多信息,请参见此处(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

3
链接的好答案。您不一定需要新的iptables来执行此操作,因为在进行统计信息匹配之前,存在随机第n个匹配项,而该服务器具有相同的角色。
SiegeX

1
我对iptables上的标记有疑问。在发布的链接上,它们仅标记与新状态匹配的数据包。你为什么做的不一样?
马蒂亚斯·

我可以再使用一个网络,例如ISP3,ISP4等吗?
Vitor Mazuco

3

mefat的答案对我有很大帮助,但是与其将所有主表规则一次性复制到两个ISP表中,一种更好的方法可能是使用规则prio在主表后添加默认规则。

正常设置/ etc / iproute2 / rt_tables:

...
10 ISP1
20 ISP2
...

注意

ip rule show

显示规则0-> local,32766-> main和32767-> default。请参阅man ip以获取更多详细信息。

至关重要的是,路由过程将从低优先级规则到高优先级规则进行工作……但是32767不是最高规则。因此,如果主路由表没有默认路由(但可能包含vpn等的各种动态更改路由),则如果不匹配,它将变为默认路由(通常为空),然后寻找更高的优先级规则。

请参阅此处的“抛出”部分: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

再次验证这些规则是否比主要规则更高

然后使用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

这是基于连接的负载平衡,因此,我将研究使用负载来监视和替换统计信息规则:iptables -t mangle -R PREROUTING <n>来自用户空间。因此,如果在一个连接上长期运行下载,而另一个连接的负载很轻,则我们应该选择轻负载的连接。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.