幾年以前,我以前的一個大學老師准備利用Microsoft的一台大型贈品設備來組建一個實驗室。希望把這個實驗室建成某種供學生和職工使用的地方,讓他們擁有學院系統(Faculty System)的系統管理員所給予他們的更高的權限。Inte .net 編程(Web,分布式操作系統
幾年以前,我以前的一個大學老師准備利用Microsoft的一台大型贈品設備來組建一個實驗室。希望把這個實驗室建成某種供學生和職工使用的地方,讓他們擁有學院系統(Faculty System)的系統管理員所給予他們的更高的權限。Inte
.net編程(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上建立一個帶有過濾功能的網橋。操作系統和過濾系統都被證實是十分穩定和通用的,並且帶過濾功能的網橋是非常有用的增加安全性,或者臨時堵住安全漏洞的方法。