转贴自: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) 就予以抵擋等等。 這些就是最主要的防火牆功能了! 所以鳥哥認為,防火牆最重要的任務就是在規劃出:
除了以軟體及硬體作為防火牆的分類之外,我們也可以使用
防火牆對於資料封包的取得方式來進行分類。主要可以分為兩大類, 分別是
代理伺服器 (Proxy) 以及 IP Filter。在代理伺服器方面, 由名稱我們就可以知道,代理伺服器僅是代理 Client 端去向 Internet 要求資料,所以 Proxy 其實已經將可代理的協定限制的很少很少,並且由於內部與外部電腦的並不能直接互通, 所以可以達到良好的保護效果;另一種則是上面提到的 IP fileter 啦!利用封包過濾的方式來達到防火牆的目的!
由前面的說明當中,您應該可以瞭解到一件事,那就是防火牆除了可以『
保護防火牆機制 (iptables) 本身所在的那部主機』之外,還可以『
保護防火牆後面的主機或 PC』。呵呵! 也就是說,防火牆除了可以防備主機被入侵之外,
他還可以架設在路由器上面藉以控管進出本地端網域 (LAN) 的網路封包。 這種規劃對於內部私有網域的安全也有一定程度的保護作用呢!底下我們稍微談一談目前常見的防火牆配置吧:
什麼?!設定防火牆之後還不安全啊?!那當然啦!誰說設定了防火牆之後您的系統就一定安全? 防火牆雖然可以防止不受歡迎的封包進入我們的網路當中,不過,某些情況下, 他並不能保證我們的網路一定就很安全。舉幾個例子來談一談:
上面談了這麼多,主要還是希望您能瞭解到防火牆是什麼這個議題!而且也希望您知道防火牆並非萬能的。 好了,那麼底下我們終於可以來瞧一瞧,那目前我們的 2.6 版這個 Linux 核心到底使用什麼核心功能來進行防火牆設定?
Linux 的防火牆為什麼功能這麼好?這是因為他本身就是由 Linux kernel 所提供, 由於直接經過核心來處理,因此效能非常好!不過,不同核心版本所使用的防火牆軟體是不一樣的! 因為核心支援的防火牆是逐漸演進來的嘛!
前面的幾個小節裡面我們一直談到:『防火牆規則』,咦!啥是規則啊?因為 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 的封包都給他丟棄,就這三個規則來說,您要如何設定防火牆檢驗順序呢?
理論上,當你安裝好 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 』來觀察,不過,該指令所顯示的資訊其實還是不太足夠的。 這個時候,我們其實可以使用底下的兩個指令來將目前主機上面的防火牆機制『儲存』下來, 在下次想要將這個規則『回復』的時候,就能夠直接利用指令將規則直接回復喔!
除了 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 是什麼呢?簡單的說,你可以稱他為內部 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 的實際運作之前,讓我們再來看一下比較簡單的封包透過 iptables 而傳送到後端主機的流程(請往前參考
圖八)。當網路佈線如
圖二的架構, 若內部 LAN 有任何一部主機想要傳送封包出去時,那麼這個封包要如何透過 Linux 主機而傳送出去? 他是這樣的:
在 Linux 的 NAT 主機服務當中,最常見的就是類似
圖二的 IP 分享器功能了。 而由剛剛的介紹你也該知道,這個 IP 分享器的功能其實就是 SNAT 啦!作用就只是在 iptables 內的 NAT 表格當中,那個路由後的 POSTROUTING 鏈進行 IP 的偽裝就是了。另外, 你也必須要瞭解,你的 NAT 主機必須要有一個 public IP 介面,以及一個內部 LAN 連接的 private IP 介面才行。
同樣的,我的假設是這樣的:
如果你剛剛已經下載了 iptables.rule ,那麼該檔案內已經含有 NAT 的腳本了! 你可以看到該檔案的 第二部份關於 NAT 主機的部分,應該有看到底下這幾行:
如果你剛剛在
iptables.rule 內的
第二部分有仔細看的話, 那有沒有覺得很奇怪,為何我們需要載入一些有用的模組?舉例來說, ip_nat_ftp 及 ip_net_irc ? 這是因為很多通訊協定使用的封包傳輸比較特殊,尤其是 FTP 檔案傳輸使用到兩個 port 來處理資料! 這個部分我們會在 FTP 章節再次的詳談,在這裡你要先知道,我們的 iptables 提供很多好用的模組, 這些模組可以輔助封包的過濾用途,讓我們可以節省很多 iptables 的規則擬定, 好棒的吶! ^_^
既然可以做 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.

2033

被折叠的 条评论
为什么被折叠?



