歷史版本 與Linux核心各版本集成的防火牆歷史版本:
2.0.X核心:ipfwadm
2.2.X核心:ipchains
2.4.X核心:iptables
表鏈結構 系統優點
netfilter/iptables 的最大優點是它可以配置有狀態的
防火牆 ,這是 ipfwadm 和 ipchains 等以前的工具都無法提供的一種重要功能。有狀態的防火牆能夠指定並記住為傳送或接收
信息包 所建立的連線的狀態。防火牆可以從信息包的連線跟蹤狀態獲得該信息。在決定新的信息包過濾時,防火牆所使用的這些狀態信息可以增加其效率和速度。這裡有四種有效狀態,名稱分別為 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。
狀態 ESTABLISHED 指出該信息包屬於已建立的連線,該連線一直用於傳送和接收信息包並且完全有效。INVALID 狀態指出該
信息包 與任何已知的流或連線都不相關聯,它可能包含錯誤的數據或頭。狀態 NEW 意味著該信息包已經或將啟動新的連線,或者它與尚未用於傳送和接收信息包的連線相關聯。最後, RELATED 表示該
信息包 正在啟動新連線,以及它與已建立的連線相關聯。
netfilter/iptables 的另一個重要優點是,它使用戶可以完全控制
防火牆 配置和信息包過濾。您可以定製自己的規則來滿足您的特定需求,從而只允許您想要的網路流量進入系統。
另外,
netfilter /iptables 是免費的,這對於那些想要節省費用的人來說十分理想,它可以代替昂貴的防火牆解決方案。
命令說明 Iptables 是用來設定、維護和檢查Linux
核心 的IP包過濾規則的。
可以定義不同的表,每個表都包含幾個內部的鏈,也能包含用戶定義的鏈。每個鏈都是一個規則列表,對對應的包進行匹配:每條規則指定應當如何處理與之相匹配的包。這被稱作'target'(目標),也可以跳向同一個表內的用戶定義的鏈。
TARGETS
防火牆 的規則指定所檢查包的特徵,和目標。如果包不匹配,將送往該鏈中下一條規則檢查;如果匹配,那么下一條規則由目標值確定.該目標值可以是用戶定義的鏈名,或是某個專用值,如ACCEPT[通過],DROP[刪除],QUEUE[排隊],或者 RETURN[返回]。
ACCEPT 表示讓這個包通過。DROP表示將這個包丟棄。QUEUE表示把這個包傳遞到
用戶空間 。RETURN表示停止這條鏈的匹配,到前一個鏈的規則重新開始。如果到達了一個內建的鏈(的末端),或者遇到內建鏈的規則是RETURN,包的命運將由鏈準則指定的目標決定。
TABLES
當前有三個表(哪個表是當前表取決於
核心 配置選項和當前模組)。
-t table
這個選項指定命令要操作的匹配包的表。如果核心被配置為自動載入模組,這時若模組沒有載入,(系統)將嘗試(為該表)載入適合的模組。這些表如下:filter,這是默認的表,包含了內建的鏈INPUT(處理進入的包)、FORWARD(處理通過的包)和OUTPUT(處理本地生成的包)。nat,這個表被查詢時表示遇到了產生新的連線的包,由三個內建的鏈構成:PREROUTING (修改到來的包)、OUTPUT(修改
路由 之前本地的包)、POSTROUTING(修改準備出去的包)。mangle 這個表用來對指定的包進行修改。它有兩個內建規則:PREROUTING(修改路由之前進入的包)和OUTPUT(修改路由之前本地的包)。
IPTABLES OPTIONS
這些可被iptables識別的選項可以區分不同的種類。
COMMANDS
這些選項指定執行明確的動作:若指令行下沒有其他規定,該行只能指定一個選項.對於長格式的命令和選項名,所用字母長度只要保證iptables能從其他選項中區分出該指令就行了。
-A -append
在所選擇的鏈末添加一條或更多規則。當源(地址)或者/與 目的(地址)轉換為多個地址時,這條規則會加到所有可能的地址(組合)後面。
-D -delete
從所選鏈中刪除一條或更多規則。這條命令可以有兩種方法:可以把被刪除規則指定為鏈中的序號(第一條序號為1),或者指定為要匹配的規則。
-R -replace
從選中的鏈中取代一條規則。如果源(地址)或者/與 目的(地址)被轉換為多地址,該命令會失敗。規則序號從1開始。
-I -insert
根據給出的規則序號向所選鏈中插入一條或更多規則。所以,如果規則序號為1,規則會被插入鏈的頭部。這也是不指定規則序號時的默認方式。
-L -list
顯示所選鏈的所有規則。如果沒有選擇鏈,所有鏈將被顯示。也可以和z選項一起使用,這時鏈會被自動列出和歸零。精確輸出受其它所給參數影響。
-F -flush
清空所選鏈。這等於把所有規則一個個的刪除。
--Z -zero
把所有鏈的包及
位元組 的計數器清空。它可以和 -L配合使用,在清空前察看計數器,請參見前文。
-N -new-chain
根據給出的名稱建立一個新的用戶定義鏈。這必須保證沒有同名的鏈存在。
-X -delete-chain
刪除指定的用戶自定義鏈。這個鏈必須沒有被引用,如果被引用,在刪除之前你必須刪除或者替換與之有關的規則。如果沒有給出參數,這條命令將試著刪除每個非內建的鏈。
-P -policy
設定鏈的目標規則。
-E -rename-chain
根據用戶給出的名字對指定鏈進行重命名,這僅僅是修飾,對整個表的結構沒有影響。TARGETS參數給出一個合法的目標。只有非用戶自定義鏈可以使用規則,而且內建鏈和用戶自定義鏈都不能是規則的目標。
-h Help.
幫助。給出當前命令語法非常簡短的說明。
PARAMETERS
參數
以下參數構成規則詳述,如用於add、delete、replace、append 和 check命令。
-p -protocal [!]protocol
規則或者包檢查(待檢查包)的協定。指定協定可以是tcp、udp、icmp中的一個或者全部,也可以是數值,代表這些協定中的某一個。當然也可以使用在/etc/protocols中定義的協定名。在協定名前加上"!"表示相反的規則。數字0相當於所有all。Protocol all會匹配所有協定,而且這是預設時的選項。在和check命令結合時,all可以不被使用。
-s -source [!] address[/mask]
指定源地址,可以是
主機名 、網路名和清楚的IP位址。mask說明可以是
網路掩碼 或清楚的數字,在網路掩碼的左邊指定網路掩碼左邊"1"的個數,因此,mask值為24等於255.255.255.0。在指定地址前加上"!"說明指定了相反的地址段。標誌 --src 是這個選項的簡寫。
-d --destination [!] address[/mask]
指定目標地址,要獲取詳細說明請參見 -s標誌的說明。標誌 --dst 是這個選項的簡寫。
-j --jump target
-j 目標跳轉
指定規則的目標;也就是說,如果包匹配應當做什麼。目標可以是用戶自定義鏈(不是這條規則所在的),某個會立即決定包的命運的專用內建目標,或者一個擴展(參見下面的EXTENSIONS)。如果規則的這個選項被忽略,那么匹配的過程不會對包產生影響,不過規則的計數器會增加。
-i -in-interface [!] [name]
i -進入的(網路)接口 [!][名稱]
這是包經由該接口接收的可選的入口名稱,包通過該接口接收(在鏈INPUT、FORWORD和PREROUTING中進入的包)。當在接口名前使用"!"說明後,指的是相反的名稱。如果接口名後面加上"+",則所有以此接口名開頭的接口都會被匹配。如果這個選項被忽略,會假設為"+",那么將匹配任意接口。
-o --out-interface [!][name]
-o --輸出接口[名稱]
這是包經由該接口送出的可選的出口名稱,包通過該口輸出(在鏈FORWARD、OUTPUT和POSTROUTING中送出的包)那么將匹配所有任意接口。
[!] -f,--fragment
[!] -f --分片
這意味著在分片的包中,規則只詢問第二及以後的片。自那以後由於無法判斷這種把包的
源連線埠 或目標連線埠(或者是ICMP類型的),這類包將不能匹配任何指定對他們進行匹配的規則。如果"!"說明用在了"-f"標誌之前,表示相反的意思。
OTHER OPTIONS
其他選項
還可以指定下列附加選項:
-v --verbose
-v --詳細
詳細輸出。這個選項讓list命令
顯示接口 地址、規則選項(如果有)和TOS(Type of Service)掩碼。包和位元組計數器也將被顯示,分別用K、M、G(前綴)表示1000、1,000,000和1,000,000,000倍(不過請參看-x標誌改變它),對於添加,插入,刪除和替換命令,這會使一個或多個規則的相關詳細信息被列印。
-n --numeric
-n --數字
數字輸出。IP位址和連線埠會以數字的形式列印。默認情況下,程式試顯示
主機名 、網路名或者服務(只要可用)。
-x -exact
-x -精確
擴展數字。顯示包和
位元組 計數器的精確值,代替用K,M,G表示的約數。這個選項僅能用於 -L 命令。
--line-numbers
當列表顯示規則時,在每個規則的前面加上行號,與該規則在鏈中的位置相對應。
MATCH EXTENSIONS
對應的擴展
iptables能夠使用一些與模組匹配的擴展包。以下就是含於基本包內的擴展包,而且他們大多數都可以通過在前面加上!來表示相反的意思。
tcp
當 --protocol tcp 被指定,且其他匹配的擴展未被指定時,這些擴展被裝載。它提供以下選項:
--source-port [!] [port[:port]]
源連線埠 或連線埠範圍指定。這可以是服務名或
連線埠號 。使用格式連線埠:連線埠也可以指定包含的(連線埠)範圍。如果首連線埠號被忽略,默認是"0",如果末連線埠號被忽略,默認是"65535",如果第二個連線埠號大於第一個,那么它們會被交換。這個選項可以使用 --sport的別名。
--destionation-port [!] [port:[port]]
目標連線埠或連線埠範圍指定。這個選項可以使用 --dport別名來代替。
--tcp-flags [!] mask comp
匹配指定的TCP標記。第一個參數是我們要檢查的標記,一個用逗號分開的列表,第二個參數是用逗號分開的標記表,是必須被設定的。標記如下:SYN ACK FIN RST URG PSH ALL NONE。因此這條命令:iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN只匹配那些SYN標記被設定而ACK、FIN和RST標記沒有設定的包。
[!] --syn
只匹配那些設定了SYN位而清除了ACK和FIN位的TCP包。這些包用於TCP連線初始化時發出請求;例如,大量的這種包進入一個接口發生堵塞時會阻止進入的TCP連線,而出去的TCP連線不會受到影響。這等於 --tcp-flags SYN,RST,ACK SYN。如果"--syn"前面有"!"標記,表示相反的意思。
--tcp-option [!] number
匹配設定了TCP選項的。
udp
當protocol udp 被指定,且其他匹配的擴展未被指定時,這些擴展被裝載,它提供以下選項:
--source-port [!] [port:[port]]
源連線埠或連線埠範圍指定。詳見 TCP擴展的--source-port選項說明。
--destination-port [!] [port:[port]]
目標連線埠或連線埠範圍指定。詳見 TCP擴展的--destination-port選項說明。
icmp
當protocol icmp被指定,且其他匹配的擴展未被指定時,該擴展被裝載。它提供以下選項:
--icmp-type [!] typename
這個選項允許指定ICMP類型,可以是一個數值型的ICMP類型,或者是某個由命令iptables -p icmp -h所顯示的ICMP類型名。
mac
--mac-source [!] address
匹配
物理地址 。必須是XX:XX:XX:XX:XX:XX這樣的格式。注意它只對來自以太設備並進入PREROUTING、FORWARD和INPUT鏈的包有效。
--to-destiontion [-][:port-port]
MASQUERADE
只用於nat表的POSTROUTING鏈。只能用於動態獲取IP(撥號)連線:如果你擁有
靜態IP位址 ,你要用SNAT。偽裝相當於給包發出時所經過接口的IP位址設定一個映像,當接口關閉連線會終止。這是因為當下一次撥號時未必是相同的接口地址(以後所有建立的連線都將關閉)。它有一個選項:
--to-ports [-port>]
指定使用的
源連線埠 範圍,覆蓋默認的SNAT源地址選擇(見上面)。這個選項只適用於指定了-p tcp或者-p udp的規則。
REDIRECT
只適用於nat表的PREROUTING和OUTPUT鏈,和只調用它們的用戶自定義鏈。它修改包的目標IP位址來傳送包到機器自身(本地生成的包被安置為地址
127.0.0.1 )。它包含一個選項:
--to-ports []
指定使用的目的連線埠或連線埠範圍:不指定的話,目標連線埠不會被修改。只能用於指定了-p tcp 或 -p udp的規則。
DIAGNOSTICS
診斷
不同的錯誤信息會列印成標準錯誤:退出代碼0表示正確。類似於不對的或者濫用的命令行參數錯誤會返回
錯誤代碼 2,其他錯誤返回代碼為1。
BUGS
臭蟲
Check is not implemented (yet).
檢查還未完成。
COMPATIBILITY WITH IPCHAINS
與ipchains的兼容性
iptables和Rusty Russell的ipchains非常相似。主要區別是INPUT 鏈只用於進入
本地主機 的包,而OUTPUT只用於自本地主機生成的包。因此每個包只經過三個鏈的一個;以前轉發的包會經過所有三個鏈。其他主要區別是 -i 引用進入接口;-o引用輸出接口,兩者都適用於進入FORWARD鏈的包。當和可選擴展模組一起使用默認過濾器表時,iptables是一個純粹的
包過濾器 。這能大大減少以前對IP偽裝和包過濾結合使用的混淆,所以以下選項作了不同的處理:
-j MASQ
-M -S
-M -L
在iptables中有幾個不同的鏈。
limit
這個模組匹配標誌用一個標記桶過濾器一一定速度進行匹配,它和LOG目標結合使用來給出有限的登入數.當達到這個極限值時,使用這個擴展包的規則將進行匹配.(除非使用了"!"標記)
--limit rate
最大平均匹配速率:可賦的值有'/second','/minute','/hour',or '/day'這樣的單位,默認是3/hour。
--limit-burst number
待匹配包初始個數的最大值:若前面指定的極限還沒達到這個數值,則概數字加1.默認值為5
multiport
這個模組匹配一組
源連線埠 或目標連線埠,最多可以指定15個連線埠。只能和-p tcp 或者 -p udp 連著使用。
--source-port [port[,port]]
如果源連線埠是其中一個給定連線埠則匹配
--destination-port [port[,port]]
如果目標連線埠是其中一個給定連線埠則匹配
--port [port[,port]]
若源連線埠和目的連線埠相等並與某個給定連線埠相等,則匹配。
mark
--mark value [/mask]
匹配那些無符號標記值的包(如果指定mask,在比較之前會給掩碼加上邏輯的標記)。
owner
此模組試為本地生成包匹配包創建者的不同特徵。只能用於OUTPUT鏈,而且即使這樣一些包(如ICMP ping應答)還可能沒有所有者,因此永遠不會匹配。
--uid-owner userid
如果給出有效的user id,那么匹配它的進程產生的包。
--gid-owner groupid
如果給出有效的group id,那么匹配它的進程產生的包。
--sid-owner seessionid
根據給出的會話組匹配該進程產生的包。
state
此模組,當與連線跟蹤結合使用時,允許訪問包的連線跟蹤狀態。
--state state
這裡state是一個逗號分割的匹配連線狀態列表。可能的狀態是:INVALID表示包是未知連線,ESTABLISHED表示是雙向傳送的連線,NEW表示包為新的連線,否則是非雙向傳送的,而RELATED表示包由新連線開始,但是和一個已存在的連線在一起,如FTP
數據傳送 ,或者一個ICMP錯誤。
unclean
此模組沒有可選項,不過它試著匹配那些奇怪的、不常見的包。處在實驗中。
tos
此模組匹配IP包首部的8位tos(服務類型)欄位(也就是說,包含在優先位中)。
--tos tos
這個參數可以是一個標準名稱,(用iptables -m tos -h 察看該列表),或者數值。
TARGET EXTENSIONS
iptables可以使用擴展目標模組:以下都包含在標準版中。
LOG
為匹配的包開啟
核心 記錄。當在規則中設定了這一選項後,
linux 核心會通過printk()列印一些關於全部匹配包的信息(諸如IP包頭欄位等)。
--log-level level
記錄級別(數字或參看 syslog.conf⑸)。
--log-prefix prefix
在紀錄信息前加上特定的前綴:最多14個字母長,用來和記錄中其他信息區別。
--log-tcp-sequence
記錄TCP序列號。如果記錄能被用戶讀取那么這將存在安全隱患。
--log-tcp-options
記錄來自TCP包頭部的選項。
--log-ip-options
記錄來自IP包頭部的選項。
MARK
--set-mark mark
REJECT
作為對匹配的包的回響,返回一個錯誤的包:其他情況下和DROP相同。
此目標只適用於INPUT、FORWARD和OUTPUT鏈,和調用這些鏈的用戶自定義鏈。這幾個選項控制返回的錯誤包的特性:
--reject-with type
Type可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port-nreachable、icmp-proto-unreachable、 icmp-net-prohibited 或者 icmp-host-prohibited,該類型會返回相應的ICMP錯誤信息(默認是port-unreachable)。選項 echo-reply也是允許的;它只能用於指定ICMP ping包的規則中,生成ping的回應。最後,選項tcp-reset可以用於在INPUT鏈中,或自INPUT鏈調用的規則,只匹配TCP協定:將回應一個TCP RST包。
TOS
用來設定IP包的首部八位tos。只能用於mangle表。
--set-tos tos
你可以使用一個數值型的TOS 值,或者用iptables -j TOS -h 來查看有效TOS名列表。
MIRROR
這是一個試驗示範目標,可用於轉換IP首部欄位中的源地址和目標地址,再傳送該包,並只適用於INPUT、FORWARD和OUTPUT鏈,以及只調用它們的用戶自定義鏈。
SNAT
這個目標只適用於nat表的POSTROUTING鏈。它規定修改包的源地址(此連線以後所有的包都會被影響),停止對規則的檢查,它包含選項:
--to-source [-][:port-port]
源連線埠 中512以下的(連線埠)會被安置為其他的512以下的連線埠;512到1024之間的連線埠會被安置為1024以下的,其他連線埠會被安置為1024或以上。如果可能,連線埠不會被修改。
相關套用 iptables模組編譯及套用
相信很多人都會用iptables,我也一直用,並且天天用.特別是看完platinum的>介紹後,覺得有必要深入了解一下它的拓展功能.於是立刻下載,先查看一下它的說明,其功能很是令人感覺很興奮,例如:comment (備註匹配),string(
字元串匹配 ,可以用做內容過濾),iprang(ip範圍匹配),time(時間匹配),ipp2p(點對點匹配),connlimit(同時連線個數匹配),Nth(第n個包匹配),geoip(根據國家地區匹配). quota(配額匹配),還有很多......之後編譯,幾經測試,在rh7.3 kernel2.4.18-3和rh9.0 kernel2.4.20-8下均成功實現添加擴展功能.以下是介紹其部分功能,及編譯方法.環境rh9.0 kernel2.4.20-8. root身份.
一,準備原碼 .
⒈
核心 原碼:為了減少複雜性,不編譯所有核心和模組,建議找一個跟當前版本一樣的核心原碼,推薦安裝時光碟的
a. [root@kindgeorge] uname -r (查看當前版本)
⒉4.20-8
可以cd /usr/src 查看是否有這個目錄2.4.20-8
b. 或者[root@kindgeorge]rpm -qa|grep kernel
kernel-source-2.4.20-8 如果有這個說明已安裝了.
如果沒有安裝,可以在RH第二張光碟中拷貝過來或安裝 rpm -ivh kernel-source-2.4.18-3.i386.rpm. 安裝後會在/usr/src/出現
linux -2.4連線和linux-2.4.20-8目錄.
二.安裝說明
⒈ [root@kindgeorge src]# cd /usr/src/linux-2.4
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRAVERSION = -8custom
將“EXTRAVERSION = -8custom”改為“EXTRAVERSION = -8”
即:
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRAVERSION = -8
為何要修改呢?因為不同版本的內容是不可以使用的,當不修改時,則變成這個版本(2.4.20-8custom)了,不同時是這樣出錯的:
/lib/modules/2.4.20-8/kernel/net/ipv4/
netfilter /ipt_iprange.o: kernel-module version mismatch (版本錯誤)
/lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipt_iprange.o was compiled for kernel version 2.4.20-8custom
while this kernel is version 2.4.20-8.
/lib/modules/2.4.20-8/kernel/net/ipv4/
netfilter /ipt_iprange.o: insmod /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipt_iprange.o failed
/lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipt_iprange.o: insmod ipt_iprange failed
⒊ [root@kindgeorge
linux -2.4]# make mrproper
'make oldconfig' - 採用以前的 .config 檔案 (編譯時十分有用)
技巧:在make menuconfig時,我們面對眾多的選項常常不知道該如何選擇,此時可以把安裝時的配置檔案copy到/usr/src/linux-2.4中:cp /boot/config-2.4.* /usr/src/linux-2.4/.config,再用make menuconfig編譯,它會讀取.config中原來的配置信息.
解開tar xjvf patch-o-matic-ng-20050331.包後,進入該目錄,就會發現有很多目錄,其實每個目錄對應一個模組.
我們可以這樣來選擇,根據不同貯倉庫submitted|pending|base|extra,例如:
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme base .
或:KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme extra
執行後,會測試是否已經套用和提示你是否套用該模組,但這樣會遍歷所有模組,有很多是用不著的,並且可能和系統版本有衝突,如果不管三七二十一全部選擇的話,一般都會在編譯和使用時出錯.所以推薦用cat /模組目錄名/info 和cat /模組目錄名/help 看過後,認為適合自己,才選擇.
我是針對在上面看過後,有目的的一個一個的套用的,這樣做:
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme string
執行後,會測試是否已經套用和提示你是否套用該模組,按"y"套用.然後繼續下一個
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme comment
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme connlimit
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme time
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme iprange
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme geoip
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme nth
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme ipp2p
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme quota
上面全部完成後,
cd /usr/src/linux-2.4
make menuconfig,確認[*] Prompt for development and/or incomplete code/drivers要選中
然後進入Networking options
再進入IP:Netfilter Configuration,會看到增加很多模組,每個新增的後面都會出現"NEW",把其想要的選中為模組"M"
(三).編譯netfilter模組
⒈這裡只需要編譯netfilter,不需要編譯整個
核心 和模組.這裡我只需要ipv4的,ipv6我還沒用到,所以不管了
cd /usr/src/linux-2.4
make dep
make modules SUBDIRS=net/ipv4/netfilter
⒉建立一個新目錄備份原來模組,以防萬一:
mkdir /usr/src/netfilter
cp /lib/modules/2.4.20-8/kernel/net/ipv4/
netfilter /*.o /usr/src/netfilter/
⒊套用新的模組
cp -f /usr/src/linux-2.4/net/ipv4/netfilter/*.o /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/
⒋更新你的modules.dep
當出現這個時,可以不用理會,因為ipchains,ipfwadm模組都沒用,也可以把出錯的刪除.
depmod: *** Unresolved symbols in /lib/modules/2.4.20-8/kernel/net/ipv4/
netfilter /ipchains_core.o
depmod: *** Unresolved symbols in /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipfwadm_core.o
(四).編譯安裝新的iptables
解壓後有目錄iptables-1.3.1
cd /usr/src/iptables-1.3.1
export KERNEL_DIR=/usr/src/linux-2.4
export IPTABLES_DIR=/usr/src/iptables-1.3.1
make BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man install
三.安裝完成,測試及套用
iptables -I FORWARD -m string --string "360" -j DROP
iptables -I FORWARD -s 192.168.3.159 -m string --string" -j DROP
iptables -I FORWARD -d 192.168.3.0/24 -m string --string "寬頻影院" -j DROP
iptables -I FORWARD -s 192.168.3.0/24 -m string --string "色情" -j DROP
iptables -I FORWARD -p tcp --sport 80 -m string --string "廣告" -j DROP
⒉備註套用
iptables -I FORWARD -s 192.168.3.159 -p tcp --dport 80 -j DROP -m comment --comment "the bad guy can not online"
iptables -I FORWARD -s 192.168.3.159 -m string --string " -j DROP -m comment --comment "denny go to
⒊並發連線套用
模組 connlimit 作用:連線限制
--connlimit-above n 限制為多少個
--connlimit-mask n 這組主機的掩碼,默認是connlimit-mask 32,即每ip.
這個主要可以限制區域網路用戶的網路使用,對伺服器而言則可以限制每個ip發起的連線數...比較實用
例如:只允許每個ip同時5個80連線埠轉發,超過的丟棄:
iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP
例如:只允許每組ip同時10個80連線埠轉發:
iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP
例如:為了防止DOS太多連線進來,那么可以允許最多15個初始連線,超過的丟棄.
/sbin/iptables -A INPUT -s 192.186.1.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
/sbin/iptables -A INPUT -s 192.186.1.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
⒋ip範圍套用
iptables -A FORWARD -m iprange --src-range 192.168.1.5-192.168.1.124 -j ACCEPT
⒌每隔N個匹配
iptables -t mangle -A PREROUTING -m nth --every 10 -j DROP
⒍封殺BT類P2P軟體
iptables -A FORWARD -m ipp2p --
edk --kazaa --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP
⒎配額匹配
iptables -I FORWARD -s 192.168.3.159 -p tcp --dport 80 -m quota --quota 500 -j DROP
iptables -I FORWARD -s 192.168.3.159 -p tcp --dport 80 -m quota --quota 500 -j ACCEPT
以上均測試通過,只有geoip的geoipdb.bin沒下載到,所以沒測試
在此僅為拋個磚頭,更多的套用,要根據自己的需要來組合各個規則和模組了.
相關命令 用iptables -ADC 來指定鏈的規則,-A添加 -D刪除 -C 修改
iptables - [RI] chain rule num rule-specification[option]
用iptables - RI 通過規則的順序指定
iptables -D chain rule num[option]
刪除指定規則
iptables -[LFZ] [chain][option]
用iptables -LFZ 鏈名 [選項]
iptables -[NX] chain
用 -NX 指定鏈
iptables -P chain target[options]
指定鏈的默認目標
iptables -E old-chain-name new-chain-name
-E 舊的鏈名 新的鏈名
用新的鏈名取代舊的鏈名
操作方法 啟動及關閉iptables
設定iptables開機啟動
chkconfig iptables on
chkconfig iptables off
即時啟動iptables
service iptables start
即時關閉iptables
service iptables stop
ubuntu中啟動及關閉iptables
在ubuntu中由於不存在 /etc/init.d/iptales檔案,所以無法使用service等命令來啟動iptables,需要用modprobe命令。
啟動iptables
modprobe ip_tables
關閉iptables(關閉命令要比啟動複雜)
iptables -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
modprobe -r ip_tables
依次執行以上命令即可關閉iptables,否則在執行modproble -r ip_tables時將會提示
FATAL: Module ip_tables is in use.
保存和恢復 IPTables 規則
防火牆規則只在計算機處於開啟狀態時才有效。如果系統被重新引導,這些規則就會自動被清除並重設。要保存規則以便今後載入,請使用以下命令:
[span]/sbin/service iptables save
[span]保存在 /etc/sysconfig/iptables 檔案中的規則會在服務啟動或重新啟動時(包括機器被重新引導時)被套用。
規則示例 下面是適合Web伺服器的iptables規則:
iptables指令 IPT="/sbin/iptables"
$IPT --delete-chain
$IPT --flush
$IPT -P INPUT DROP #1
$IPT -P FORWARD DROP#1
$IPT -P OUTPUT DROP #1
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #2
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT#3
$IPT -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT #3
$IPT -A INPUT -i lo -j ACCEPT #4
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT#5
$IPT -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #5
$IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #6
$IPT -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT #7
$IPT -A OUTPUT -o lo -j ACCEPT #4
$IPT -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT #8
$IPT -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT #9
$IPT -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT#10
$IPT -A OUTPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #10
service iptables save
service iptables restart
存為腳本iptables. sh,執行sh iptables. sh自動配置防火牆。
解釋:
#1、設定INPUT,FORWARD,OUTPUT鏈默認target為DROP,也就是外部與伺服器不能通信。
#2、設定當連線狀態為RELATED和ESTABLISHED時,允許數據進入伺服器。
#3、設定外部客戶端連線伺服器連線埠80,22,21,873。
#4、允許內部數據循回。
#5、允許外部ping伺服器。
#6、設定狀態為RELATED和ESTABLISHED的數據可以從伺服器傳送到外部。
#7、允許伺服器使用外部dns解析域名。
#8、設定伺服器連線外部伺服器連線埠80。
#9、允許伺服器傳送郵件。
#10、允許從伺服器ping外部。
iptables保存:iptables-save
iptables還原:iptables-restore
版本發布 2010年10月30日,iptables 1.4.10 發布,支持2.6.36核心。
2012年03月28日,iptables 1.4.13 發布 Linux防火牆。
2012年12月28日,iptables 1.4.17 發布,Linux防火牆。