Linux下的雙線ADSL負載均衡安裝日誌

1樓 發表於 2007-4-17 23:47 
看到很多兄弟在搞ADSL負載均衡,下面是今晚的安裝日誌。由於是第一次寫安裝日誌,所以寫作水平很差,加上時間又太晚了,難免有很多錯誤,需要的同志就湊或着看吧。不正確的地方,或需要改進的地方,歡迎多提意見。EMAIL:[email protected]  另外:我不知道在這裏怎麼修飾文字,因爲我認爲需要注意的地方我都加粗了,需要的話我附帶了PDF文件,也可以打印的,沒有密碼。

LINUX雙線ADSL負載均衡
系統環境:
雙線均衡服務器:賽揚1.7,128內存,30G內存。軟件爲FC6.
PPPOE服務器:P133,32內存128MCF卡。軟件爲ROUTEROS.
測試結構如下:
                                |------------------|
PC1-----均衡服務器                        PPPOE服務器--------路由器-----INTERNET
                                |------------------|

IP地址分配如下:
PC1: 192.168.10.88 GW 192.168.10.1
PPP0: 10.0.1.4 GW 10.0.0.1
PPP1:10.0.1.5 GW 10.0.0.1
一、        安裝均衡服務器軟件:
1、        安裝FC6,安裝開發包,這樣在編譯IPID模塊的時候很方便。爲防止網卡號的混亂先安裝一塊網卡,裝完後依次插入其餘2塊網卡,每插一塊啓動一次,完成驅動的安裝,如果出現網卡命名的錯誤,則修改/etc/modprobe.conf和/etc/sysconfig/hwconf文件,還有/etc/network-script/if-ethx文件。
2、        禁用SELINUX:修改/etc/selinux/config:文件,SELINUX=disable
3、        去掉IPV6支持:
#/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=gw.jl.com
4、        去掉不必要的服務:這個利用setup程序完成好了。
5、        加入一些IPTABLES的模塊:修改/etc/sysconfig/iptables-config文件,在原來的模塊配置條目(就一條)下面加入
IPTABLES_MODULES= “ip_conntrack_ftp”  
IPTABLES_MODULES=”ip_nat_netbios_ns”
IPTABLES_MODULES=”ip_nat_ftp”
6、        配置網卡ETH0
#/etc/sysconfig/ifcfg-eth0
# VIA Technologies, Inc. VT6105 [Rhine-III]
DEVICE=eth0
BROADCAST=192.168.10.255
HWADDR=00:19:5B:34:58:CB
IPADDR=192.168.10.1
IPV6ADDR=
IPV6PREFIX=
NETMASK=255.255.255.0
NETWORK=192.168.10.0
ONBOOT=yes
7、        配置網卡ETH1 ETH2
#/etc/sysconfig/ifcfg-eth1
# VIA Technologies, Inc. VT6105 [Rhine-III]
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
HWADDR=00:19:5b:34:58:ce

#/etc/sysconfig/ifcfg-eth2
# VIA Technologies, Inc. VT6105 [Rhine-III]
DEVICE=eth2
ONBOOT=yes
BOOTPROTO=none
HWADDR=00:19:5b:34:58:c8
8、        配置ADSL,這裏不要配置添加缺省網關,同時要修改PID文件,要不兩條PPP鏈路不能同時使用,文件如下:
#/etc/sysconfig/ifcfg-ppp0
USERCTL=yes
BOOTPROTO=dialup
NAME=DSLppp0
DEVICE=ppp0
TYPE=xDSL
ONBOOT=yes
PIDFILE=/var/run/pppoe-ppp0.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
DEFROUTE=no
SYNCHRONOUS=no
ETH=eth1
PROVIDER=DSLppp0
USER=ppp0
PEERDNS=no
DEMAND=no

#/etc/sysconfig/ifcfg-ppp1
USERCTL=yes
BOOTPROTO=dialup
NAME=DSLppp1
DEVICE=ppp1
TYPE=xDSL
ONBOOT=yes
PIDFILE=/var/run/pppoe-ppp1.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
DEFROUTE=no
SYNCHRONOUS=no
ETH=eth2
PROVIDER=DSLppp1
USER=ppp1
PEERDNS=no
DEMAND=no
9、        配置均衡網關,把它方到/etc/ppp/ip-up文件中去,這樣一旦撥號成功,就添加均衡網關。同時修改TCP的超時值。
#!/bin/bash
# This file should not be modified -- make local changes to
# /etc/ppp/ip-up.local instead

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

LOGDEVICE=$6
REALDEVICE=$1

[ -f /etc/sysconfig/network-scripts/ifcfg-${LOGDEVICE} ] && /etc/sysconfig/network-scripts/ifup-post --realdevice ${REALDEVICE} ifcfg-${LOGDEVICE}

/etc/ppp/ip-up.ipv6to4 ${LOGDEVICE}

[ -x /etc/ppp/ip-up.local ] && /etc/ppp/ip-up.local "$@"



ip route add default scope global nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1

echo "86400" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established

exit 0
10、        按照IPID模塊的編譯方法,編譯IPID模塊。
11、        配置防火牆及NAT
# Generated by iptables-save v1.3.5 on Wed Apr 18 00:10:26 2007
*mangle
REROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
OSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ppp0 -j TTL --ttl-set 128
-A POSTROUTING -o ppp0 -j IPID --ipid-inc 1
-A POSTROUTING -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1440
-A POSTROUTING -o ppp1 -j TTL --ttl-set 128
-A POSTROUTING -o ppp1 -j IPID --ipid-inc 1
-A POSTROUTING -o ppp1 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1440
COMMIT
# Completed on Wed Apr 18 00:10:26 2007
# Generated by iptables-save v1.3.5 on Wed Apr 18 00:10:26 2007
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s 192.168.10.0/255.255.255.0 -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1 -j ACCEPT
-A INPUT -d 127.0.0.1 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -p gre -j DROP
-A FORWARD -s 192.168.10.0/255.255.255.0 -j ACCEPT
-A FORWARD -d 192.168.10.0/255.255.255.0 -j ACCEPT
COMMIT
# Completed on Wed Apr 18 00:10:26 2007
# Generated by iptables-save v1.3.5 on Wed Apr 18 00:10:26 2007
*nat
REROUTING ACCEPT [0:0]
OSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o ppp0 -j MASQUERADE
-A POSTROUTING -o ppp1 -j MASQUERADE
COMMIT
# Completed on Wed Apr 18 00:10:26 2007
12、        開啓轉發,及IP動態地址
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl( and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_dynaddr = 1
13、配置好nameserver服務器,/etc/resolv.conf
nameserver 202.102.134.68
14、配置文件中改變的部分,和應該注意的部分,我都加了斜體並且加粗顯示了,這是要注意的地方。

二、        最後就可以在PPPOE服務器上,或者在均衡網關上看到兩條PPP鏈路的負載均衡了。時間有限,我就不抓圖了。應該說這種均衡可能是根據目的地址的均衡,因爲我在PC1上開了N個迅雷任務。這樣能看到均衡的結果。但如果不開任何任務只用PING程序,則基本看不到結果。

更新:
注:
1、 更改ip route add default scope global nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1 中的scope global爲equalize這樣的均衡效果可能要好一些。
2、 此實驗在FC3下未成功。原因是MASQUERADE有缺陷,出現“MASQUERADE:Route sent us somewhere else.”錯誤,這需要一個內核補丁。

[ 本帖最後由 ssffzz1 於 2007-5-8 20:27 編輯 ]

4樓 發表於 2007-4-18 09:22 
LZ 能解釋一下   -j TCPMSS --set-mss 1440  和  -j TTL --ttl-set 128  的意思嗎?
另外  請問這種 ADSL的LB 是基於包的還是基於連接的?


5樓 發表於 2007-4-18 13:39 
-j TCPMSS --set-mss 1440 指TCP連接的最大分段尺寸協商爲1440 ,這主要是爲了避免傳輸的報文超過MTU的大小,帶來重分段;

-j TTL --ttl-set 128 指將所有報文的TTL值修改爲 128,其實就是TTL僞裝;

 

完全正確IPID也是實現僞裝的。

 

 

剛纔實驗了一下,應該不是基於包的。正如《LINUX高級路由和流量控制》所說,這種路由是基於緩衝的,因此並不是100%的均衡。

我個人認爲基於NAT的路由應該是基於鏈接的。假設是基於包的,當我們譬如用QQ的時候,因爲是基於包的,這時因爲有NAT的原因到達QQ服務器的包的源地址是不同的,因此無法建立鏈接。但基於鏈接的卻可以建立正常的鏈接並通訊。
如果說沒有NAT的參與,那麼基於包的路由均衡如果兩條鏈路的代價不一樣,可能會導致包到達的順序不同,就會產生重傳現象。
不過在CISCO的路由器中是可以做基於包的負載均衡的,但我沒有條件測試。

 

 

9樓 發表於 2007-4-18 20:32 


QUOTE:
原帖由 kevin.tan 於 2007-4-18 16:55 發表於 7樓  
呵呵,還是要謝謝兄ssffzz1給我們寫的文檔啊

順便問一下ssffzz1兄,RouterOS好用不?是不是穩定性比自己配置的路由器要強很多呀?

也不是,RouterOS也是基於LINUX+IPTABLES+IPROUTE2的,基本都差不多。不過RouterOS是一個比較全面的成品的軟件,你只要會設置就可以了,但它的功能是定製的,譬如想自己寫個小軟件運行,幾乎不可能。而LINUX需要我們幾乎純手工的製作,最大的特點就是靈活。

 

 

10樓 發表於 2007-4-18 21:56 


QUOTE:
原帖由 ssffzz1 於 2007-4-18 20:29 發表於 8樓  


剛纔實驗了一下,應該不是基於包的。正如《LINUX高級路由和流量控制》所說,這種路由是基於緩衝的,因此並不是100%的均衡。

我個人認爲基於NAT的路由應該是基於鏈接的。假設是基於包的,當我們譬如用QQ的 ...

所以,我認爲很大一部分人會有一個誤區,就是用linux(NAT)可以做到負載均衡,其實應該叫冗餘會比較好一些,真正的負載均衡應該是不涉及到nat的,因爲在路由上,路由器只是修改nexthop的mac地址,而ip的源和目的是不變的,所以cisco的路由的負載均衡纔是真正的LB    在linux上 因爲router cache的問題,而且包負載在NAT上幾乎是不可用,我認爲LB應該做在nexthop上而不是NAT上,LZ認爲呢?
33樓 發表於 2007-4-24 10:07 
我覺得 ip route flush cache 即便能實現route cache的刷新 但是仍不能解決斷線後的冗餘

我的實驗沒有2個ppp口  是2個網關 一個是nat 一個是普通的forward

ip route add default scope global nexthop dev eth0 weight 1 nexthop dev eth1 weight 1

設置了之後,用tracert 一個ip是一個路由,當我down掉那個出口後,再 tracert 發現路由不通了,然後在linux上執行 ip route flush cache ,再 tracert 發現路由還是走那個口,而且linux本地的那條 ip route add default scope global nexthop dev eth0 weight 1 nexthop dev eth1 weight 1 依舊存在(正常路由在端口關閉後會消失)

可不可以理解爲 down掉一個口後,仍然不能把出口流量全部走另外一個正常的口呢
35樓 發表於 2007-4-24 13:36 


QUOTE:
原帖由 5iwww 於 2007-4-24 10:07 發表於 33樓  
我覺得 ip route flush cache 即便能實現route cache的刷新 但是仍不能解決斷線後的冗餘

我的實驗沒有2個ppp口  是2個網關 一個是nat 一個是普通的forward

ip route add default scope global nexthop d ...

應該是的。按照我的做法,如果一條ADSL斷掉,不能夠實現冗餘。要實現的話,可以編寫一個檢測腳本,來根據鏈路的變化實現路由的相應變更。


39樓 發表於 2007-4-30 09:48 
更新:
ip route add default scope global nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1
語句的scope global爲equalize
即:
ip route add default equalize nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1
感覺這樣均衡的效果要好一些。
從帖子發佈至今一直運行,中間未出現過掉線和重啓。感覺ADSL有時候掉線可能和線路質量有很大關係,這個是雙絞銅線的線路。
69樓 發表於 2007-5-11 08:21 
關於等價多路vpn線路負載均衡及類似網絡連接實現的方法


關於等價多路vpn線路負載均衡及類似網絡連接實現的方法


                     +-------+  eth1(tunnel1)         +-------+
                     |          | ================|          |
network1----   |   A     |                              |  B       |----  network 2
                     |          | ================|          |
                     +-------+  eth2(tunnel2)         +-------+
# tc qdisc add dev eth1(tun1) root teql0
# tc qdisc add dev eth2(tun2) root teql0
# ip link set dev teql0 up

路由 A:
eth1(tun1) 10.0.0.1
eth2(tun2) 10.0.0.2
# ip addr add dev teql0 10.0.0.3/24
# ip ru add default via 10.0.1.3 dev teql0
路由B:
eth1(tun1) 10.0.1.1
eth2(tun2) 10.0.1.2
#ip addr add dev teql0 10.0.1.3/24
#ip ru add default via 10.0.0.3 dev teql0
# echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
# echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter

這是一種包均衡方案.

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章