作為一個網管,為了保護你的網絡,你可以花數萬元來對流入流出的信息進行控制,也可以分文不花而達到同樣的目的。聽起來是不是覺得不太可能?下面就讓我們來試一試吧!不試怎麼知道行不行呢?24小時在線的寬帶Internet連接的優點是顯而易見的,它快速、便宜、方便。不過,它潛在的危險相對來說,則不易為人們所注意。事實上,如果沒有合適的保護,這種不間斷的連接將使你公司的服務器和數據時刻處於危險之中。一個帶有防火牆功能的路由器可以有效地消除這些危險。你可以花很多的錢去買一個路由器,也可以把錢省下來,完全使用Linux內建的路由和防火牆的功能來達到目的。在很多情況下,你甚至可以把你的Linux服務器同時作為路由器使用。不過,如果你的Web站點信息流量很大的話,最好使用一台PC來單獨完成這項任務。
使信息可進可出 有時,你可能想讓路由器限制內部網中特定的PC,使其無法從Internet訪問,不過,更多時候,你會讓Linux路由器阻止一些不速之客的訪問。在使用DSL或者線纜連接時,一般都使用一個HUB,將其中一個端口連到Internet。這種情況下,只要是能夠連接到HUB上的人,就可以使用一些很容易得到的軟件,對流過你站點的數據進行監聽,甚至可以直接訪問你的網絡資源。 為此,我們可以關閉Telnet和FTP等容易被居心叵測者所監聽的服務。這顯然可以保證網絡免於被入侵的威險,但是一般來說,公司都會用得上這些服務。也就是說,公司的業務一般要求路由器即要有安全性,又要讓信息能夠順暢地流入流出。所以,你應該做的是有選擇性的限制對這些服務的訪問,而不是完全關閉它們。一旦你建立好了合適的配置腳本,Linux路由器/防火牆就會為你完成這些工作。
服務、端口和協議 一般來說,e-mail或者Web等Linux服務器,都必須可以被外部網所能訪問。對於這種類型的通信,一些行業的標准端口常被用於幫助定義這些服務。比如,Web服務器一般使用80端口,SMTP(用於電子郵件服務)一般使用25端口等等。服務器裡運行的服務以及其使用的端口,可以在/etc/services文件裡找到。 (這是我一台Linux機器上的services文件內容) 此外,你還要清楚路由器應該使用什麼協議。以太網的協議種類很多,不過最常用的是TCP和UDP協議。(機子所使用的協議可以在/etc/protocols中找到)。
使用的命令 對於Linux路由器來說,我們使用的其實只是內核中IP地址轉發和防火牆部分。所以你根本不需要額外的軟件,只需要一些命令腳本,為路由器在處理收到的數據包時所做的反應定一些規則。這其中包括一系列輸入、輸出和轉發方面的規則。 輸入方面的規則要調整流入的數據包,比如,如果運行的是Web服務器,那麼你可能想使用端口80來接收流入的數據包。輸出方面的規則定義路由器是否允許數據被送到Internet,這常被用於拒絕與一些特定站點的連接(通過IP地址)。轉發方面的規則,用於控制數據包從一個地方轉發到另一個地方;通過在網絡裡定義特定的子網並且設置規則只允許一些子網可以轉發信息,從而達到限制Internet訪問的目的。
設置過程 在我所使用的Red Hat7 Linux路由器裡,要管理防火牆的行為,我使用ipchains來設置規則(在Red Hat 6或者更早的版本裡使用ipfwadm)。對於一些其它的Linux發行版,雖然名字可能不一樣,但是功能卻是完全一樣的(比如,FreeBSD中要使用 ipfw)。在不同的發行版本中,防火牆命令的語法會有一些細微的差別(對於這些差別,可以用man命令來查看),不過,只要熟悉了其中一個版本中的配置,其它版本中的配置都是類似的。防火牆配置的管理最好的辦法就是使用在系統啟動過程中會調用的腳本。 對於我例子中的腳本,我做如下說明: 1. 我的路由器中有兩個網卡(NIC),分別是eth0和eth1。 2. eth0通過HUB連接到LAN,並且在192.168.1.0/24的網絡中(24指的是子網)。 3. eth1連接在線纜或者DSL調制解調器上,並且使用的IP地址是由ISP提供的207.1.1.1。 默認情況下,Linux路由器會接收並且送出所有的信息,這相當於和下面一系列的命令等價: ipchains -F ipchains -P input ACCEPT ipchains -P output ACCEPT ipchains -P forward ACCEPT
在本例中: * -F選項會重置所有規則,去除所有規則,然後重新開始配置。 * -P選項告訴防火牆使用默認的規則,直到有新的規則對其進行改變。事實上,如果只使用默認規則,路由器將很容易受到攻擊。 從關到開 我們可以先打開所有的服務,然後再來關閉那些不想讓別人訪問的東西,這看起來似乎很不錯。不過在實際中,我們往往把這個過程倒過來,也就是說,我們首先禁止所有的和路由器的通信,然後再把一些特定的服務和端口打開。所以我們可以采用以下的命令過程: ipchains -F ipchains -P input DENY ipchains -P output REJECT ipchains -P forward DENY 對這些命令說明如下: * -P input DENY對所收到的數據包不做任何反應。 * -P output REJECT不接收任何數據包,但會給出一個ICMP無法到達的返回信息。 下面,我們再增加規則,允許內部網裡的信息流出: ipchains -A input -i lo -j ACCEPT ipchains -A output -i lo -j ACCEPT ipchains -A input -i eth0 -s 192.168.1.0/24 -j ACCEPT ipchains -A output -i eth0 -d 192.168.1.0/24 -j ACCEPT 剛開始的兩行告訴路由器接收所有流入的信息,放行所有流出的信息。第三行和第四行為內部網網卡eth0建立一些流入和流出的規則。 這其中: * -i選項指定要應用規則的接口(在第一行中是lo,在最後兩行中使用的是eth0)。 * -A告訴路由器要增加一個規則。 * -j告訴路由器如何處理數據包。 * -s指示源地址(對於輸入而言)。 * -d指明目的地址(對於輸出而言)。 第三行在內部網(eth0)上創建了一個輸入規則,允許路由器接收所有源地地址為192.168.1.0/24的數據包。第四行指明,所有去往以上地址的數據包都可以通行。
轉發 下面,我們將增加一些規則,控制流出數據的轉發: ipchains -A forward -i eth1 -s 192.168.1.0/24 -j MASQ ipchains -A forward -i eth0 -s 192.168.1.0/24 -j ACCEPT ipchains -A forward -i eth0 -d 192.168.1.0/24 -j ACCEPT 這三條轉發的規則非常的簡單。第一行告訴路由器允許所有源地址為192.168.1.0的數據都可以發到Internet上。-j MASQ選項告訴路由器要使用IP偽裝,這使得多個內部網主機可以使用同一個IP地址來訪問Internet。接下來兩行創建的規則,允許路由器轉發所有源自或者送往內部網192.168.1.0的數據包。 到此,最基本的東西就已經配置完成。但是,有時,我們可能需要限制一些內部網裡的用戶對 Internet的訪問。要做到這一點,我們可以讓用戶使用不同的子網,這樣,他的IP地址和規則不相符,那麼所有源自這些主機的數據包就不能轉發到 Internet。類似地,我們卻可以讓這些用戶使用其它的服務(比如e-mail服務等)。
開啟信息通路 到現在為止,我們的路由器還不會正常工作,因為我們已經使用DENY和REJECT選項把路由器鎖住,它不會讓任何信息通過。現在我們需要添加一些腳本命令來打開各需要的Internet服務。比如,要讓用戶可以訪問我們的Web站點,我們可以添加以下的命令: ipchains -A output -i eth1 -p tcp -s 207.1.1.1 1024:65535 -destination-port 80 -j ACCEPT ipchains -A input -i eth1 -p tcp ! -y --source-port 80 -d 207.1.1.1 1024:65535 -j ACCEPT 這兩行,可以讓路由器向遠程的服務器發送一個數據包,請求一個連接(第一行),並且接收一個流入的數據包(第二行)。因為我們的信息流出接口使用了IP地址偽裝,所以所有向外的連接其使用的IP地址看起來似乎都是207.1.1.1(這個地址只是一個例子)。同樣,如果我們想讓用戶訪問外部的POP3電子郵件服務,我們只需要把這兩行命令的端口號80改為110(POP3端口)即可。不管你要添加什麼服務,只要增加相應的行即可。
允許訪問 如果你不想讓外部世界來訪問我們的路由器服務,那麼我們已經達到目的了,因為我們缺少的規則已經被設置成拒絕所有的信息流入的請求。但是有時我們需要在服務器上運行Web服務,以讓外部的人也可以訪問,這時我們可以添加以下命令: ipchains -A input -i eth1 -p tcp --source-port 1024:65535 -d 207.1.1.1 80 -j ACCEPT ipchains -A output -i eth1 -p tcp ! -y -s 207.1.1.1 80 --destination-port 1024:65535 -j ACCEPT 第一行告訴路由器去接收(-j ACCEPT)所有來自外部網並且目的地址是我們路由器的數據包。接著的一行讓路由器可以發送數據包。要配置其它的服務,其和以上的命令非常的類似。比如,我們要在內部運行SMTP或者POP3服務器,那麼我們只需將上述命令的端口80分別改為25和110即可。
檢查並且激活服務 在任何時候,你都可以輸入“ipchains -L”命令來檢查你的規則腳本。 通過更改一些系統文件,你可以讓這些腳本在每一次路由器啟動時,都會被自動的被激活。要做到這一點,方法很多。比如,如果你的ISP給你的是一個動態IP地址並且你的系統在啟動時使用“/sbin/pump”來獲取這一地址,那麼你必需更改你的“/etc/pump.conf”文件,將其配置為等 “/sbin/pump”完成後,再激活腳本。如果你使用的是靜態IP地址,那麼你可以在“/etc/rc.d/rc.local”後面來激活腳本。 最後,一定要測試一下,確保路由器所做的和自己想像中的完全一樣。此外,一旦你的網絡和服務有更改或者用戶的增加減少,你的這些腳本可能都要相應地做一些調整。