IPTABLES

IPTABLES

過濾系統
iptables 是與最新的 3.5 版本 Linux 内核集成的 IP 信息包過濾系統。如果 Linux 系統連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器, 則該系統有利于在 Linux 系統上更好地控制 IP 信息包過濾和防火牆配置。防火牆在做信息包過濾決定時,有一套遵循和組成的規則,這些規則存儲在專用的信 息包過濾表中,而這些表集成在 Linux 内核中。在信息包過濾表中,規則被分組放在我們所謂的鍊(chain)中。而netfilter/iptables IP 信息包過濾系統是一款功能強大的工具,可用于添加、編輯和移除規則。雖然 netfilter/iptables IP 信息包過濾系統被稱為單個實體,但它實際上由兩個組件netfilter 和 iptables 組成。netfilter 組件也稱為内核空間(kernelspace),是内核的一部分,由一些信息包過濾表組成,這些表包含内核用來控制信息包過濾處理的規則集。iptables 組件是一種工具,也稱為用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否則需要下載該工具并安裝使用它。[1]
    中文名:iptables 外文名: 用途: 優點:配置有狀态的防火牆 有效狀态:ESTABLISHED 、 INVALID 組件:netfilter 和 iptables 版本:Red Hat Linux 7.1

命令說明

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(修改路由之前本地的包)。

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這樣的格式。注意它隻對來自以太設備并進入PREROUTING、FORWORD和INPUT鍊的包有效。

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

這個模塊和與netfilter過濾器标記字段匹配(就可以在下面設置為使用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

用來設置包的netfilter标記值。隻适用于mangle表。

--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]

可以指定一個單一的新的IP地址,一個IP地址範圍,也可以附加一個端口範圍(隻能在指定-p tcp 或者-p udp的規則裡)。如果未指定端口範圍,源端口中512以下的(端口)會被安置為其他的512以下的端口;512到1024之間的端口會被安置為1024以下的,其他端口會被安置為1024或以上。如果可能,端口不會被修改。

--to-destiontion [-][:port-port]

可以指定一個單一的新的IP地址,一個IP地址範圍,也可以附加一個端口範圍(隻能在指定-p tcp 或者-p udp的規則裡)。如果未指定端口範圍,目标端口不會被修改。

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中有幾個不同的鍊。

相關應用

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

⒉ [root@kindgeorge linux-2.4]# vi Makefile,

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

⒋ [root@kindgeorge linux-2.4]# make oldconfig

'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中原來的配置信息.

(二).給netfilter打補丁

解開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模塊

⒈這裡隻需要編譯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

depmod -a

當出現這個時,可以不用理會,因為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

三.安裝完成,測試及應用

1.内容過濾

iptables -I FORWARD -m string --string "騰訊" -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沒下載到,所以沒測試

在此僅為抛個磚頭,更多的應用,要根據自己的需要來組合各個規則和模塊了.

規則示例

下面是适合Web服務器的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

相關詞條

相關搜索

其它詞條