iptables-1.1.9指南(超經典)一

Iptables 指南 1.1.19
Oskar Andreasson
[email protected]
Copyright © 2001-2003 by Oskar Andreasson

本文在符合 GNU Free Documentation 許可版本1.1的條件下,可以拷貝、分發、更改,但必須保留緒言和所有的章節,如印刷成書,封面要包括“原著:Oskar Andreasson”,且書背不準有文字。本文附錄有 “GNU Free Documentation License”的詳細內容。

文中的所有腳本均置於GNU General Public License版本2下,可以自由地分發、更改。

給出這些腳本是希望它們有所作用,但沒有任何保證,也沒有商業可用性或某些特殊用途的內在保證。參見GNU General Public License

本文附帶一份GNU General Public License,在章節“GNU Free Documentation License”中,如沒有,請聯繫the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- 1307 USA

獻辭

首先,我要把本文獻給我那wonderful的女友Ninel(她給我的幫助遠遠勝過我給她的):希望我能讓你幸福,就象你給我的。( 譯者注:我沒有想到合適的詞能表達作者女友的wonderful,你就自己想去吧。還有,不知他們現在是否結婚了:) )

其次,我要把這篇文章獻給所有Linux的開發者和維護者,就是他們完成了令人無法相信的艱難工作,使這麼優秀的操作系統成爲可能。

目錄
譯者序
關於作者
如何閱讀
必備知識
本文約定
1. 序言

1.1. 爲什麼要寫這個指南
1.2. 指南是如何寫的
1.3. 文中出現的術語

2. 準備階段

2.1. 哪裏能取得iptables
2.2. 內核配置
2.3. 編譯與安裝

2.3.1. 編譯
2.3.2. 在Red Hat 7.1上安裝

3. 表和鏈

3.1. 概述
3.2. mangle 表
3.3. nat 表
3.4. Filter 表

4. 狀態機制

4.1. 概述
4.2. conntrack記錄
4.3. 數據包在用戶空間的狀態
4.4. TCP 連接
4.5. UDP 連接
4.6. ICMP 連接
4.7. 缺省的連接操作
4.8. 複雜協議和連接跟蹤

5. 保存和恢復數據管理規則

5.1. 速度
5.2. restore的不足之處
5.3. iptables-save
5.4. iptables-restore

6. 規則是如何練成的

6.1. 基礎
6.2. Tables
6.3. Commands
6.4. Matches

6.4.1. 通用匹配
6.4.2. 隱含匹配
6.4.3. 顯式匹配
6.4.4. 針對非正常包的匹配

6.5. Targets/Jumps

6.5.1. ACCEPT target
6.5.2. DNAT target
6.5.3. DROP target
6.5.4. LOG target
6.5.5. MARK target
6.5.6. MASQUERADE target
6.5.7. MIRROR target
6.5.8. QUEUE target
6.5.9. REDIRECT target
6.5.10. REJECT target
6.5.11. RETURN target
6.5.12. SNAT target
6.5.13. TOS target
6.5.14. TTL target
6.5.15. ULOG target

7. 防火牆配置實例 rc.firewall

7.1. 關於rc.firewall
7.2. rc.firewall詳解

7.2.1. 參數配置
7.2.2. 外部模塊的裝載
7.2.3. proc的設置
7.2.4. 規則位置的優化
7.2.5. 缺省策略的設置
7.2.6. 自定義鏈的設置
7.2.7. INPUT鏈
7.2.8. FORWARD鏈
7.2.9. OUTPUT鏈
7.2.10. PREROUTING鏈
7.2.11. POSTROUTING鏈

8. 例子簡介

8.1. rc.firewall.txt腳本的結構

8.1.1. 腳本結構

8.2. rc.firewall.txt
8.3. rc.DMZ.firewall.txt
8.4. rc.DHCP.firewall.txt
8.5. rc.UTIN.firewall.txt
8.6. rc.test-iptables.txt
8.7. rc.flush-iptables.txt
8.8. Limit-match.txt
8.9. Pid-owner.txt
8.10. Sid-owner.txt
8.11. Ttl-inc.txt
8.12. Iptables-save ruleset

A. 常用命令詳解

A.1. 查看當前規則集的命令
A.2. 修正和清空iptables的命令

B. 常見問題於與解答

B.1. 模塊裝載問題
B.2. 未設置SYN的NEW狀態包
B.3. NEW狀態的SYN/ACK包
B.4. 使用私有IP地址的ISP
B.5. 放行DHCP數據
B.6. 關於mIRC DCC的問題

C. ICMP類型
D. 其他資源和鏈接
E. 鳴謝
F. History
G. GNU Free Documentation License

0. PREAMBLE
1. APPLICABIL99vY AND DEFIN99vIONS
2. VERBATIM COPYING
3. COPYING IN QUANT99vY
4. MODIFICATIONS
5. COMBINING DOCUMENTS
6. COLLECTIONS OF DOCUMENTS
7. AGGREGATION W99vH INDEPENDENT WORKS
8. TRANSLATION
9. TERMINATION
10. FUTURE REVISIONS OF THIS LICENSE
How to use this License for your documents
H. GNU General Public License

0. Preamble
1. TERMS AND COND99vIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
2. How to Apply These Terms to Your New Programs

I. 示例腳本的代碼

I.1. rc.firewall腳本代碼
I.2. rc.DMZ.firewall腳本代碼
I.3. rc.UTIN.firewall腳本代碼
I.4. rc.DHCP.firewall腳本代碼
I.5. rc.flush-iptables腳本代碼
I.6. rc.test-iptables腳本代碼

List of Tables
3-1. 以本地爲目標(就是我們自己的機子了)的包
3-2. 以本地爲源的包
3-3. 被轉發的包
4-1. 數據包在用戶空間的狀態
4-2. 內部狀態
6-1. Tables
6-2. Commands
6-3. Options
6-4. Generic matches
6-5. TCP matches
6-6. UDP matches
6-7. ICMP matches
6-8. Limit match options
6-9. MAC match options
6-10. Mark match options
6-11. Multiport match options
6-12. Owner match options
6-13. State matches
6-14. TOS matches
6-15. TTL matches
6-16. DNAT target
6-17. LOG target options
6-18. MARK target options
6-19. MASQUERADE target
6-20. REDIRECT target
6-21. REJECT target
6-22. SNAT target
6-23. TOS target
6-24. TTL target
6-25. ULOG target
C-1. ICMP類型

譯者序

譯者sllscn是中國Linux公社裏的“Linux 新鮮社員”,一個Linux愛好者,在實際工作中使用iptables構造防火牆時,發現有關iptables的中文資料太少,故而不得已參考英文版的材 料。爲了今後參考的方便,也爲了廣大使用者,不怕自己的英文水平太差,翻着字典翻譯了本文。翻譯只爲了能看懂,達不到“好看”,勿怪!

第一章序言部分除了第三小節介紹的術語要看看,其他都沒什麼。第二章對想要親自編譯iptables的兄弟們是有些幫助的。第三、第四兩章可以使我們理 解、掌握iptables工作方式和流程。第五章和第六章是iptables命令使用方法的詳細介紹。第七章與第八章是實例講解,對我們編寫自己的規則很 有指導意義的,強烈建議你看一看。附錄裏有一些資源鏈接是很好的,相信你一定會喜歡。

因爲術語的緣故,目錄部分有一些未翻譯,但正文的內容都翻譯了。附錄F是本文的更新歷史,附錄G是GNU Free Documentation License,附錄H是GNU General Public License,它們對理解 iptables沒有什麼作用,故未翻譯。

在閱讀本文時,你可能會發現有重複的地方,這不是原作者的水平不高,反而恰恰是他爲我們考慮的結果。你可以把這篇文章的任何一章抽出來閱讀,而不需要反覆地參照其他章節。在此,再次向作者表示敬意!

因譯者水平有限,對原文的理解不敢保證完全正確,如有意見或建議,可以聯繫譯者[email protected]

鄭重聲明:翻譯得到了原文作者Oskar Andreasson的許可。對於本文(不是原文),可自由使用、修改、傳播、轉載,但對以盈利爲目的使用,保留所有權利。
關於作者

我的局域網裏有很多“年老的”計算機,他們也想連接到Internet上,還要保證安全。做到這一點, iptables是的ipchains的一個很好的升級。使用ipchains你可以通過丟棄所有“目的端口不是特定端口” 的包來建立一個安全的網絡。但這將導致一些服務出現問題,比如被動FTP,還有在IRC中流出的DCC。它們在服務器上分配端口,並告知客戶端,然後再讓 客戶連接。但是,iptables的代碼中也有一些小毛病,在某些方面我發現這些代碼並沒有爲作爲完整的產品發佈做好準備,但我仍然建議使用 ipchains或更老的 ipfwadm 的人們進行升級,除非他們對正在使用的代碼滿意,或它們足以滿足他們的需要。
如何閱讀

本文介紹了iptables,以便你可以領會iptables的精彩,文中不包含iptables或Netfilter在安全方面的 bug。如果你發現iptables(或其組成部分)任何bug或特殊的行爲,請聯繫Netfilter mailing lists ,他們會告訴你那是否是bug或如何解決。iptables或Netfilter中幾乎沒有安全方面的bug,當然偶爾也會出些問題,它們能在 Netfilter主頁中找到。

文中用到的腳本不能解決Netfilter內部的bug,給出它們,只是爲了演示如何構造規則,以便我們能解決遇到的數據流管理問題。但本文沒有包括象 “如何關閉HTTP端口,因爲Apache 1.2.12偶爾會被攻擊” 這樣的問題。本指南會告訴你如何通過iptables關閉HTTP端口,但不是因爲Apache偶爾會被攻擊。

本文適合於初學者,但也儘可能完善。因爲有太多的targets或matches,所以沒有完全收錄。如果你需要這方面的信息,可以訪問Netfilter主頁。
必備知識

閱讀本文,要具備一些基礎知識,如Linux/Unix,shell腳本編寫,內核編譯,最好還有一些簡單的內核知識。

我嘗試着儘可能使讀者不需要這些知識也能完全弄懂這篇文章,但要理解擴展部分是不行的。所以還是要有點基礎的:)
本文約定

以下的約定會在文中用到:

*

代碼和命令輸出使用定寬字體,命令用粗體。

[blueflux@work1 neigh]$ ls
default eth0 lo
[blueflux@work1 neigh]$

*

所有的命令和程序名都用粗體。
*

所有的系統部件,如硬件、內核部件、loopback使用斜體。
*

計算機文本輸出用 這種字體。
*

文件名和路徑名象這樣 /usr/local/bin/iptables 。

1. 序言
1.1. 爲什麼要寫這個指南

我發現目前所有的HOWTO都缺乏Linux 2.4.x 內核中的Iptables和Netfilter 函數的信息,於是我試圖回答一些問題,比如狀態匹配。我會用插圖和例子 rc.firewall.txt 加以說明,此處的例子可以在你的/etc/rc.d/使用。最初這篇文章是以HOWTO文檔的形式書寫的,因爲許多人只接受HOWTO文檔。

還有一個小腳本rc.flush-iptables.txt,我寫它只是爲使你在配置它的時候能象我一樣有成功的感覺。
1.2. 指南是如何寫的

我請教了Marc Boucher 及netfilter團隊的其他核心成員。對他們的工作以及對我在爲boingworld.com 書寫這個指南時的幫助表示極大的謝意,現在這個指南在我自己的站點frozentux.net上進行維護。這個文檔將一步一步教你setup過程,讓你對 iptables包有更多的瞭解。這大部分的東西都基於例子rc.firewall 文件,因爲我發現這是學習iptables的一個好方法。我決定自頂向下地跟隨rc.firewall 文件來學習 iptables。雖然這樣會困難一些,但更有邏輯。當你碰到不懂的東西時再來查看這個文件。
1.3. 文中出現的術語

文中包含了一些術語,你應該有所瞭解。這裏有一些解釋,並說明了本文中如何使用它們。

DNAT - Destination Network Address Translation 目的網絡地址轉換。 DNAT是一種改變數據包目的 ip地址的技術,經常和SNAT聯用,以使多臺服務器能共享一個ip地址連入Internet,並且繼續服務。通過對同一個ip地址分配不同的端口,來決 定數據的流向。

Stream - 流是指發送和接收的數據包和通信的雙方都有關係的一種連接(譯者注:本文中,作者把連接看作是單向的,流表示雙向的連接)。一般的,這個詞用於描述在兩個 方向上發送兩個或三個數據包的連接。對於TCP,流意味着連接,它發送了一個SYN,然後又回覆SYN/ACK。但也可能是指這樣的連接,發送一個 SYN,回覆ICMP主機不可達信息。換句話說,我使用這個詞很隨意。

SNAT - Source Network Address Translation源網絡地址轉換。這是一種改變數據包源ip地址的技術,經常用來使多臺計算機分享一個Internet地址。這隻在IPv4中使 用,因爲IPv4的地址已快用完了,IPv6將解決這個問題。

State - 狀態 指明數據包處於什麼狀態。狀態在RFC 793 - Transmission Control Protocol中定義,或由用戶在Netfilter/iptables中自定義。需要注意的是Netfilter設定了一些關於連接和數據包的狀態, 但沒有完全使用使用RFC 793的定義。

User space - 用戶空間,指在內核外部或發生在內核外部的任何東西。例如,調用 iptables -h 發生在內核外部,但iptables -A FORWARD -p tcp -j ACCEPT (部分地)發生在內核內部,因爲一條新的規則加入了規則集。

Kernel space - 內核空間 ,與用戶空間相對,指那些發生在內核內部。

Userland - 參見用戶空間
target - 這個詞在後文中有大量的應用,它表示對匹配的數據包所做的操作。
2. 準備階段

這一章是學習iptables的開始,它將幫助你理解Netfilter和iptables在Linux中扮演的角色。它會告訴你如何配置、安裝防火牆,你的經驗也會隨之增長。當然,要想達到你的目標,是要花費時間,還要有毅力。( 譯者注:聽起來很嚇人的:) )
2.1. 哪裏能取得iptables

iptables 可以從www.netfilter.org 下載,網站中的FAQs也是很好的教程。iptables 也使用一些內核空間,可以在用make configure配置內核的過程中配置,下面會介紹必要的步驟。
2.2. 內核配置

爲了運行iptables,需要在內核配置期間,選擇以下一些選項,不管你用make config或其他命令。

CONFIG_PACKET - 允許程序直接訪問網絡設備(譯者注:最常用的就是網卡了),象tcpdump 和 snort就要使用這個功能。

Note

嚴格地說,iptables並不需要CONFIG_PACKET,但是它有很多用處(譯者注:其他程序需要),所以就選上了。當然,你不想要,不選就是了。(譯者注:建議還是選的爲好)

CONFIG_NETFILTER - 允許計算機作爲網關或防火牆。這個是必需的,因爲整篇文章都要用到這個功能。我想你也需要這個,誰叫你學iptables呢:)

當然,你要給網絡設備安裝正確的驅動程序,比如,Ethernet 網卡, PPP 還有 SLIP 。上面的選項,只是在內核中建立了一個框架, iptables確實已經可以運行,但不能做任何實質性的工作。我們需要更多的選項。以下給出內核2.4.9的選項和簡單的說明:

CONFIG_IP_NF_CONNTRACK - 連接跟蹤模塊,用於 NAT(網絡地址轉換) 和 Masquerading(ip地址僞裝),當然,還有其他應用。如果你想把LAN中的一臺機子作爲防火牆,這個模塊你算選對了。腳本 rc.firewall.txt 要想正常工作,就必需有它的存在。

CONFIG_IP_NF_FTP - 這個選項提供針對FTP連接進行連接跟蹤的功能。一般情況下,對FTP連接進行連接跟蹤是很困難的,要做到這一點,需要一個名爲helper的動態鏈接 庫。此選項就是用來編譯helper的。如果沒有這個功能,就無法穿越防火牆或網關使用FTP。

CONFIG_IP_NF_IPTABLES - 有了它,你才能使用過濾、僞裝、NAT。它爲內核加入了iptables標識框架。沒有它,iptables毫無作用。

CONFIG_IP_NF_MATCH_LIM99v - 此模塊並不是十分必要,但我在例子rc.firewall.txt中用到了。它提供匹配LIM99v的功能,以便於使用一個適當的規則來控制每分鐘要匹配 的數據包的數量。比如, -m limit --limit 3/minute 的作用是每分鐘最多匹配三個數據包。這個功能也可用來消除某種DoS攻擊。

CONFIG_IP_NF_MATCH_MAC - 選擇這個模塊,可以根據MAC地址匹配數據包。例如,我們想要阻塞使用了某些MAC地址的數據包,或阻塞某些計算機的通信,用這個很容易。因爲每個 Ethernet網卡都有它自己的MAC地址,且幾乎從不會改變。但我在 rc.firewall.txt中沒有用到這個功能,其他例子也未用到。(譯者注:這又一次說明了學習是爲將來打基礎:) )

CONFIG_IP_NF_MATCH_MARK - 這個選項用來標記數據包。對數據包做 MARK(標記)操作,我們就可以在後面的表中用這個標記來匹配數據包。後文有詳細的說明。

CONFIG_IP_NF_MATCH_MULTIPORT - 選擇這個模塊我們可以使用端口範圍來匹配數據包,沒有它,是無法做到這一點的。

CONFIG_IP_NF_MATCH_TOS - 使我們可以設置數據包的TOS(Type Of Service 服務類型)。這個工作也可以用命令ip/tc完成,還可在mangle表中用某種規則設定。

CONFIG_IP_NF_MATCH_TCPMSS - 可以基於MSS匹配TCP數據包。

CONFIG_IP_NF_MATCH_STATE - 相比較ipchains 這是最大的更新,有了它,我們可以對數據包做狀態匹配。比如,在某個TCP連接的兩個方向上已有通信,則這個連接上的數據包就被看作 ESTABLISHED(已建立連接)狀態。在rc.firewall.txt 裏大量使用了此模塊的功能。

CONFIG_IP_NF_MATCH_UNCLEAN - 匹配那些不符合類型標準或無效的 P、TCP、UDP、ICMP數據包(譯者注:之所以此模塊名爲UNCLEAN,可以這樣理解,凡不是正確模式的包都是髒的。這有些象操作系統內存管理中 的“髒頁”,那這裏就可以稱作“髒包”了,自然也就UNCLEAN了)。我們一般丟棄這樣的包,但不知這樣做是否正確。另外要注意,這種匹配功能還在實驗 階段,可能會有些問題。

CONFIG_IP_NF_MATCH_OWNER - 根據套接字的擁有者匹配數據包。比如,我們只允許root訪問Internet。在iptables中,這個模塊最初只是用一個例子來說明它的功能。同樣,這個模塊也處於實驗階段,還無法使用。

CONFIG_IP_NF_FILTER - 這個模塊爲iptables添加基本的過濾表,其中包含INPUT、FORWARD、OUTPUT鏈。通過過濾表可以做完全的IP過濾。只要想過濾數據包,不管是接收的還是發送的,也不管做何種過濾,都必需此模塊。

CONFIG_IP_NF_TARGET_REJECT - 這個操作使我們用ICMP錯誤信息來回應接收到的數據包,而不是簡單地丟棄它。有些情況必須要有迴應的,比如,相對於ICMP和UDP來說,要重置或拒絕TCP連接總是需要一個TCP RST包。

CONFIG_IP_NF_TARGET_MIRROR - 這個操作使數據包返回到發送它的計算機。例如,我們在INPUT鏈裏對目的端口爲HTTP的包設置了MIRROR操作,當有人訪問HTTP時,包就被髮送 回原計算機,最後,他訪問的可能是他自己的主頁。(譯者注:應該不難理解爲什麼叫做MIRROR了)

CONFIG_IP_NF_NAT - 顧名思義,本模塊提供NAT功能。這個選項使我們有權訪問nat表。端口轉發和僞裝是必需此模塊的。當然,如果你的LAN裏的所有計算機都有唯一的有效的 IP地址,那在做防火牆或僞裝時就無須這個選項了。rc.firewall.txt 是需要的:)

CONFIG_IP_NF_TARGET_MASQUERADE - 提供MASQUERADE(僞裝)操作。如果我們不知道連接Internet的IP,首選的方法就是使用MASQUERADE,而不是DNAT或 SNAT。換句話說,就是如果我們使用PPP或SLIP等連入Internet,由DHCP或其他服務分配IP,使用這個比SNAT好。因爲 MASQUERADE 不需要預先知道連接Internet的IP,雖然對於計算機來說MASQUERADE要比NAT的負載稍微高一點。

CONFIG_IP_NF_TARGET_REDIRECT - 這個操作和代理程序一起使用是很有用的。它不會讓數據包直接通過,而是把包重新映射到本地主機,也就是完成透明代理。

CONFIG_IP_NF_TARGET_LOG - 爲iptables增加 LOG(日誌)操作。通過它,可以使用系統日誌服務記錄某些數據包,這樣我們就能瞭解在包上發生了什麼。這對於我們做安全審查、調試腳本的幫助是無價的。

CONFIG_IP_NF_TARGET_TCPMSS - 這個選項可以對付一些阻塞ICMP分段信息的ISP(服務提供商)或服務。沒有ICMP分段信息,一些網頁、大郵件無法通過,雖然小郵件可以,還有,在握 手完成之後,ssh可以但scp不能工作。我們可以用TCPMSS解決這個問題,就是使MSS(Maximum Segment Size)被鉗制於PMTU(Path Maximum Transmit Unit)。這個方法可以處理被Netfilter開發者們在內核配置幫助中稱作“criminally brain-dead ISPs or servers”的問題。

CONFIG_IP_NF_COMPAT_IPCHAINS - ipchains 的,這只是爲內核從2.2轉換到2.4而使用的,它會在2.6中刪除。

CONFIG_IP_NF_COMPAT_IPFWADM - 同上,這只是 ipfwadm的暫時使用的兼容模式。

上面,我簡要介紹了很多選項,但這只是內核2.4.9中的。要想看看更多的選項,建議你去Netfilter 看看patch-o-matic。在那裏,有其他的一些選項。POM可能會被加到內核裏,當然現在還沒有。這有很多原因,比如,還不穩定,Linus Torvalds沒打算或沒堅持要把這些補丁放入主流的內核,因爲它們還在實驗。

把以下選項編譯進內核或編譯成模塊,rc.firewall.txt才能使用。

*

CONFIG_PACKET
*

CONFIG_NETFILTER
*

CONFIG_IP_NF_CONNTRACK
*

CONFIG_IP_NF_FTP
*

CONFIG_IP_NF_IRC
*

CONFIG_IP_NF_IPTABLES
*

CONFIG_IP_NF_FILTER
*

CONFIG_IP_NF_NAT
*

CONFIG_IP_NF_MATCH_STATE
*

CONFIG_IP_NF_TARGET_LOG
*

CONFIG_IP_NF_MATCH_LIM99v
*

CONFIG_IP_NF_TARGET_MASQUERADE
以上是爲保證 rc.firewall.txt正常工作而需要的最少的選項。其他腳本需要的選項,在相應的章節裏都有說明。目前,我們只需注意要學習的這個腳本。
2.3. 編譯與安裝

下面,我們來看看如何編譯iptables。iptables很多組件的配置、編譯是與內核的配置、編譯相關聯的,瞭解這一點是很重要的。某些 Linux產品預裝了iptables,比如Red Hat,但是它的缺省設置是不啓用iptables的。後文我們會介紹如何啓用它,也會介紹一下其他 Linux產品裏的iptables情況。
2.3.1. 編譯

首先要解壓iptables包。這裏,我用iptables 1.2.6a做例子(譯者注:在我翻譯時,最新版本已經是 1.2.9,其中又有了不少改進,修補了一些bug,增添了幾個match和target。)。命令 bzip2 -cd iptables-1.2.6a.tar.bz2 | tar -xvf -(當然也可以用tar -xjvf iptables-1.2.6a.tar.bz2,但這個命令可能對一些老版的tar不適用 )將壓縮包解壓至目錄iptables-1.2.6a,其中的INSTALL文件有很多對編譯、運行有用的信息。

這一步,你將配置、安裝一些額外的模塊,也可以爲內核增加一些選項。我們這裏只是檢查、安裝一些未被納入內核的標準的補丁。當然,更多的在實驗階段的補丁,僅在進行其他某些操作時纔會用到。

Note

有一些補丁僅僅處在實驗階段,把它們也安裝上不是一個好主意。這一步,你會遇到很多十分有趣的匹配和對數據包的操作,但它們還正在實驗。

爲了完成這一步,我們要在iptables的目錄內用到如下一些命令:

make pending-patches KERNEL_DIR=/usr/src/linux/

變量KERNEL_DIR指向內核原碼的真實路徑。一般情況下,都是/usr/src/linux/ ,但也會不一樣,這要看你所用的Linux產品了。

Note

總之,只有某些補丁會被詢問是否加入內核,而Netfilter的開發者們有大量的補丁或附件想要加入內核,但還要再實驗一陣子才能做到。如果你想安裝這些東西,就用下面的命令:

make most-of-pom KERNEL_DIR=/usr/src/linux/

這個命令會安裝部分patch-o-matic(netfilter世界對補丁的稱呼),忽略掉的是非常極端的那一部分,它們可能會對內核造成嚴重的破 壞。你要知道這個命令的作用,要了解它們對內核原碼的影響,好在在你選用之前,會有所提示。下面的命令可以安裝所有的patch-o-matic(譯者 注:一定要小心哦)。

make patch-o-matic KERNEL_DIR=/usr/src/linux/

要仔細的讀讀每一個補丁的幫助文件,因爲有些patch-o-matic會損壞內核,而有些對其他補丁有破壞作用。

Note

你要是不打算用patch-o-matic修補內核,以上的命令都用不着,它們不是必需的。不過,你可以用這些命令來看看有什麼有趣的玩意兒,這不會影響任何東西。

安裝好patch-o-matic,現在應該重新編譯內核了,因爲其中增加了一些補丁。但別忘了重新配置內核,現有的配置文件裏可沒有你增加的補丁的信息。當然,你也可以先編譯iptables , 再來編譯內核。

接下來就該編譯iptables了,用下面這個簡單的命令:

make KERNEL_DIR=/usr/src/linux/

iptables應該編譯好了,如果不行,好好考慮考慮問題在哪兒,要麼訂閱 Netfilter mailing list,那裏可能有人能幫助你。

一切順利的話,我們該安裝iptables了,這幾乎不會有什麼問題的。我們用下面的命令來完成這一步:

make install KERNEL_DIR=/usr/src/linux/

現在大功告成了。如果你在前面沒有重新編譯、安裝內核,現在就要做了,不然,你還是不能使用更新後的iptables。好好看看INSTALL吧,那裏面有詳細的安裝信息。
2.3.2. 在Red Hat 7.1上安裝

Red Hat 7.1使用2.4.x的內核,支持Netfilter和iptables。Red Hat包含了所有基本的程序和需要的配置文件,但缺省使用的是B class=COMMAND>ipchains。“iptables爲什麼不能用”是最常見的問題,下面就讓我們就來說說如何關閉ipchains 而起用iptables 。

Note

Red Hat 7.1預裝的iptables版本有些老了,在使用之前,你可能想裝個新的,再自己編譯一下內核。

我們先要關閉ipchains,並且不想再讓它運行起來,做到這一點,要更改目錄/etc/rc.d/下的一些文件名。用以下命令完成:

chkconfig --level 0123456 ipchains off

這個命令把所有指向/etc/rc.d/init.d/ipchains的軟連接改名爲 K92ipchains。以S開頭表示,在啓動時會由初始化腳本運行此腳本。改爲K開頭後,就表示終止服務,或以後在啓動時不再運行。這樣, ipchains以後不會再開機就運行了。

要想終止正在運行的服務,要用service命令。終止ipchains 服務的命令是:

service ipchains stop

現在,我們可以啓動iptables服務了。首先,要確定在哪個運行層運行,一般是 2,3和5,這些層有不同的用處:

*

2. 不帶NFS的多用戶環境,和層3的區別僅在於不帶網絡支持。
*

3. 多用戶環境,就是我們一般事用的層。
*

5. X11,圖形界面。

用下面的命令以使iptables能在這些層運行:

chkconfig --level 235 iptables on

你也可以使用這個命令使iptables能在其他層運行。但沒這個必要,因爲層1是單用戶模式,一般用在維修上;層4保留不用;層6用來關閉計算機。

啓動iptables用:

service iptables start

在腳本iptables裏還沒有定義規則。在Red Hat 7.1中添加規則的方法有二:第一個方法是編輯/etc/rc.d/init.d/iptables,要注意在用RPM升級iptables時,已有的規 則可能會被刪除。另一個方法是先裝載規則,然後用命令iptables-save把規則保存到文件中,再由目錄rc.d下的腳本 (/etc/rc.d/init.d/iptables)自動裝載。

我們先來說明如何利用“剪切粘貼大法”設置/etc/rc.d/init.d/iptables。爲了能在計算機啓動iptables時裝載規則,可以把 規則放在“start)”節或函數start()中。注意:如果把規則放在“start)”節裏,則不要在“start)”節裏運行start (),還要編輯“stop)”節,以便在關機時或進入一個不需要iptables的層時,腳本知道如何處理。還應檢查“restart”節和 “condrestart”節的設置。一定要注意,我們所做的改動在升級iptables時可能會被刪除,而不管是通過Red Hat網絡自動升級還是用 RPM升級。

下面介紹第二種方法:先寫一個規則的腳本,或直接用iptables命令生成規則。規則要適合自己的需要,別忘了實驗一下是否有問題,確認正常之後,使用 命令iptables-save來保存規則。一般用iptables-save > /etc/sysconfig/iptables生成保存規則的文件 /etc/sysconfig/iptables,也可以用service iptables save,它能把規則自動保存在/etc/sysconfig/iptables中。當計算機啓動時,rc.d下的腳本將用命令iptables- restore調用這個文件,從而就自動恢復了規則。

以上兩種方法最好不要混用,以免用不同方法定義的規則互相影響,甚至使防火牆的設置無效。

至此,可以刪除預裝的ipchains和iptables了,這樣可以避免新舊版本的iptables之間的衝突。其實,只有當你從原碼安裝時,才需要這樣做。但一般來說,也不會出現互相影響的問題,因爲基於rpm的包不使用原碼的缺省目錄。刪除用以下命令:

rpm -e iptables

既然不用ipchains爲什麼要保留呢?刪吧!命令如下:

rpm -e ipchains

歷經磨難,勝利終於到來了。你已經能夠從源碼安裝iptables了。那些老版的東西就刪掉吧。
Chapter 3. 表和鏈

這一章我們來討論數據包是以什麼順序、如何穿越不同的鏈和表的。稍後,在你自己寫規則時,就會知道這個順序是多麼的重要。一些組件是 iptables與內核共用的,比如,數據包路由的判斷。瞭解到這一點是很重要的,尤其在你用iptables改變數據包的路由時。這會幫助你弄明白數據 包是如何以及爲什麼被那樣路由,一個好的例子是DNAT和SNAT,不要忘了TOS的作用。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章