我有两个互联网连接来自两个不同的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服务器和网关。
我遵循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将数据包平均分配给每个路由表。 更多信息如何在这里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很简单:
# 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轻载连接。