Linux 上的负载平衡和 NAT-ing 多个 ISP 连接

Bai*_*ose 17 networking linux local-area-network nat load-balancing

我有来自两个不同 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-ing。

我已经遵循了lartc.org上的路由说明,但我仍然需要正确执行 NAT 的说明。

任何帮助将不胜感激。

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

小智 21

我已经使用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
...
Run Code Online (Sandbox Code Playgroud)

因此表 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
Run Code Online (Sandbox Code Playgroud)

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

ip route add default via 192.168.1.2 table ISP1
Run Code Online (Sandbox Code Playgroud)

对 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
Run Code Online (Sandbox Code Playgroud)

网络地址转换

NAT 很简单:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

  • 带有链接的好答案。您不一定需要一个新的 iptables 来执行此操作,因为在 **statistics** 匹配之前,有 **random** 和 **nth** 匹配哪个服务器具有相同的角色。 (3认同)