FreeBSD設定和使用ipfw/natd(轉)

gugu99發表於2007-08-11
FreeBSD設定和使用ipfw/natd(轉)[@more@]

  透過設定,FreeBSD系統能夠具備更高的安全性,防止外界入侵者進入系統,即使入侵者利用人為的問題進入系統,FreeBSD嚴密的保護也將使他們無所作為,不能對系統造成嚴重的破壞。然而,除了用於保護系統本身的能力之外,FreeBSD還能用於保護同一個網路內的其他計算機。此時這個FreeBSD系統就必須作為內部網路的預設閘道器,擔負將內部網路連線到外部網路的任務。

  FreeBSD系統實現了包過濾能力與網路地址轉換能力,如果僅將這些能力用作保護系統本身,顯然不是這些功能的設計目的,保護本地系統只是保護本地網路的一部分功能。包過濾能力是針對路由器等網路裝置來設計的,而網路地址轉換也是重要的防火牆功能,這些設計就使得FreeBSD能被十分方便的設定為防火牆系統。此外,FreeBSD上也能執行其他型別的防火牆軟體,如代理型防火牆軟體fwtk等,作為代理伺服器來保護本地網路內的系統。

  即使FreeBSD系統不是用作防火牆,它所支援防火牆能力也同樣能用來保護本地系統的安全。

  • 設定和使用ipfw/natd

      在專用路由器系統開始流行之前,Internet上的路由器大部分是基於Unix的軟體路由器,其中多數是BSD Unix。顯然這是由於BSD Unix在Internet上佔據的重要地位決定的,即便是在專用硬體路由器流行的今天,當由於價格等因素不能考慮硬體路由器時,BSD系統仍然是用作軟體路由器的首選系統。

      由於路由器處於網路之間,所有網路間需要交換的資料包都要透過它轉發,因此就可以進行一定的限制,即按照預定義的一定規則處理每個資料包,符合要求的允許透過,不符合要求的就進行丟棄。這樣路由器就能用作一個簡單的防火牆系統,保護內部計算機。BSD系統中最早使用ipfw過濾器來定義不同的過濾規則,隨後ipfw也被移植到其他平臺上,並根據開發者的理解不同而獨立發展。當前不同系統上的ipfw已經大不相同了,並出現了具備相同功能的其他過濾器, FreeBSD下的ipfw也經過了不斷髮展,具備了更強的過濾能力,尤其是它能和natd守護程式相結合,提供網路地址轉換能力,具備更完善的防火牆能力。

  • 使用ipfw設定過濾

      由於包過濾要對每個資料包都進行判斷,因此在網路流量較大時需要較高的處理器處理能力,FreeBSD的包過濾能力是在核心中實現的,這樣才能具備最高的效率和效能。因此為了在FreeBSD上使用這個防火牆功能,需要在編譯核心時開啟下面選項重新定製核心。

    options IPFIREWALL

    options IPFIREWALL_VERBOSE

    options “IPFIREWALL_VERBOSE_LIMIT=100”

    options IPFIREWALL_DEFAULT_TO_ACCEPT

    options IPDIVERT

      其中第一項設定IPFIREWALL是用於開啟基本的包過濾支援的,只有使用它才能在核心中支援包過濾。IPFIREWALL_VERBOSE 和IPFIREWALL_VERBOSE_LIMIT設定記錄過濾日誌,及日誌記錄的限制。IPFIREWALL_DEFAULT_TO_ACCEPT是設定IPFIREWALL的預設行為,在資料包不符合所有的過濾規則的情況下進行轉發,顯然這是一種寬鬆的限制,此時系統主要用於遮蔽特定地址和特定服務,而提供其他的預設網路能力。如果沒有定義這個選項,系統就只能允許符合已定義規則的資料包透過,而遮蔽其他任何資料包,這樣在沒有定義過濾規則的情況下,系統不能和其他計算機相互通訊。最後一個選項IPDIVERT是用於定義IPFIREWALL與natd的介面。

      當編譯安裝了核心之後,還需要設定核心具備資料包的轉發能力。需要在rc.conf中設定gateway_enable 的值為YES,這樣就能在系統啟動時自動開啟包轉發能力。也可以直接執行下面命令來開啟核心包轉發能力。

    # sysctl -w net.inet.ip.forwarding=1

    net.inet.ip.forwarding: 0 -> 1

      

  • ipfw過濾規則

      IPFIREWALL的過濾規則是由ipfw命令來設定的,例如下面的規則允許所有127.0.0.1的資料傳輸。

    # /sbin/ipfw add 1000 pass all from 127.0.0.1 to 127.0.0.1

      ipfw命令中,首先指定對這個規則的處理方式,ipfw add為向核心中的過濾規則中新增,此外,ipfw delete用於刪除一條規則,ipfw list用於顯示當前定義的所有過濾規則,ipfw flush將清除所有的過濾規則,而ipfw file用於從檔案file中讀取定義的過濾規則。

      此外,ipfw定義的規則都有自己的序號,其序號可以在處理方式之後指定,如ipfw delete 1000 就是刪除第1000條過濾規則,核心中可以同時支援65535條過濾規則。有時可以不使用規則的序號,那麼ipfw 就處理當前規則,而處理過一次規則之後,就立即將當前規則序號增加100,這樣就對於新增過濾規則時十分方便,不必指定序號,ipfw add將每隔100新增一條過濾規則。

      每個過濾規則中,要首先給出這條規則的處理指令,allow指令(或者使用同義詞pass, permit,accept)為許可某類資料包透過;deny指令(或同義詞drop)為不允許某類資料包透過,將該類資料包丟棄; reject指令與deny指令有所不同,但它不是簡單的將資料包丟棄,而是在丟棄原有資料包的同時,回應ICMP host unreachable,通知傳送計算機不能透過它與目的計算機進行通訊,這樣就免得發起連線請求的計算機一直髮送連線請求,造成不必要的資料流量。使用count指令能對該類資料包進行簡單記數,這個功能主要用於對網路使用進行記帳。log指令用於將連線傳送到系統的日誌記錄中。

      其中count和log指令與其他指令不同,其他指令都是對資料包進行處理的指令,因此每個資料包只要匹配這個指令,就立即將資料包或轉發,或丟棄,不再進行其他處理,而count和log只是記錄指令,只是將記錄下這個資料包,而資料包本身還將繼續受到其他過濾規則的處理。

      過濾規則的第二部分是規定資料包的協議型別,指定規則是用於處理哪種資料包的,FreeBSD可以處理TCP,UCP,ICMP 型別的資料,以及在/etc/protocols檔案中定義的其他資料包的型別,上例中使用all ,匹配所有型別的資料包。對於TCP或UDP,還可以在後面定義地址時指定應用的埠號(可以使用數字或/etc/services 中定義埠名字),進一步增加過濾能力。

      過濾規則的第三部分是規定過濾規則適用的地址範圍,這可以透過指定源和目的計算機的IP地址範圍或資料包透過的網路介面來進行指定。

  • 用from規定資料包的來源地址,可以是主機地址或網路;
  • 用to規定資料包的目的地址,可以是主機地址或網路;
  • 用in或out規定資料包是流向本機,還是向外傳送的;
  • 用via、recv、xmit規定資料包經過、接收、傳送的網路介面,rece可以是接收本地傳送的資料包,而xmit一定是向外傳送,因此應該和out選項合用;

      例如:遮蔽任何來自192.168.1.5的資料的指令為:

    # ipfw add deny all from 192.168.1.5

      而許可來自192.168.1.0網路上的遠端登入的指令為:

    # ipfw add allow tcp from 192.168.1.0/24 telnet

      應用過濾規則的順序是按照過濾規則的序號,從小到大進行匹配,一旦一個資料包匹配一個過濾規則,就立即按照該規則轉發或丟棄,不再需要繼續考慮以下的規則(count和log規則除外)。因此在前面的例子中,192.168.1.5 就不能使用telnet連線,因為首先碰到的是不允許的規則,如果兩個命令次序相反,則它就能夠進行telnet連線。

      最後一條過濾規則,第65535條規則,預設被設為”deny all from any to any”時,為不允許對任何連線,此時在沒有定義其他規則之前,不允許所有的網路連線。但是編譯核心時使用IPFIREWALL_DEFAULT_TO_ACCEPT 選項,就能將這條規則改為”allow all from any to any”,允許轉發不符合其他規則的所有資料。這兩種不同的設定屬於兩種不同的考慮方式,一種適用於安全性要求較高的系統中,預設情況不允許外界連線,另一種主要限制部分節點的訪問,預設情況允許任意網路連線,普通系統使用這樣的設定更多些。

    • rc.firewall

      當啟動了系統的包過濾能力之後,就需要在系統啟動時將這些過濾規則自動載入核心,可以將這些新增過濾規則的指令寫入啟動檔案rc.local或者其他啟動檔案中。但系統的啟動檔案中本來就具備載入這些過濾規則的相關啟動檔案 rc.firewall,這個檔案中根據防火牆的基本要求,設定了常用的過濾規則,可以減輕防火牆管理員的設定工作。

      為了讓系統執行rc.firewall中的設定,需要在rc.conf中設定引數firewall為YES,以及設定firewall_type的值,這個引數值將傳遞給rc.firewall,使rc.firewall執行不同的設定。一般情況下可以將firewall_type設定為open,對網路訪問不進行限制,而client主要用於計算機不對外提供網路服務,保護本計算機只用於訪問外部系統而拒絕所有的訪問請求,設定為simple則定義了簡單的防火牆規則,可以使用這臺計算機保護防火牆內部的計算機,這三個選項比較常用。下面為預設rc.firewall 中的有關過濾規則的設定。

  • 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-944601/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章