• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 使用Linux實現Internet冗余連接

    發表于:2007-07-02來源:作者:點擊數: 標簽:
    隨著ISP開始向用戶提供高速的Internet連接,普通小型企業及計算機用戶要建立自己的Web 服務器 、FTP服務器或者Mail服務器,就變得非常的容易。但是,如果ISP出現錯誤的話,我們將怎么辦呢?一個最常用的解決方法就是進行另外一個ISP的冗余連接。本文將介紹使

    隨著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配置等內容。因為這方面的信息在網上或者書店里都有大量的資料。此外,讀者也可以到去查找一些相關的資料。
    配置內核
    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以上版本中均帶有該工具包),如果沒有該工具包,可以從以下地址下載

    ip路由工具包提供了兩個專門的命令:ip和tc用于實現高級的路由功能,有關ip命令的文文件可查看以下地址:

    源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版本,可以在以下網址獲得源程序:


    按以下步驟把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,它將會記錄被拒絕的數據包。做為管理員,應該經常查看這些信息,以發現潛在的攻擊者。
    結束語
    以上說了那么多,你是不是有點犯暈,沒關系,如果你在實際中,親身實踐一遍,你可能會說,不過如此。
    (作者:伊利貴)

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>