作為一個網管,為了保護你的網路,你可以花數萬元來對流入流出的資訊進行控制,也可以分文不花而達到同樣的目的。聽起來是不是覺得不太可能?下面就讓我們來試一試吧!不試怎麼知道行不行呢?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”來擷取這一地址,那麼