转贴自:http://linux.vbird.org/linux_server/0250simple_firewall.php
本網頁主要以 firefox 配合解析度 1024x768 作為設計依據
http://linux.vbird.org is designed by VBird during 2001-2007. Aerosol Lab.
最近更新日期:2006/11/08
1. 本章的行前準備工作
2. 認識防火牆 2.1 為何需要防火牆 2.2 Linux 系統上防火牆的主要類別 2.3 防火牆的一般線路佈線與抵擋技巧 2.4 防火牆的使用限制 3. Linux 的封包過濾機制: iptables 3.1 不同 Linux 核心版本的防火牆軟體 3.2 iptables 的表格與封包進入流程 3.3 本機的 iptables 語法 規則的清除與觀察 定義預設政策 (policy) 封包的基礎比對 IP/netmask I/O 裝置 TCP, UDP 的規則比對 狀態模組:MAC 與 RELATED ICMP 封包規則的比對 3.4 防火牆的記錄、回復與測試 3.5 IPv4 的核心管理功能:/proc/sys/net/ipv4/* 4. 本機防火牆的一個實例 4.1 規則草擬 4.2 實際設定 5. NAT 主機的設定 5.1 什麼是 NAT? SNAT? DNAT? 5.2 最陽春 NAT 主機: IP 分享功能 5.3 iptables 的額外核心模組功能 5.4 在防火牆後端之網路伺服器 DNAT 設定 6. 重點回顧 7. 課後練習 8. 參考資料 9. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?p=114475 本章的行前準備工作
由於這個章節裡面談到非常多的封包概念,包括
MAC,
IP,
TCP,
UDP,
ICMP 等協定, 以及如何抵擋外部 IP 來源的防火牆基礎,還有 IP/netmask 的整體網域寫法等等。 而鳥哥對於您學習防火牆的建議是希望你可以使用 shell script 來撰寫腳本,如此一來可以讓你的防火牆規則比較清晰一點。所以在您開始瞭解底下的資料之前, 希望你可以先閱讀過相關的資料了:
認識防火牆
網路安全除了隨時注意套件的漏洞,以及網路上的安全通報之外,你最好能夠依據自己的環境來訂定防火牆機制, 這樣對於你的網路環境,會比較有保障一點喔!那麼什麼是防火牆呢? 其實
防火牆就是在管制進入到我們網域內的主機(或者可以說是網域)的資料封包的一種機制, 例如我們在前一章節
認識網路安全當中提到的 iptables 就是一種防火牆機制了。當然了,更廣義的來說,
只要能夠分析與過濾進出我們管理之網域的封包資料,就可以稱為防火牆。
而這個防火牆又可以分為硬體防火牆與本機的軟體防火牆。硬體防火牆是由廠商設計好的主機硬體, 這部硬體防火牆內的作業系統主要以提供封包資料的過濾機制為主,並將其他的功能拿掉。因為單純作為防火牆功能而已, 因此封包過濾的速度與效率較佳。至於軟體防火牆呢?那就是我們這個章節要來談論的啊! 軟體防火牆本身就是在保護系統網路安全的一套軟體(或稱為機制),例如 iptables 與 TCP Wrappers 都可以稱為軟體防火牆。 無論怎麼分,反正防火牆就是用來保護我們網路安全的咚咚就對啦!呵呵!我們這個章節主要在介紹 Linux 系統本身提供的軟體防火牆的功能,那就是 iptables 。至於 TCP Wrappers 請前往基礎篇的 認識系統服務 參考參考喔! 為何需要防火牆
基本上,如果你的系統
(1)已經關閉不需要而且危險的服務; (2)已經將整個系統的所有套件都保持在最新的狀態; (3)權限設定妥當且定時進行備份工作; (4)已經教育使用者具有良好的網路、系統操作習慣。 那麼你的系統實際上已經頗為安全了!要不要架設防火牆?那就見仁見智囉!
不過,畢竟網路的世界是很複雜的,而 Linux 主機也不是一個簡單的東西, 說不定哪一天你在進行某個軟體的測試時,主機突然間就啟動了一個網路服務, 如果你沒有管制該服務的使用範圍,那麼該服務就等於對所有 Internet 開放, 那就麻煩了!因為該服務可能可以允許任何人登入你的系統,那不是挺危險? 所以囉,防火牆能作什麼呢? 防火牆最大的功能就是幫助你『限制某些服務的存取來源』! 舉例來說: (1)你可以限制檔案傳輸服務 (FTP) 只在子網域內的主機才能夠使用,而不對整個 Internet 開放; (2)你可以限制整部 Linux 主機僅可以接受客戶端的 WWW 要求,其他的服務都關閉; (3)你還可以限制整部主機僅能主動對外連線,對我們主機主動連線的封包狀態 (TCP 封包的 SYN flag) 就予以抵擋等等。 這些就是最主要的防火牆功能了! 所以鳥哥認為,防火牆最重要的任務就是在規劃出:
Linux 系統上防火牆的主要類別
除了以軟體及硬體作為防火牆的分類之外,我們也可以使用
防火牆對於資料封包的取得方式來進行分類。主要可以分為兩大類, 分別是
代理伺服器 (Proxy) 以及 IP Filter。在代理伺服器方面, 由名稱我們就可以知道,代理伺服器僅是代理 Client 端去向 Internet 要求資料,所以 Proxy 其實已經將可代理的協定限制的很少很少,並且由於內部與外部電腦的並不能直接互通, 所以可以達到良好的保護效果;另一種則是上面提到的 IP fileter 啦!利用封包過濾的方式來達到防火牆的目的!
防火牆的一般線路佈線與抵擋技巧
由前面的說明當中,您應該可以瞭解到一件事,那就是防火牆除了可以『
保護防火牆機制 (iptables) 本身所在的那部主機』之外,還可以『
保護防火牆後面的主機或 PC』。呵呵! 也就是說,防火牆除了可以防備主機被入侵之外,
他還可以架設在路由器上面藉以控管進出本地端網域 (LAN) 的網路封包。 這種規劃對於內部私有網域的安全也有一定程度的保護作用呢!底下我們稍微談一談目前常見的防火牆配置吧:
防火牆的使用限制
什麼?!設定防火牆之後還不安全啊?!那當然啦!誰說設定了防火牆之後您的系統就一定安全? 防火牆雖然可以防止不受歡迎的封包進入我們的網路當中,不過,某些情況下, 他並不能保證我們的網路一定就很安全。舉幾個例子來談一談:
Linux 的封包過濾機制:iptables
上面談了這麼多,主要還是希望您能瞭解到防火牆是什麼這個議題!而且也希望您知道防火牆並非萬能的。 好了,那麼底下我們終於可以來瞧一瞧,那目前我們的 2.6 版這個 Linux 核心到底使用什麼核心功能來進行防火牆設定?
不同 Linux 核心版本的防火牆軟體
Linux 的防火牆為什麼功能這麼好?這是因為他本身就是由 Linux kernel 所提供, 由於直接經過核心來處理,因此效能非常好!不過,不同核心版本所使用的防火牆軟體是不一樣的! 因為核心支援的防火牆是逐漸演進來的嘛!
iptables 的表格與封包進入流程
前面的幾個小節裡面我們一直談到:『防火牆規則』,咦!啥是規則啊?因為 iptables 是利用封包過濾的機制, 所以他會分析封包的表頭資料。根據表頭資料與定義的『規則』來決定該封包是否可以進入主機或者是被丟棄。 意思就是說:『
根據封包的分析資料 "比對" 你預先定義的規則內容, 若封包資料與規則內容相同則進行動作,否則就繼續下一條規則的比對!』 重點在那個『比對與分析順序』上。
舉個簡單的例子,假設我預先定義 10 條防火牆規則好了,那麼當 Internet 來了一個封包想要進入我的主機, 那麼防火牆是如何分析這個封包的呢?我們以底下的圖示來說明好了: 圖五、封包過濾的規則動作及分析流程 當一個網路封包要進入到主機之前,會先經由 NetFilter 進行檢查,那就是 iptables 的規則了。 檢查通過則接受 (ACCEPT) 進入本機取得資源,如果檢查不通過,則可能予以丟棄 (DROP) ! 上圖五主要的目的在告知您:『規則是有順序的』!例如當網路封包進入 Rule 1 的比對時, 如果 比對結果符合 Rule 1 ,此時這個網路封包就會進行 Action 1 的動作,而不會理會後續的 Rule 2, Rule 3.... 等規則的分析了。 而如果這個封包並不符合 Rule 1 的比對,那就會進入 Rule 2 的比對了!如此一個一個規則去進行比對就是了。 那如果所有的規則都不符合怎辦?此時就會透過預設動作 (封包政策, Policy) 來決定這個封包的去向。 所以啦, 當您的規則順序排列錯誤時,就會產生很嚴重的錯誤了。 怎麼說呢?讓我們看看底下這個例子: 假設您的 Linux 主機提供了 WWW 的服務,那麼自然就要針對 port 80 來啟用通過的封包規則,但是您發現 IP 來源為 192.168.100.100 老是惡意的嘗試入侵您的系統,所以您想要將該 IP 拒絕往來,最後,所有的非 WWW 的封包都給他丟棄,就這三個規則來說,您要如何設定防火牆檢驗順序呢?
本機的 iptables 語法
理論上,當你安裝好 Linux 之後,系統應該會主動的幫你啟動一個陽春的防火牆規則才是。 不過如果您是依照鳥哥的建議來安裝 Linux 時,那麼安裝完畢後,你的系統應該是沒有防火牆的啦。 另外,某些早期的版本 (例如 Red Hat 9) 本身同時提供 iptables 及 ipchains 這兩個防火牆模組, 不過這兩個模組是無法同時存在的!所以你僅能啟動其中一個,那當然是啟動 iptables 才對啊! 如果不小心啟動了 ipchains 的話 (新版的 Linux 都不會有這個困擾) ,那請使用 rmmod 來移除吧!
不過,在開始進行底下的練習之前,鳥哥這裡有個很重要的事情要告知一下。 因為 iptables 的指令會將網路封包進行過濾及抵擋的動作,所以 請不要在遠端主機上進行防火牆的練習,因為您很有可能一不小心將自己關在家門外! 盡量在本機前面登入 tty1-tty6 終端機進行練習,否則常常會發生悲劇啊! 鳥哥以前剛剛在玩 iptables 時,就常常因為不小心規則設定錯誤,導致常常要請遠端的朋友幫忙重新開機... 剛剛提到咱們的 iptables 至少有三個預設的 table (filter, nat, mangle),較常用的是本機的 filter 表格, 這也是預設表格啦。另一個則是後端主機的 nat 表格,至於 mangle 較少使用,所以這個章節我們並不會討論 mangle。 由於不同的 table 他們的鏈不一樣,導致使用的指令語法或多或少都有點差異。 在這個小節當中,我們主要將針對 filter 這個預設表格的三條鏈來做介紹。底下就來玩一玩吧!
防火牆的記錄、回復與測試
剛剛上面我們談了很多的設定了,那麼我該如何觀察目前主機上面的防火牆規則呢? 我們可以使用『iptables -L -n 』來觀察,不過,該指令所顯示的資訊其實還是不太足夠的。 這個時候,我們其實可以使用底下的兩個指令來將目前主機上面的防火牆機制『儲存』下來, 在下次想要將這個規則『回復』的時候,就能夠直接利用指令將規則直接回復喔!
IPv4 的核心管理功能: /proc/sys/net/ipv4/*
除了 iptables 這個防火牆軟體之外,其實咱們 Linux kernel 2.6 提供很多核心預設的攻擊抵擋機制喔! 由於是核心的網路功能,所以相關的設定資料都是放置在 /proc/sys/net/ipv4/ 這個目錄當中。 至於該目錄下各個檔案的詳細資料,可以參考核心的說明文件:
有興趣的話應該要自行去查一查比較好的喔!我們底下就拿幾個簡單的檔案來作說明吧!
本機防火牆的一個實例
介紹了這麼多的防火牆語法與相關的注意事項後,終於要來架設防火牆了。如同前面談到的, 你當然可以使用 iptables-save 的語法將相關的防火牆規則轉存到 /etc/sysconfig/iptables 去, 然後透過 iptables-restore 或者是重新啟動 iptables 來啟用你的新防火牆規則。 不過鳥哥還是比較習慣使用 shell script 來撰寫防火牆規則,而且此一特色還可以用在呼叫其他的 scripts , 可以讓防火牆規則具有較為靈活的使用方式。好了,那就來談談如何設定咱們的防火牆規則吧!
規則草擬
鳥哥底下介紹的這個防火牆,其實可以用來作為路由器上的防火牆,也可以用來作為本機的防火牆。 假設硬體連線如同
圖二所示那樣的環境, Linux 主機本身也是內部 LAN 的路由器! 亦即是一個簡單的 IP 分享器的功能啦!假設鳥哥網路介面有底下這些:
圖九、防火牆規則的流程 原則上,內部 LAN 主機與主機本身的開放度很高,因為 Output 與 Forward 是完全開放不理的!對於小家庭的主機是可以接受的,因為我們內部的電腦數量不多,而且人員都是熟悉的, 所以不需要特別加以控管!但是:『 在大企業的內部,這樣的規劃是很不合格的, 因為您不能保證內部所有的人都可以按照您的規定來使用 Network !』也就是說『家賊難防』呀! 因此,連 Output 與 Forward 都需要特別加以管理才行! 實際設定
事實上,我們在設定防火牆的時候,不太可能會一個一個指令的輸入,通常是利用 shell scripts 來幫我們達成這樣的功能吶!底下是利用上面的流程圖所規劃出來的防火牆 scripts,您可以參考看看, 但是您需要將環境修改成適合您自己的環境才行喔!
不過,還是如同前面我們所說的,這個 firewall 僅能提供基本的安全防護,其他的相關問題還需要再測試測試呢! 此外,如果你希望一開機就自動執行這個 script 的話,請將這個檔案的完整檔名寫入 /etc/rc.d/rc.local 當中,有點像底下這樣:
這就是一個最簡單、陽春的防火牆。同時,這個防火牆還可以具有最陽春的 IP 分享器的功能呢! 也就是在 iptables.rule 這個檔案當中的第二部分了。 這部分我們在下一節會再繼續介紹的。 NAT 主機的設定
呼呼!終於來到這個地方了!我們準備要架設一個
路由器的延伸伺服器,就稱之為 NAT 主機。 NAT 是什麼呢?簡單的說,你可以稱他為內部 LAN 主機的『 IP 分享器』啦!
NAT 的全名是 Network Address Translation,字面上的意思是『網路位址的轉換』。由字面上的意思我們來想一想, TCP/IP 的網路封包不是有 IP 位址嗎?那 IP 位址不是有來源與目的嗎?我們的 iptables 指令就能夠修改 IP 封包的表頭資料, 嘿嘿!連目標或來源的 IP 位址都可以修改呢!甚至連 TCP 封包表頭的 port number 也能修改!真是有趣! NAT 主機的功能可以達到類似 圖二所介紹的類似 IP 分享的功能之外, 還可以達到類似 圖四所介紹的 DMZ (非軍事區) 的功能!這完全取決於我們的 NAT 是修改: (1)來源 IP 還是 (2)目標 IP !底下我們就來聊一聊吧! ^_^ 什麼是 NAT? SNAT? DNAT?
在談到 NAT 的實際運作之前,讓我們再來看一下比較簡單的封包透過 iptables 而傳送到後端主機的流程(請往前參考
圖八)。當網路佈線如
圖二的架構, 若內部 LAN 有任何一部主機想要傳送封包出去時,那麼這個封包要如何透過 Linux 主機而傳送出去? 他是這樣的:
最陽春 NAT 主機: IP 分享功能
在 Linux 的 NAT 主機服務當中,最常見的就是類似
圖二的 IP 分享器功能了。 而由剛剛的介紹你也該知道,這個 IP 分享器的功能其實就是 SNAT 啦!作用就只是在 iptables 內的 NAT 表格當中,那個路由後的 POSTROUTING 鏈進行 IP 的偽裝就是了。另外, 你也必須要瞭解,你的 NAT 主機必須要有一個 public IP 介面,以及一個內部 LAN 連接的 private IP 介面才行。
同樣的,我的假設是這樣的:
如果你剛剛已經下載了 iptables.rule ,那麼該檔案內已經含有 NAT 的腳本了! 你可以看到該檔案的 第二部份關於 NAT 主機的部分,應該有看到底下這幾行:
iptables 的額外核心模組功能
如果你剛剛在
iptables.rule 內的
第二部分有仔細看的話, 那有沒有覺得很奇怪,為何我們需要載入一些有用的模組?舉例來說, ip_nat_ftp 及 ip_net_irc ? 這是因為很多通訊協定使用的封包傳輸比較特殊,尤其是 FTP 檔案傳輸使用到兩個 port 來處理資料! 這個部分我們會在 FTP 章節再次的詳談,在這裡你要先知道,我們的 iptables 提供很多好用的模組, 這些模組可以輔助封包的過濾用途,讓我們可以節省很多 iptables 的規則擬定, 好棒的吶! ^_^
在防火牆後端之網路伺服器 DNAT 設定
既然可以做 SNAT 的 IP 分享功能,我們當然可以使用 iptables 做出 DMZ 啦! 但是再次重申,不同的伺服器封包傳輸的方式可能有點差異,因此,建議新手不要玩這個咚咚! 否則很容易導致某些服務無法順利對 Internet 提供的問題。
先來談一談,如果我想要處理 DNAT 的功能時, iptables 要如何下達指令? 另外,你必須要知道的是, DNAT 用到的是 nat table 的 Prerouting 鏈喔!不要搞錯了。
重點回顧
課後練習
參考資料
2002/08/20:第一次完成日期! 2003/08/25:重新設計內容,改寫一些指令介紹,與前一篇『認識網路安全』 分的比較完整一點! 2006/09/06:將舊的文章移動到此處 2006/09/11:拿掉了已經在基礎篇有介紹過的 認識服務之 TCP Wrappers。 2006/09/13:加入 NAT 的說明了,將舊的 NAT 主機移動到 此處。 2006/09/15:將 iptables.rule 的連結貼上去了!之前忘記修改該檔案了~ 2006/11/08:因為 PPPoE 撥接與 Ethernet 的 MTU 不同,可能在某些情況下會導致使用者無法連線,更新了 iptables.rule 了。 2002/08/20以來統計人數 | ||||||||||||||||||||||||||||||||||
http://linux.vbird.org is designed by VBird during 2001-2007. Aerosol Lab.