Iptables防火牆(一)
1,Linux防火牆基礎
Linux防火牆主要工作在網絡層,針對TCP/IP數據包實施過濾和限制,屬於典型的包過濾防火牆(或稱網絡層防火牆)。Linux防火牆體系基於內核編碼實現。
Netfilter和iptables都被稱爲防火牆,主要區別如下:
Netfilter:指的是Linux內核中實現包過濾防火牆的內部結構,不依程序或文件的形式存在,屬於內核態(又稱內核空間)的防火牆功能體系
Iptables:指的是用來管理linux防火牆的命令程序,通常位於/sbin/iptables,屬於用戶態(又稱用戶空間)的防火牆管理體系。
2.iptables防火牆中的表
Filter表:filter表用來對數據包進行過濾。對應的內核模塊爲iptable_filter。表內包含三個鏈:INPUT,FORWARD,OUTPUT
Nat表:主要用來修改數據包的ip地址,端口號等信息。對應的內核模塊爲iptable_nat.表內包含三個鏈:PREROUTING,POSTROUTING,OUTPUT.
Mangle表:mangle表主要用來修改數據包的TOS(type of server,服務類型)。TTL(生存週期)值,或者爲數據包設置Mark標記,以實現流量整形,策略路由等高級應用,manle表對應的內核模塊爲iptable_mangle。表內包含五個鏈:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。
Raw表:raw表是自1.2.9以後版本的iptables新增的表,主要用來決定是否對數據包進行狀態跟蹤,raw表對應的內核模塊爲iptable_raw。表內包含兩個鏈:OUTPUT,PREROUTING。
3.規則鏈
Iptables默認劃分爲五種不同的規則鏈
INPUT鏈:當收到訪問防火牆本機地址的數據包(入站)時,應用此鏈中的規則
OUTPUT鏈:當防火牆本機向外發送數據包(出站)時,應用此鏈彙總的規則。
FORWARD:當接收到需要通過防火牆中轉發送給其他地址的數據包(轉發)時,應用此鏈中的規則。
PREROUTING:在對數據包作路由選擇之前,應用此鏈中的規則
POSTROUTING:在對數據包作路由選擇之後,應用此鏈中的規則
其中INPUT,OUTPUT鏈主要用在“主機型防火牆”中,即主要針對服務器本機進行保護的防火牆,而FORWARD,PREROUTING,POSTROUTING鏈多用在“網絡型防火牆”中,例如使用linux防火牆作爲網管服務器,在公司內網與internet之間進行安全控制。
4數據包過濾的匹配流程。
規則表之間的順序;raw→mangle→nat→filter
規則鏈之間的順序:規則鏈之間的應用順序取決於數據包的流向。
入站數據流向:來自外界的數據包到達防火牆後,首先被PREROUTING鏈處理(是否修改數據包地址等),然後進行路由選擇(判斷該數據包應發送何處);如果數據包的目標地址時防火牆本機(訪問本機httpd的80端口)。那麼該內核將其傳遞給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通主機,但是會有提示。
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目標端口”的形式,針對的協議爲TCP或UDP,用來檢查數據包的源端口(- -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服務器時,若要開放20,21端口,以及用於被動模式的端口範圍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相應等數據包應允許。可以執行以下操作
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協議類型。可以執行
3.顯示匹配
這種匹配方式要求有額外的內核模塊提供支持,必須手動以“-m 模塊名稱”的形式調出相應的模塊,然後方可設置匹配條件。添加了帶顯式匹配條件的規則以後,可以執行“lsmod| grep xt_”命令查看到相關的內核擴展模塊(如xt_multiport,xt_iprange,xt_mac,xt_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
2)IP 地址範圍匹配
編寫iptables規則時使用“-m iprange –src-range IP 範圍”,“-m iprange - -dst-range IP 範圍”的形式,用來檢查數據包的源地址,目標地址,其中IP範圍採用“起始地址-結束地址”的形式表示。例如,若要禁止轉發源ip地址位於192.168.4.21與192.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
3)MAC地址匹配
編寫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