Iptables防火牆(一)

Iptables防火牆(一)

1,Linux防火牆基礎

Linux防火牆主要工作在網絡層,針對TCP/IP數據包實施過濾和限制,屬於典型的包過濾防火牆(或稱網絡層防火牆)。Linux防火牆體系基於內核編碼實現。

Netfilteriptables都被稱爲防火牆,主要區別如下:

Netfilter:指的是Linux內核中實現包過濾防火牆的內部結構,不依程序或文件的形式存在,屬於內核態(又稱內核空間)的防火牆功能體系

Iptables:指的是用來管理linux防火牆的命令程序,通常位於/sbin/iptables,屬於用戶態(又稱用戶空間)的防火牆管理體系。

2.iptables防火牆中的表

Filter表:filter表用來對數據包進行過濾。對應的內核模塊爲iptable_filter。表內包含三個鏈:INPUTFORWARD,OUTPUT

Nat表:主要用來修改數據包的ip地址,端口號等信息。對應的內核模塊爲iptable_nat.表內包含三個鏈:PREROUTINGPOSTROUTINGOUTPUT.

Mangle表:mangle表主要用來修改數據包的TOStype of server,服務類型)。TTL(生存週期)值,或者爲數據包設置Mark標記,以實現流量整形,策略路由等高級應用,manle表對應的內核模塊爲iptable_mangle。表內包含五個鏈:PREROUTINGPOSTROUTINGINPUTOUTPUTFORWARD

Raw表:raw表是自1.2.9以後版本的iptables新增的表,主要用來決定是否對數據包進行狀態跟蹤,raw表對應的內核模塊爲iptable_raw。表內包含兩個鏈:OUTPUTPREROUTING

3.規則鏈

Iptables默認劃分爲五種不同的規則鏈

INPUT鏈:當收到訪問防火牆本機地址的數據包(入站)時,應用此鏈中的規則

OUTPUT鏈:當防火牆本機向外發送數據包(出站)時,應用此鏈彙總的規則。

FORWARD:當接收到需要通過防火牆中轉發送給其他地址的數據包(轉發)時,應用此鏈中的規則。

PREROUTING:在對數據包作路由選擇之前,應用此鏈中的規則

POSTROUTING:在對數據包作路由選擇之後,應用此鏈中的規則

其中INPUT,OUTPUT鏈主要用在“主機型防火牆”中,即主要針對服務器本機進行保護的防火牆,而FORWARDPREROUTINGPOSTROUTING鏈多用在“網絡型防火牆”中,例如使用linux防火牆作爲網管服務器,在公司內網與internet之間進行安全控制。

4數據包過濾的匹配流程。

規則表之間的順序;rawmanglenatfilter

規則鏈之間的順序:規則鏈之間的應用順序取決於數據包的流向。

入站數據流向:來自外界的數據包到達防火牆後,首先被PREROUTING鏈處理(是否修改數據包地址等),然後進行路由選擇(判斷該數據包應發送何處);如果數據包的目標地址時防火牆本機(訪問本機httpd80端口)。那麼該內核將其傳遞給INPUT鏈進行處理(決定是否通過等),通過以後再交給系統上層的應用程序進行處理(如httpd服務器)

轉發數據流向:來自外界的數據包到達防火牆後,首先被PREROUTING鏈進行處理,然後在進行路由選擇,如果數據包的目標地址是其他外部地址(如局域網用戶通過網關訪問qq服務器)。則內核將傳遞給FORWARD鏈進行處理(轉發,丟棄,攔截)。最後交給POSTOUTING鏈(是否修改數據包的地址等)進行處理。

出站數據流向:防火牆本機向外部地址發送的數據包,首先被OUTPUT鏈進行處理。然後進行路由選擇,再交給POSTOUTING鏈(是否修改數據包的地址等)進行處理

5.規則鏈內核各條防火牆之間的順序

當數據包經過每條規則鏈時,依次按第一條規則,第二條規則….的順序進行匹配和處理,鏈內的過濾遵循“匹配即停止的原則”。一旦找到一條相匹配的規則(log日誌操作)則不在檢查本鏈內後續的其他操作。如果對比完整個鏈,沒找到,則按該規則鏈內默認的策略處理。

6.編寫防火牆規則

Iptable命令語法:

Iptables[- t 表名]管理選項[鏈名][匹配條件][- j控制類型]

未指定表名時,將按照默認的使用filter表。

控制類型如下:

ACCPET:允許數據包通過

DROP:直接丟棄數據包,不做出任何迴應信息

REJECT;拒絕數據包通過。必要時會給一些提示。

LOG:在/var/log/messages文件中記錄日誌信息,然後將數據包傳遞給下一條規則。防火牆規則的“匹配即停止”原則對於LOG操作來說是一個特例。因爲LOG只是一種輔助動作,並沒有真正的處理數據包、

Iptables的常用管理選項

-A

在指定鏈的末尾添加一條新的規則

-D

刪除指定鏈中的某一條規則,可根據指定序號或具體內容

-I

在指定鏈中插入一條新的規則,未指定序號時,將默認作爲第一條規則

-R

修改,替換指定鏈中的某一條規則,可指定序號或具體內容

-L

列出指定鏈中的所有的規則,若未指定鏈名。則列出表中的所有鏈

-P

設置指定鏈的默認策略

-n

使用數字形式顯示輸出結構,如顯示ip地址而不是主機名

-v

查看規則列表時顯示詳細的信息

-h

查看命令的幫助信息- -help

--line number

查看規則表時,同時顯示規則在鏈中的序號

注意事項(1)不指定表名時,默認指filter

2)不指定鏈名時,默認指表內的所有鏈

3)設置鏈的默認策略,不用指定匹配條件

例如:在filter表的INPUT鏈中插入一條規則,拒絕發給本機的ICMP協議的數據包

[root@localhost ~]# iptables -t filter -I INPUT -p icmp -j REJECT

上述產生的結果是---其他主機無法ping通主機,但是會有提示。

spacer.gif

Iptables命令基本操作示例:

(1)添加新的規則

若要在filter表的INPUT鏈末尾添加一條防火牆規則。如下:

[root@localhost ~]# iptables -t filter -I INPUT -p tcp -j ACCEPT

當使用管理選項”-I”時,允許同時指定序號,不指定序號時默認是第1

[root@localhost ~]# iptables -I INPUT -p icmp -j ACCEPT

[root@localhost ~]# iptables -I INPUT 2 -p icmp -j DROP

(2)查看規則

使用管理選項“-L”。使用“- -line-number”還可以列出行號

[root@localhost ~]# iptables -L INPUT --line-number

Chain INPUT (policy ACCEPT)

numtargetprot opt sourcedestination

1ACCEPTicmp --anywhereanywhere

2DROPicmp --anywhereanywhere

3ACCEPTtcp--anywhereanywhere

4REJECTicmp --anywhereanywherereject-with icmp-port-unreachable 

5RH-Firewall-1-INPUTall--anywhereanywhere

當防火牆規則較多時,使用-n選項可以以數字形式顯示地址和端口信息,減少地址解析環節,加速命令執行的速度

[root@localhost ~]# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

targetprot opt sourcedestination

ACCEPTicmp --0.0.0.0/00.0.0.0/0

DROPicmp --0.0.0.0/00.0.0.0/0

ACCEPTtcp--0.0.0.0/00.0.0.0/0

REJECTicmp --0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable 

RH-Firewall-1-INPUTall--0.0.0.0/0 0.0.0.0/0

//nL可以一起寫。

3)刪除,清空規則

刪除一條管理規則時,使用管理選項“-D”。(指定序號,因爲只是刪除一條)

[root@localhost ~]# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

targetprot opt sourcedestination

ACCEPTicmp --0.0.0.0/00.0.0.0/0

DROPicmp --0.0.0.0/00.0.0.0/0

ACCEPTtcp--0.0.0.0/00.0.0.0/0

REJECTicmp --0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable 

RH-Firewall-1-INPUTall--0.0.0.0/00.0.0.0/0

[root@localhost ~]# iptables -D INPUT 1

[root@localhost ~]# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

targetprot opt sourcedestination

DROPicmp --0.0.0.0/00.0.0.0/0

ACCEPTtcp--0.0.0.0/00.0.0.0/0

REJECTicmp --0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable 

RH-Firewall-1-INPUTall--0.0.0.0/00.0.0.0/0

清空指定鏈或表中所有防火牆規則。使用管理選項“-F”、

[root@localhost ~]# iptables -F INPUT

[root@localhost ~]# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

targetprot opt sourcedestination

使用管理選項-F時,允許省略鏈名而清空指定表所有鏈的規則。

[root@localhost ~]# iptables -t filter -F

[root@localhost ~]# iptables -t raw -F

[root@localhost ~]# iptables -t mangle -F

[root@localhost ~]# iptables -t nat –F

4)設置默認策略

Iptables的各條鏈中,默認策略是規則匹配的最後一個環節-----當找不到任何一個能夠區配的數據包時,則執行默認策略。默認策略的控制類型爲ACCEPT(允許)。DROP(丟棄)這兩種。注意:在選擇協議的時候用的是p。在設置默認策略的時候選用的是P

[root@localhost ~]# iptables -P FORWARD DROP

[root@localhost ~]# iptables -P OUTPUT ACCEPT

【注意使用-F清空鏈時,默認的策略不受影響。它並不參與規則的排序。因此在設置之前之後並無區別】

6規則的匹配條件

匹配條件的設置分爲三大類:1.通用匹配2.隱含匹配3.顯式匹配

1.通用匹配也被稱爲常規匹配。這種匹配方式可以獨立使用。不依賴於其他條件或擴展模塊。常見的通用匹配包括協議匹配,地址匹配、網絡接口匹配

1)協議匹配

編寫iptables規則時使用“-p 協議名”的形式指定,用來檢查數據包所使用的網絡協議。

例如:若要丟棄通過icmp協議訪問防火牆本機的數據包。允許轉發除icmp協議意以外的數據包

[root@localhost ~]# iptables -I INPUT -p icmp -j DROP

[root@localhost ~]# iptables -I FORWARD -p ! icmp -j ACCEPT

[root@localhost ~]#

!表示取反

2)地址匹配

編寫iptables規則時使用-s 源地址”,“-d 目標地址”的形式指定。Ip地址,網段等都是可以接受的。但不建議使用主機名,域名的方式。會降低效率

[root@localhost ~]# iptables -I OUTPUT -s 192.168.236.128 -j REJECT

[root@localhost ~]# iptables -I FORWARD -d 192.168.236.1 -j REJECT

[root@localhost ~]# iptables -I FORWARD -d 192.168.236.128 -j REJECT

[root@localhost ~]# iptables -I FORWARD -d 192.168.236.0/24 -j REJECT

[root@localhost ~]# iptables -I OUTPUT -s 192.168.236.0/24 -j REJECT

-------------------------------------------------網段形式也可以使用

當遇到小規模的網絡掃描或***時。封ip是很方便的做法。例如 192.168.128.0這個網段老是頻繁掃描。例如:

[root@localhost ~]# iptables -I INPUT -s 192.168.128.0/24 -j DROP

3)網絡接口匹配

編寫iptables規則時使用“-i 接口名”和“-o 接口名”的形式。用來檢查數據包從防火牆的哪一個接口進入或發出。分別對應入站網卡(--in-interface)。出站網口(--out-interface

[root@localhost ~]# iptables -A INPUT -i eth1 -s 192.168.128.0/24 -j REJECT

[root@localhost ~]# iptables -A INPUT -i eth1 -s 192.168.128.1 -j DROP

[root@localhost ~]# iptables -A INPUT -i eth1 -j DROP

[root@localhost ~]# iptables -A OUTPUT -o eth1 -j DROP

2.隱含匹配

這種匹配方式要求以指定的協議匹配作爲前提條件,相當於子條件,因此無法獨立使用,其對應的功能由iptables在需要時自動(隱含)載入內核。常見的隱含匹配包括端口匹配,TCP標記匹配.ICMP類型匹配

1)端口匹配

編寫iptables規則時使用“- -sport源端口”或“- - dport目標端口”的形式,針對的協議爲TCPUDP,用來檢查數據包的源端口(- -source-port)或目標端口(--destination-port)、單個端口號或者以冒號“:”分隔的端口範圍都是可以接受的,但不連續的多個端口不能採用這種方式。例如,若要允許爲網段192.168.4.0/24轉發DNS查詢數據包:

[root@localhost ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT

[root@localhost ~]# iptables -A FORWARD -d 192.168.4.0/24 -p udp --dport 53 -j ACCEPT

在例如,構建vsftpd服務器時,若要開放2021端口,以及用於被動模式的端口範圍24500~24600

[root@localhost ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT

[root@localhost ~]# iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT

2)TCP標記匹配

編寫iptables規則時使用“—tcp-flags”檢查範圍被設置的標記“的形式針對的協議爲TCP。用來檢查數據包的標記位(--tcp-flags)。其中檢查範圍指出需要檢查數據包的哪幾個標記,”被設置的標記“則明確匹配對應值爲1的標記,多個標記之間以逗號分隔

例如,若要拒絕從外網接口(eth 1)直接訪問防火牆本機的TCP請求,但其他主機發給防火牆的TCP相應等數據包應允許。可以執行以下操作

spacer.gif

3)ICMP類型匹配

編寫iptables規則時使用“- -icmp-type ICMP 類型”的形式。針對的協議爲ICMP,用來檢查ICMP數據包的類型(--icmp-type)、ICMP類型使用字符串或數字代碼表示、

Echo-Request(代碼爲8)請求不可達

Echo-Reply(代碼爲0)回顯

Descination-Unreachable(代碼爲3)目標不可達

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT

[root@localhost ~]# iptables -A INPUT -p icmp -j DROP

關於更多可用的ICMP協議類型。可以執行

spacer.gif

3.顯示匹配

這種匹配方式要求有額外的內核模塊提供支持,必須手動以“-m 模塊名稱”的形式調出相應的模塊,然後方可設置匹配條件。添加了帶顯式匹配條件的規則以後,可以執行“lsmod| grep xt_”命令查看到相關的內核擴展模塊(如xt_multiportxt_iprangext_macxt_state)。常見的顯式匹配方式包括多端口匹配,ip範圍匹配。MAC地址匹配,狀態匹配

1)多端口匹配

編寫iptables規則時使用“-m multiport – dports 端口列表”。“-m multiport –sports 端口列表”的形式,用來檢查數據包的源端口,目標端口、多個端口之間以逗號進行分隔。例如,若要允許本機開放25 .80 .110. 143端口。以便提供電子郵件服務

[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT

2IP 地址範圍匹配

編寫iptables規則時使用“-m iprange –src-range IP 範圍”,“-m iprange - -dst-range IP 範圍”的形式,用來檢查數據包的源地址,目標地址,其中IP範圍採用“起始地址-結束地址”的形式表示。例如,若要禁止轉發源ip地址位於192.168.4.21192.168.4.28之間的TCP數據包,可以執行以下操作:

[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT

3MAC地址匹配

編寫iptables規則時使用“-m mac - -mac-source MAC 地址”的形式用來檢測數據包的源MAC地址,由於MAC地址本身的侷限性,此類匹配條件一般只適用於內部結構

例如若要根據MAC地址封鎖主機。禁止其訪問本機的任何應用。可以執行以下操作:

[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP

4)狀態匹配

編寫iptables規則時使用“-m state –state 連接狀態”的形式,基於iptables的狀態跟蹤機制用來檢查數據包的連接狀態。常見的連接狀態包括NEW(與任何連接無關的),ESTABLISHED(響應請求或者已建立連接的)和RELATED(與已有連接有相關性的,如FTP數據連接)例如,若要禁止轉發與正常TCP連接無關的飛–syn請求數據包(如僞造的一些網絡***數據包)、

[root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP

在例如,若只開放本機的web服務(80端口)、但對發給本機的TCP應答數據包予以放行,其他入站數據包均丟棄,則對應的入站控制規則可參考

[root@localhost ~]# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT

[root@localhost ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

[root@localhost ~]# iptables -P INPUT DROP

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章