FreeBSD上用IP Filter進行橋過濾(轉)

gugu99發表於2007-08-11
FreeBSD上用IP Filter進行橋過濾(轉)[@more@]

  幾年以前,我以前的一個大學老師準備利用Microsoft的一臺大型贈品裝置來組建一個實驗室。希望把這個實驗室建成某種供學生和職工使用的地方,讓他們擁有學院系統(Faculty System)的系統管理員所給予他們的更高的許可權。Internet程式設計(Web,分散式作業系統等)教學也計劃在這裡進行。這個老師的一個願望就是不用防火牆將這個實驗室進行隔離,從而使學生們可以訪問全世界的站點。很明顯 ,他不懂Internet安全。

  在那段時間中,這個實驗室簡直就變成了一些學生(他們中的大多數已經離開學校,有的去了Redmond)的遊樂場,他們玩虛擬競技場(Unreal Tournament),播放吵人的音樂。學院對此十分不滿,希望能夠對其重新進行控制。因此他們叫我接管這裡。畢竟,我是Unix/Linux的忠實擁護者,因此我必須知道我要談論些什麼。我接下了這個任務,不料竟然會見到一個爛攤子。一些機器被用來做warez,或者被病毒或其他亂七八糟的東西感染。還有一臺機器被人在很多年前就取得了root許可權。(諷刺的是,那是一臺Linux機器,而不是Microsoft的,這臺機器從來都沒有采取過安全措施,實驗室管理員的弟弟在上面放了一個rootkit。當我們發現之後,將它換成了FreeBSD,而root密碼由我們自己保管,從此以後那臺機器再也沒有被入侵過。)

  現在,這個實驗室裡由10臺Windows XP機器和一臺FreeBSD機器,而且對Internet完全開放。沒有任何備份(有一臺磁帶機,但是通常裡面都是同一盤磁帶),沒有統一的登入口令,Unix和Windows之間沒有共享的Home目錄,沒有任何安全措施。我的任務就是:將它變得安全,並且將這個實驗室變成研究生為自己的專案工作的地方,在這些機器中安裝一些Linux,Mac OS X和FreeBSD。

  我首先想到的是安裝某種防火牆,使實驗室遠離那些外界的潛在威脅,而又不對實驗室的使用者進行過多的限制。幾個星期以前,我安裝了我的第一個ipfilter防火牆,並且設定了NAT和其他東西,總共只花費了幾個小時的時間。雖然我很清楚的知道荷蘭的Unix社群是Linux的狂熱支持者,但是我覺得FreeBSD加ipfilter(或者OpenBSD加packetfileter)比Linux防火牆更容易配置。Linux防火牆的規則與ipfilter的規則比起來過於複雜和模糊,因此FreeBSD加ipfilter成為我的首選。

  或許正如你所知道的那樣,ipfilter支援防火牆和NAT功能,因此我的第一個選擇就是使用外部IP地址,給所有機器一個私有網段的IP地址(比如10.0.0.x),NAT和過濾所有東西,並且我在一個小時內完成了這項工作。不幸的是,學院管理員不希望那樣做。他們的理由是,如果有人從Internet上入侵到我們實驗室的某臺機器,那麼我們將NAT到整個實驗室,這樣會對尋找被攻擊的機器增加難度。所以所有機器必須保留他們所分配的IP地址。

  但是,你如何象那樣設定?很明顯,你可以使用普通的NAT。那麼,你怎麼為你的防火牆分配IP地址和網路標誌(Netmask)呢?解決的辦法就是網橋。網橋將兩個網段連結在一起,並且使他們看上去象一個網路。因此,最基本的,你可以把資料包從一個網段複製到另外一個網段。那麼,為什麼不在他們之間放置一個過濾器,從而構建一個帶有過濾功能的網橋呢?帶有過濾功能的網橋使在不改變網路設定的情況下對資料包進行過濾變成可能,還可以避免重新鋪設線路。帶過濾功能的網橋也被認為是一個透明的過濾器。

  FreeBSD透過ipfw對構建帶有過濾功能的網橋提供了很好的支援,並且已經有很多很好的關於這方面的指南。但是,我對ipfilter十分著迷。FreeBSD 4-STABLE分支並不正式支援ipfilter上帶過濾功能的網橋(但在5-CURRENT中是標準設定)。但是已經有4-STABLE上的補丁,並且我認為比我見過的穩定發行版更好。

  我在一臺老PC上安裝了FreeBSD 4.6(包含kernel程式碼),下載了補丁,將它們進行了應用,並且編譯了一個新核心。我在核心配置中新增了如下選項:

  options BRIDGE

  options IPFILTER

  我去掉了其他大多數選項。在重建一個新核心之後,我重啟了機器。在啟動前,我輸入了下面的sysctl命令(當然,也把它們放進了/etc/sysctl.conf):

  sysctl net.link.ether.bridge_cfg=xl0:0,xl1:0

  sysctl net.link.ether.bridge_ipf=1

  sysctl net.link.ether.bridge=1

  現在,我已經擁有了一個帶ipfilter過濾功能的網橋(在xl0和xl1之間進行設定),但是它還沒有被配置來進行任何過濾。

  接著就是設定過濾規則。第一步是在/etc/rc.conf中啟用ipfilter:

  ipfilter_enable="YES"

  我把ipfilter的規則放到/etc/ipf.rules,因此我只需要進行這一點點更改。

  我將xl0作為對外連線介面,把xl1作為內部連線介面。我的規則很簡單:禁止所有從外部訪問工作站的操作,允許一部分外部服務的對內訪問(SSH,HTTP,MS Terminal Server connections),但是不對實驗室的內部使用者進行限制。

  pass in quick on xl0 proto tcp from any to 131.211.83.40 port = 22 flags S keep state

  pass in quick on xl0 proto tcp from any to 131.211.83.40 port = 80 flags S keep state

  pass in quick on xl1 proto tcp from any to any keep state

  pass in quick on xl1 proto udp from any to any keep state

  pass in quick on xl1 proto icmp from any to any keep state

  block in on xl0 from any to 131.211.83.40

  [more hosts go here]

  所有來自內網的通訊都被允許透過(保持原有狀態不變)。除了很少的幾種連線(SSH和HTTP)以外,其他來自外部的通訊都被禁止掉。我只允許那些帶有SYN標記或者是已獲允許的回話的一部分的資料包透過。

  除了我忘記把FTP放到允許回話的行列以外,幾乎所有機制都執行得很好。FTP是一種十分危險的協議。FTP(至少變數被稱作“active”)總是嘗試在20埠(ftp-data)建立一個從伺服器到客戶端的連線。在上面的規則當中,開啟FTP是不可能的。我們必須加入下面的規則:

  pass in quick on xl0 proto tcp from any to 131.211.83.40 port = 20 flags S keep state

  在一個“普通”的NAT設定中,你可以為FTP建立一個代理。但因為這不是NAT設定,因此,不可能使用代理。現在,除了WinAmp外,所有東西都工作得很好。

  應該考慮的問題

  在你開始使用ipfilter的帶有過濾功能的網橋之前,必須考慮下面的問題:

  4-STABLE的補丁被作者標識為“風險自負”(Use At Your Own Risk)。我在FreeBSD 4.6上成功使用了,但是它可能在新版本上無法工作。

  不能進行NAT。請記住,這個網橋無論如何都沒有自己的IP,因此它不能進行NAT。這也意味著你不能使用埠對映(Redirection of Ports)和代理(比如FTP代理)。

  我使用的“out”關鍵字並沒有起作用。

  return-rst選項(它拒絕一個連線,而不是使它超時)也不起作用,return-icmp-as-dest也一樣(這兩個選項在ipfilter HOWTO 3.6節中有描述)

  結論

  我發現在FreeBSD和ipfilter上建立一個帶有過濾功能的網橋。作業系統和過濾系統都被證實是十分穩定和通用的,並且帶過濾功能的網橋是非常有用的增加安全性,或者臨時堵住安全漏洞的方法。

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

相關文章