最近工作上討論到要如何將工廠的兩條專線做 Load Balance,原本想用之前換下來的一台國產 Load Balance 來做,但據了解那台 Load Balance 不是很穩定,雖然最後決定由廠商建議的 L3 Switch 及 Router 來解決,但這也讓我想研究看看 Linux 是否可以當做一台 Load Balance。
之前 kernel 2.4 的版本中,需要重新編譯 kernel 才能支援頻寬合併,目前從 kernel 2.6 之後就都已支援了,現在整理出下面的步驟。
一、基本設備與環境
至少三張網路卡
eth0=1.1.1.1 ← 假設為第一條 ADSL 的 Public IP
eth1=2.2.2.2 ← 假設為第二條 ADSL 的 Public IP
eth2=10.0.0.1 ← Lan 的 Private IP
二、首先要將本機的 IP Forward 功能 Enable
/etc/sysctl.conf
-----------------------------
net.ipv4.ip_forward=0 ← 將 0 改為 1,修改後需重新開機方能生效
以後開機後自動啟動 IP Forward。
若是希望能馬上生效,而不需重新開機,請輸入下列指令,
echo 1 > /proc/sys/net/ipv4/ip_forward ← 馬上修改記憶體中的參數,此方法在下次重新開機後會回到 /etc/sysctl.conf 裡所設定的預設值。
echo 1 > /proc/sys/net/ipv4/ip_forward ← 馬上修改記憶體中的參數,此方法在下次重新開機後會回到 /etc/sysctl.conf 裡所設定的預設值。
三、設定合併頻寬,下列為 Shell Script
#!/bin/bash
# 設定 NAT
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
# 設定 LAN
LAN="10.0.0.0" # subnet
LANM="24" # netmask
LAN="10.0.0.0" # subnet
LANM="24" # netmask
# 設定 Wan_1
WAN1="1.1.1.1" # 第一條 ADSL 的固定 IP
GW1="1.1.1.254" # 第一條 ADSL 的 Gateway
WAN1="1.1.1.1" # 第一條 ADSL 的固定 IP
GW1="1.1.1.254" # 第一條 ADSL 的 Gateway
# 設定 Wan_2
WAN2="2.2.2.2" # 第二條 ADSL 的固定 IP
GW2="2.2.2.254" # 第二條 ADSL 的 Gateway
WAN2="2.2.2.2" # 第二條 ADSL 的固定 IP
GW2="2.2.2.254" # 第二條 ADSL 的 Gateway
# 設定第一條 ADSL 的 ip rule
# pref 為 priority,值越小 priority 越高
# from 設定來源 IP
# table 設定 table 的編號
ip rule add pref 100 from $WAN1 table 100
ip route add default via $GW1 table 100
# pref 為 priority,值越小 priority 越高
# from 設定來源 IP
# table 設定 table 的編號
ip rule add pref 100 from $WAN1 table 100
ip route add default via $GW1 table 100
# 設定第二條 ADSL 的 ip rule
ip rule add pref 101 from $WAN2 table 101
ip route add default via $GW2 table 101
ip rule add pref 101 from $WAN2 table 101
ip route add default via $GW2 table 101
# 設定 Lan 的 ip rule
ip rule add pref 102 to $LAN/$LANM table 102
ip route add $LAN/$LANM dev eth2 table 102
ip rule add pref 102 to $LAN/$LANM table 102
ip route add $LAN/$LANM dev eth2 table 102
# 設定自動切換兩條路由
# equalize 參數將 Packet 分散到不同的線路上
# weight 比重設定
ip route replace default equalize nexthop via $GW1 dev eth0 weight 1 nexthop via $GW2 dev eth1 weight 1
# equalize 參數將 Packet 分散到不同的線路上
# weight 比重設定
ip route replace default equalize nexthop via $GW1 dev eth0 weight 1 nexthop via $GW2 dev eth1 weight 1
# 清除 route cache
ip route flush cache
ip route flush cache
四、額外補充1. 如果要指定內部某一 IP 從特定路由對外連線,例如 10.0.0.100 一定要由 1.1.1.254 對外連線。
ip rule add from 10.0.0.100 table 100
2. 如果要指定連線到某一特定網段或 IP,一定要由特定路由對外連線,例如要到 http://www.hinet.net(203.66.88.89)一定要由 2.2.2.254 對外連線。
ip route replace 203.66.88.89 via 2.2.2.254或
ip rule add to 203.66.88.89 table 101
ip route replace 203.66.88.89 via 2.2.2.254或
ip rule add to 203.66.88.89 table 101
沒有留言:
張貼留言