封包過濾就是用一個軟體查看所流經封包之標頭(header) ﹐由此決定整個封包的命運。它或許會決定 丟棄(DROP) 這個封包(例如﹐忽略它就如根本沒收到它一樣)﹐或是接收(ACCEPT)這個封包(例如﹐讓這個封包通過)﹐或是其它更複雜的動作。
在 Linux 之下﹐封包過濾功能是內建於核心之內(做為一個核心模組﹐或者直接內建)﹐同時還有一些技巧我們可以運用於封包之上的﹐不過最慣用的依然是查看標頭以決定封包的命運。
簡而言之﹕控制、保安、警戒。
當您用您的 Linux 主機將您的內部網路連接至其它網路(比方說﹐ineternet)的時候﹐您有機會允許特定類型的交通﹐而禁止其它的。 例如﹐一個封包的標頭會包含封包的目的地地址﹐所以您可以防止封包流向外部網路的某一部份。再如﹐我用 Netscape 連線至 Dilbert archives﹐那網頁上有一個來自 doubleclick.net 的廣告﹐這樣 Netscape 會浪費我的時間去下載它們。只要讓封包過濾機制不允許任何來自doubleclick.net 的封包﹐我們就可以解決這個問題(當然﹐有更好的方法來做這件事情啦﹐請參考 Junkbuster)。
當您的 Linux 主機是您井然有序的內部網路和外面那個混沌無比的 internet 之間的唯一通道﹐而您知道可以限制哪些東西才能進入您的門戶﹐誠是不錯之舉吧。例如﹐您或許會放行任何從內部網路出去的東西﹐但又擔心來自外面的惡名昭章的‘Ping of Death’。又如﹐您或許並不希望別人從外面 telnet 上您的 Linux 主機﹐盡管全部的帳號都有密碼保護。或許﹐您還想(正如大部份人一樣)在 internet 上當看客而不願當伺服器(也可能您是願意的) ﹐最簡單莫如用封包過濾來拒絕任何意欲連線的封包﹐不讓任何人連進來。
有時候﹐一台設定差劣的機器會從本地網路向外面嘔送封包。而好消息是您可以讓封包過濾來告訴您是否有變態的事情發生。您或許會對之採取行動﹐又或許早已見慣不怪了。
Linux 的核心自從 1.1 版就已經有封包過濾功能。第一代是 1994 年由 Alan Cox 基於 BSD 的 ipfw 移植過來的﹐後來在 Linux 2.0 版本再由 Jos Vos 加強﹐利用 ' ipfwadm ' 這隻使用者空間(userspace *)工具來控制核心的過濾規則。在 1998 年年中﹐我在 Micahel Neuling 的大力幫助下﹐投注了相當的精力在 Linux 核心 2.2 上面﹐推出了 ' ipchains ' 這隻工具。終於﹐Linux 核心 2.4 的第四代工具 ' iptables ' 連同其它核心改寫也在 1999 年年中進行開發了。這就是目前這個 iptables 的 HOWTO 文件所致力之所在。
(* 譯者註﹕“使用者空間”通常是用來區別系統記憶體的使用範圍﹐主要類型分為核心空間和使用者空間。原作者可能以為大家都是程式高手﹐故會用如此專門術語。然對一般讀者來說﹐理解上或許有困難﹐故此多說兩句。在往後的閱讀中也請留意。)
您需要一個核心有 netfilter 建構於其中﹕netfilter 是 Linux 核心中一個通用架構﹐可以讓其它東西(例如 iptables 模組) 插入(plug into)。換句話說﹐您需要核心 2.3.15 或更新的版本﹐同時在核心編譯時以 ' Y ' 回答 CONFIG_NETFILTER 這個選項。
iptables
這隻工具會和核心對講並告訴它什麼封包要過濾。除非您是一個程式人員﹐或異想天開﹐那您就是用它來控制封包怎樣過濾的了。
這隻 iptables
工具可以插入或移除核心封包過濾表格(packet filtering table) 中的一些規則(rules)。也就是說﹐無論您設定了什麼﹐要是重新啟動(reboot)系統的話﹐就會全部丟失﹔請參閱
制定永久性規則(Making Rules Permanent)﹐ 看看如何確保設定在下次 Linux 啟動後可以回存。
iptables
是用來取代 ipfwadm
和 ipchains
的﹕請參閱
使用 ipchains 和 ipfwadm (Using ipchains and ipfwadm)﹐ 看看如何無痛的避免使用 iptables﹐假如您目前正使用它們其中之一。
您目前的防火牆設定是儲存於核心裡面的﹐也正因如此﹐設定會在系統重啟後丟失。iptables-save 和 iptables-restore * 的撰寫目前已經被列入 TODO 列表中了。我保證當它們問世的時候﹐肯定非常棒。
(* 譯者註﹕在 ipchains 工具中﹐可以使用 ipchains-save 與 ipchains-restore 來把當前的防火牆設定儲存起來﹐以及將之還原。如果讀者沒使用過 ipchains 那兩個功能的話﹐或許不知道作者在說什麼。)
目前來說﹐就把設定規則所需的那些命令寫進一個初始命令稿(script)中吧。要確定的是﹐假如有其中一個命令失敗的時候﹐您能提供一些智能的動作反應 (通常如 ' exec /sbin/sulogin' )。