歡迎您光臨本站 註冊首頁

使用Linux實現Internet冗餘連接

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
作者:伊利貴

隨著ISP開始向用戶提供高速的Internet連接,普通小型企業及計算機用戶要建立自己的Web伺服器、FTP伺服器或者Mail伺服器,就變得非常的容易.但是,如果ISP出現錯誤的話,我們將怎麼辦呢?一個最常用的解決方法就是進行另外一個ISP的冗餘連接.本文將介紹使用一個Linux主機來完成Internet冗餘連接,主要有以下內容:
1.配置主機,使其可以處理多個ISP的流入信息.
2.網路流出連接的負載平衡.
3.配置各種服務以實現冗餘.
4.使用ipchains或者iptables配置防火牆.
圖1描述了小型企業或家庭計算機網路的結構.在圖中,Linux是作為Internet和內部區域網兩個部分之間的防火牆.在本例中,網卡eth1使用的DSL,網卡eht2使用的是線纜modem.Linux主機通過和兩個ISP的連接實現負載平衡,這種方法不僅僅適用於高速網路連接.同樣的技術也可以用於在兩個撥號連接間實現負載平衡.



圖1 實現Internet冗餘連接的Linux主機

在圖1中測試用的主機使用的是CPU為Intel Celeron 533MHz的計算機,操作系統使用的是Red Hat 6.2,內核為2.2.18.本文所述方法在內核為 2.4.13的Red Hat 7.2中也測試通過.不過,讀者在實際應用中,不一定非得使用533MHz的CPU,事實上,在本例中,用一台老的配置有32M內存的Pentium 100機器作為防火牆也完全可以.此外,本文中一些例子雖然是針對Red Hat的,不過,只需稍加修改,就可用於其它Linux發行版.
在本文中,我沒有提供網卡配置、Linux內核編譯以及DNS配置等內容.這方面的信息在網上或者書店裡都有大量的資料.此外,讀者也可以到http://www.linuxdoc.org去查找一些相關的資料.



配置內核
Linux內核2.2以及更高版本支持高級路由技術,它可以在一個Linux主機中實現負載平衡和多個預設的路由.為了支持多個Internet連接,在編譯時必需加入下面幾個內核網路選項:
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
如果要想使用新內核中的高級路由功能,那麼就必需要安裝ip路由工具包(在Red Hat 7.1以上版本中均帶有該工具包),如果沒有該工具包,可以從以下地址下載:
ftp://ftp.inr.ac.ru/ip-routing/
ip路由工具包提供了兩個專門的命令:ip和tc用於實現高級的路由功能,有關ip命令的文文件可查看以下地址:
http://snafu.freedom.org/linux2.2/docs/ip-cref/ip-cref.html

源IP路由
預設情況下,TCP/IP數據包是通過檢測目的IP地址,然後在路由表中查找一個到達目的地的路徑.路由表可以通過netstat –r command命令來查看.如果發現了一個路徑,數據包就會被送到網卡,否則,數據包就會被送到預設的網關.對於大多數直接連入Internet的主機來說,預設網關一般是某一個ISP.在本例中,這就意味著所有向外的Internet連接都通過DSL介面.這不是一個冗餘Internet連接所希望發生的.很顯然,當你在系統中加入一個線纜Modem后,你並不希望由DSL連接來響應你的線纜Modem連接.
要解決這個問題,我們使用ip命令建立一個多路由表.而路由表的選擇是基於流出數據包的IP地址的.這可以通過以下的命令來實現:
# Setup source IP routing rules for DSL
ip rule add from 63.89.102.157 lookup 1
ip route add 10.0.0.0/24 via 10.0.0.1 table 1
ip route add 0/0 via 63.89.102.1 table 1


# Setup source IP routing rules for cable modem
ip rule add from 65.3.17.133 lookup 2
ip route add 10.0.0.0/24 via 10.0.0.1 table 2
ip route add 0/0 via 65.3.17.1 table 2


如果一個流出的數據包的源IP地址為63.89.102.157 (DSL),那麼就在路由表1中選擇,它有兩條路徑:
> ip route list table 1
10.0.0.0/24 via 10.0.0.1 dev eth0
default via 63.89.102.1 dev eth1
第一行把本地數據流路由到內部網,第二行則捕獲所有剩下的數據包並通過DSL介面將其送到ISP.線纜Modem的路由表2使用的也是同樣的方法.

負載平衡
在內部網中實現流出負載平衡,使用的是CONFIG_IP_ROUTE_MULTIPATH內核選項,它可以讓系統有多個默認的網關.可以使用以下命令從/etc/sysconfig/network文件中刪除默認網關,然後再使用高級路由功能設置預設網關:
# ip route add default equalize
nexthop via 63.89.102.1 dev eth1
nexthop via 65.3.17.1 dev eth2
要查看高級路由表,使用以下命令:
> ip route list
255.255.255.255 dev eth0 scope link
255.255.255.255 dev eth2 scope link
255.255.255.255 dev eth1 scope link
10.0.0.1 dev eth0 scope link
63.89.102.157 dev eth1 scope link
65.3.17.133 dev eth2 scope link
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1
63.89.102.0/24 dev eth1 proto kernel scope link src 63.89.102.157
65.3.17.0/24 dev eth2 proto kernel scope link src 65.3.17.133
127.0.0.0/8 dev lo scope link
default equalize
nexthop via 63.89.102.1 dev eth1 weight 1
nexthop via 65.3.17.1 dev eth2 weight 1
CONFIG_IP_ROUTE_MULTIPATH內核選項將把所有這些路徑(預設路由)等同看待,然後再根據/usr/src/linux/Documentation/Configure.help來選擇其特定的方式.Ip route命令的equalize選項,會讓Linux內核基於IP地址平衡外部連接.對於一個特定的IP地址,內核會選擇一個介面用於傳輸流出的數據包,然後內核會為該IP地址在路由緩衝中建一個記錄.這樣,其它到達的有相同IP地址的數據包就會使用同一個介面,直到該記錄從路由緩衝中刪除.我們可以使用ip route list cache命令來查看路由緩衝.



配置服務
各種不同的服務(DNS、SMTP、HTTP、LDAP、SSH等) 可以通過DNS循環來實現.減少每一個DNS記錄里的TTL(存活時間),讓遠程系統只能緩衝IP信息30分鐘.這樣流入的信息就會分散在兩個IP地址上.對於流入的SMTP連接,在DNS中添加了兩個MX記錄,這樣如果一個介面關閉了,電子郵件將從另外一個介面傳送.
你可以使用如下所示的dig命令來檢查你的DNS配置:
> dig alphapager.org any

; <<>> DiG 8.2 <<>> alphapager.org any
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 0, ADDITIONAL: 5
;; QUERY SECTION:
;; alphapager.org, type = ANY, class = IN

;; ANSWER SECTION:
alphapager.org. 30M IN A 63.89.102.157
alphapager.org. 30M IN A 65.3.17.133
alphapager.org. 30M IN NS ns.alphapager.org.
alphapager.org. 30M IN NS ns.herdejurgen.com.
alphapager.org. 30M IN SOA proxy.alphapager.org.
root.proxy.alphapager.org. (
2001031000 ; serial
3H ; refresh
1H ; retry
1W ; expiry
30M ) ; minimum

alphapager.org. 30M IN MX 10 ns.herdejurgen.com.
alphapager.org. 30M IN MX 10 ns.alphapager.org.

;; ADDITIONAL SECTION:
ns.alphapager.org. 30M IN A 63.89.102.157
ns.herdejurgen.com. 30M IN A 65.3.17.133

;; Total query time: 98 msec
;; FROM: pandora to SERVER: default -- 192.168.100.1
;; WHEN: Sat Mar 10 22:15:22 2001
;; MSG SIZE sent: 32 rcvd: 326
所有的DNS記錄(除了ns.alphapager.org和ns.herdejurgen.com)現在都被解析成了兩個IP地址.比如:
> nslookup seann.herdejurgen.com
Server: proxy-in.alphapager.org
Address: 10.0.0.1

Name: seann.herdejurgen.com
Addresses: 65.3.17.133, 63.89.102.157
對於Apache,可以更改httpd.conf中的以下行來實現多個名字的虛擬主機:
NameVirtualHost 63.89.102.157:80


NameVirtualHost 65.3.17.133:80
Inbound LDAP and SSH traffic are distributed using round-robin DNS and require no special configuration.

啟動腳本
為了支持我們的網路配置,必須對啟動腳本進行一些更改.這裡更改的腳本是指Red Hat的,不過我們很容易將其推廣到其它的Linux發行套件.系統啟動以後,ip rule命令只能被執行一次.我們可以把以下的行添加到/etc/rc.d/init.d/network腳本中來實現這一目的:
# Add non interface-specific static-rules
if [ -f /etc/sysconfig/static-rules ]; then
sh /etc/sysconfig/static-rules
fi
/etc/sysconfig/static-rules文件內容:
# Setup source IP routing rules
ip rule add from 63.89.102.157 lookup 1
ip rule add from 65.3.17.133 lookup 2


# Setup load balancing
ip route add default equalize
nexthop via 63.89.102.1 dev eth1
nexthop via 65.3.17.1 dev eth2
每一次對某個介面執行ifup后,都必須要執行ip route命令.我們可以在/etc/sysconfig/network-scripts/ifup-routes中添加以下行來實現該目的:
# Add any advanced routes
grep "^advanced " /etc/sysconfig/static-routes |
while read ignore dev args; do
if [ "$dev" = "$1" ]; then
/sbin/ip route add $args
fi
done
/etc/sysconfig/static-routes文件內容:
advanced eth0 10.0.0.0/24 via 10.0.0.1 table 1
advanced eth0 10.0.0.0/24 via 10.0.0.1 table 2
advanced eth1 0/0 via 63.89.102.1 table 1
advanced eth2 0/0 via 65.3.17.1 table 2

防火牆
我們都知道,出於安全性的考慮,只要主機連接在Internet上,就應該有一個防火牆阻止惡意的信息訪問主機.設置防火牆時,決定哪一些服務可以通過Internet訪問,然後關閉所有其它的服務.當然並不是說運行了防火牆就萬事大吉了,事實上,任何一個你允許通過防火牆來訪問的服務都可能有自己安全上的漏洞,你必須經常注意更新你的應用程序,以使其具有最新的補丁.


大部分防火牆只支持外部網和內部網有單一的連接.因此,要支持多個外部網介面,就必須要自己寫一些防火牆腳本.第一個用於編寫腳本的工具是基於數據包的ipchains,它隨Linux 2.2內核一起發行.第二個工具是基於數據包的iptables,它隨2.4版的內核一起發行.
Iptables是ipchains的下一代,因其支持連接跟蹤,功能更加強大.Iptables的可擴展性也非常不錯,我們可以在不更改基本的源代碼的前提下為它增加一些新功能(比如字元串匹配).Ipchains和iptables都會把信息通過一系列的規則鏈,以決定是否接受或者拒絕接受該數據包.
Iptables 中使用了三個規則(或者稱「鏈」)表(filter、nat和mangle)來過濾數據包.在ipchains中,三個對應的規則分別為INPUT、FORWARD和OUTPUT.INPUT分析剛到達網路介面的數據包,FORWARD分析經過偽裝的數據包.而OUTPUT分析即將流出網路介面的數據包.圖2描述的是ipchains防火牆中數據包通過不同的規則鏈的過程.



圖2 ipchains數據包的傳輸過程

在iptables的nat表中,增加了兩個規則,它們是PREROUTING和POSTROUTING.這些規則用於實現偽裝以及網路地址翻譯.所有流入或者流出的數據包都必須通過這些規則鏈.在iptables中INPUT和OUTPUT規則鏈用於處理去往防火牆的數據包,而FORWARD規則鏈則只用於處理數據包偽裝.圖3描述了數據包在iptables防火牆的不同規則鏈的過程.


圖3 iptables數據包的傳輸過程


在iptables中,magle表使用PREROUTING和OUPUT鏈來讓用戶修改數據包中的IP標識,比如TTL或者TOS(服務類型).

防火牆內核配置
要想建立起一個基於Linux 2.2內核的ipchains防火牆,必須在內核配置文件中配置以下的功能:


CONFIG_IP_FIREWALL=y
CONFIG_IP_MASQUERADE=y
CONFIG_IP_MASQUERADE_ICMP=y
CONFIG_IP_ROUTE_TOS=y
CONFIG_SYN_COOKIES=y
而要建立一個基於Linux 2.4內核的iptables防火牆,就必須在內核配置文件中配置以下功能:
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_CONNTRACK=y
CONFIG_IP_NF_MATCH_LIMIT=m
CONFIG_IP_NF_MATCH_PSD=m
CONFIG_IP_NF_MATCH_STATE=m
CONFIG_IP_NF_MATCH_IPLIMIT=m
CONFIG_IP_NF_MATCH_STRING=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_ROUTE_TOS=y
CONFIG_SYN_COOKIES=y
現在,這些核心功能中的一部分在主流Linux 2.4內核的版本中還不可用,不過它們可能作為補丁被添加進去.要把這些功能添加到內核中,必須安裝Linux 內核2.4.13版本和iptables1.2.4版本,可以在以下網址獲得源程序:
http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.13.tar.gz
http://netfilter.filewatcher.org/iptables-1.2.4.tar.bz2
按以下步驟把iptables補丁加到內核中:
1、在/usr/src/linux目錄下安裝Linux 2.4.13,並運行它.
2、把iptables-1.2.4.tar.bz2解壓到它自己的目錄中.
3、iptables-1.2.4# make patch-o-matic
選擇「yes」到以下補丁:
string
psd (port scan detection)
iplimit
並不是每個補丁都兼容,因此只選擇需要的補丁即可.
4、iptables-1.2.4#開始安裝
5、/usr/src/linux# make oldconfig
在CONFIG_IP_NF_MATCH選項時回答「m」.
6、重新編譯內核並重啟.

防火牆腳本
配置防火牆腳本的基本流程是依次設置INPUT、FORWARD和OUTPUT規則.Iptables防火牆腳本還要設置PREROUTING和POSTROUTING規則.各腳本都有註釋,描述什麼信息被接收或者拒絕.REJECT會忽略數據包並且給發送者返回一個ICMP信息,告訴他信息已經丟失.而DENY(ipchains)或者DROP(iptables)則在丟棄數據包后,不做任何回復.在有人探測主機的特定埠時,該功能可以讓系統彷彿不存在,從而有效地保護系統.在本文的防火牆腳本中,設計成不給遠程系統作響應.


要在Red Hat 7.1上配置防火牆腳本,先把腳本放在/etc/init.d/firewall中,然後執行以下命令:
# chkconfig firewall on
要為你的系統配置防火腳本,還必須編輯以下兩行,以定義內部網和外部網的介面:
INT_IFACE="eth0"
EXT_IFACES="eth1 eth2"
INPUT規則鏈在防火牆上為服務開了一個口,對於特定的系統,你必須編輯服務列表 .在ipchains防火牆中,流入連接可以使用以下的行:
# ACCEPT TCP connections for various
# services found in /etc/services
for service in ftp ssh smtp domain
http auth ldap https; do
ipchains -A INPUT -i $EXT_IFACE -p tcp
-d $IP $service -j ACCEPT
done
防火牆腳本在不同的服務間循環,這在主機上是允許的.在本例中,這些服務是FTP、SSH、Sendmail、DNS、HTTP、ident、LDAP和HTTPS.這些基於TCP協議的名字和埠號可以在/etc/services文件中找到.
通過以下規則,在ipchains防火牆腳本中,INPUT鏈還可以接收任何源自本地的連接:
# ACCEPT non-SYN TCP packets on
# unprivileged ports (returns)
ipchains -A INPUT -i $EXT_IFACE -p tcp
! -y -d $IP 1024: -j ACCEPT

# ACCEPT all UDP packets on unprivileged ports
ipchains -A INPUT -i $EXT_IFACE -p udp -d $IP 1024:
-j ACCEPT
ipchains不支持連接跟蹤,而iptables一個很大的改進即是支持這一功能.這就意味著數據包只有和一個活動的連接相符,才能被接收.在iptables防火牆腳本中使用以下規則來處理:
# ACCEPT return TCP/UDP traffic (stateful firewall)
iptables -t filter -A INPUT -m state
--state ESTABLISHED -i $EXT_IFACE
-p tcp -d $IP --dport 1024: -j ACCEPT
iptables -t filter -A INPUT -m state
--state ESTABLISHED -i $EXT_IFACE
-p udp -d $IP --dport 1024: -j ACCEPT
UDP是一個無狀態協議,iptables連接跟蹤維護一個狀態表,並且只對源自內部網的信息作出響應.


Iptables防火牆腳本接受向內的連接並且根據下面所列的規則在連接跟蹤資料庫中加入一個新的連接:
# ACCEPT inbound TCP connections for various
# services found in /etc/services
for service in ftp ssh smtp domain
http auth ldap https; do
iptables -t filter INPUT -m state
--state NEW,ESTABLISHED -i $EXT_IFACE
-p tcp -d $IP --dport $service -j ACCEPT
done
我們可以通過查看/proc/net/ip_conntrack文件來查看連接跟蹤.
以下iptables規則允許在TCP埠20上有主動模式的FTP連接請求:
# ACCEPT active FTP data connections on firewall
iptables -t filter -A INPUT -m state --state RELATED
-i $EXT_IFACE -p tcp -d $IP --dport 1024:
--sport ftp-data -j ACCEPT
在網路內部的連接,FORWARD規則會通過NAT把連接進行偽裝.使用NAT,大部分協議都可以正常工作,只有很少一部分需要一個重寫IP地址的模塊.對於主動模式的FTP連接,需要一個輔助程序來通過防火牆.你可以使用modprobe命令載入ip_masq_ftp(ipchains)或者ip_nat-ftp(iptables)模塊,以實現對主動FTP連接的偽裝.這樣,處於主動的FTP連接的遠程機器,為了傳輸數據,會要求連接本地機.這時,ip_masq_ftp模塊會重新修改FTP連接中的數據包,是的內部機器看起來就像是直接連接在Internet上一樣.對於被動模式的FTP連接,可以使用TCP埠21來傳輸數據,以避開這個問題.值得注意的是,FTP的密碼在網路上是以文本的形式傳輸的,並不安全.要建一個安全的FTP站點,可以使用sftp,它在通信時使用的是安全的套接字.Sftp隨著OpenSSH客戶端工具起發行.
對於各種應用程序的偽裝模塊,可以在/lib/modules/'uname -r'/ipv4 (ipchains) 或者/lib/modules/'uname -r'/ kernel/net/ipv4/netfilter/ (iptables)目錄中找到.
FORWARD使用以下的iptables規則來偽裝通過防火牆的數據包:


# ACCEPT new outbound traffic (stateful firewall)
iptables -t filter -A FORWARD -m state —state NEW,ESTABLISHED
-i $INT_IFACE -s $INT_NET -j ACCEPT

# ACCEPT return traffic (stateful firewall)
iptables -t filter -A FORWARD -m state —state NEW,ESTABLISHED,RELATED
-i $EXT_IFACE -s ! $INT_NET -j ACCEPT

# Pass Internet traffic to internal network unmodified
iptables -t nat -A POSTROUTING -o $INT_IFACE -j ACCEPT

# Masquerading outbound connections from internal network
iptables -t nat -A POSTROUTING -o $EXT_IFACE -j MASQUERADE
OUTPU規則中還可以通過配置TOS(服務類型)標識來實現信息傳輸的先後次序.很多IPS都容易忽略TOS標識.事實上,由於CONFIG_IP_ROUTE_TOS內核選項判斷信息流順序時正是基於這一標識,這一標識非常有用.這就意味著,當一個互動式的應用程序(比如SSH)運行時,你可以讓高帶寬的應用程序(比如FTP)以最大的吞吐量運行,也不會使交互延遲.也就是說,可以讓FTP不影響SSH連接的性能.
TOS標識在iptables防火牆mangle表中的PREROUTING和OUTPUT規則中設置.以下規則會讓SSH數據包的延遲最小:
iptables -t mangle -A PREROUTING -j TOS
--set-tos Minimize-Delay -p tcp --dport ssh
iptables -t mangle -A OUTPUT -j TOS
--set-tos Minimize-Delay -p tcp --sport ssh
OUTPUT規則還可以限制系統對各種ICMP信息的響應.使用以下的配置,我們可以允許ICMP響應ping和traceroute,而不響應時間戳:
# ACCEPT various ICMP messages
for message in echo-reply destination-unreachable
source-quench redirect echo-request
time-exceeded parameter-problem; do
ipchains -A OUTPUT -p icmp -s 0/0 $message -j ACCEPT
done


防火牆的維護
要檢查防火牆規則的效率,可以使用以下命令來執行防火牆腳本:
# ./firewall status
該命令輸出的結果中,如果前兩列是零,那麼就意味著沒有與規則相符的數據包.DENY和DROP規則的零意味著沒有人試圖得用特定的規則對你進行攻擊.ACCEPT規則的零意味著沒有接受符合該規則的信息.


如果想查找防火牆規則的錯誤,那麼務必要要在ipchains命令后加上-l選項,這樣就可把REJECT和DENY規則的信息寫入/var/log/messages文件.Iptables防火牆腳本會創建一個特別的規則鏈DROPLOG,它將會記錄被拒絕的數據包.做為管理員,應該經常查看這些信息,以發現潛在的攻擊者.

結束語
以上說了那麼多,你是不是有點犯暈,沒關係,如果你在實際中,親身實踐一遍,你可能會說,不過如此.


[火星人 ] 使用Linux實現Internet冗餘連接已經有547次圍觀

http://coctec.com/docs/linux/show-post-56440.html