友情提醒:本文實驗環境 vmware 10 + Centos 6.6 X86_64,文件命令請謹慎使用
1 事前必知:
1)什麼是防火牆?
防火牆:工作於主機或網絡邊緣,對於進出的報文根據事先定義的規則做檢查,被匹配到的報文作出相應處理的組件。
所以:
(1)防火牆不是殺毒軟件。
(2)既然是根據規則檢查報文,存在2個問題:規則定義嚴格了,使用者覺着彆扭;定義鬆散了形同虛設,還佔用內核資源。
2)centos6.6上防火牆的組件:
netfilter:過濾器,內核中工作在tcp/ip網絡協議棧上的框架
iptables:過濾規則的編寫工具,定義的規則通過內核接口直接送至內核,因此,會立即生效,但不會永久有效;iptables可以自動實現規則語法檢查。
所以:
(1)非專業叫法中的iptables防火牆,全名是 netfilter/iptables 防火牆,是個軟件防火牆,所以性能嘛,你懂的。
(2)只要內核中編譯有netfilter它就在內核中存在,我們所說的停止防火牆服務,其實是清除被加載到內存中的iptables定義的規則。沒有了過濾規則,netfilter就像沒有牙齒的老虎。將來在定製服務器OS內核時就不要選netfileter模塊,還有selinux通通去掉,讓服務器在外圍硬件防火牆,IPS,IDS保護下“裸奔”。
3)網絡協議棧和硬件驅動管理都是OS內核的工作。
所以:
(1)網卡上報文的接受和發出都受OS內核的管理
(2)報文的路由處理和報文的合法合理性檢查也在內核的TCP/IP協議棧上進行
(3)主機提供的資源服務如httpd 是在用戶空間的事務,而跟該資源服務相關的報文的接收和投遞是內核空間的事務。接收的資源請求報文在內核空間,對報文的合法合理性檢查後,根據報文中定義的傳輸層端口號找到用戶空間中的進程來進行後續的處理。
2 netfilter/iptables是檢查報文的卡點和功能表
netfilter框架可以對進出的報文實施3種功能:過濾,修改,追蹤。爲了完成這3項功能,準備了5個卡點對報文進行影響。卡點,專業叫法爲鉤子函數,爲了好理解,這裏稱爲卡點。
1)檢查報文的卡點:
網卡進--->prerouting------>路由判斷----->forward------->postrouting---->網卡出
| |
| output
| |
input (路由判斷)
|---->-------本地進程資源--->-----|
prerouting:路由判斷之前
input:路由判斷後要進入本機內部獲取本地服務資源
output:路由判斷後要送出本機
forward:路由判斷後要途徑本機轉發
postrouting:路由判斷後,即將要發出本機
根據報文的分類,要經過的卡點如下:
到本機內部:prerouting,input
由本機發出:output,postrouting
由本機轉發:prerouting,forward,postrouting
這些卡點下文稱爲鏈,我們使用iptables工具定義的過濾規則在邏輯上附着在鏈上,對進出的數據包進行處理。
2)功能表:
上面已經提到 netfilter框架可以對進出的報文實施3種功能:過濾,修改,追蹤。這3項功能在netfilter框架中通過4個功能表來代表:
過濾功能:filter表
使用的卡點(下文稱爲鏈):input ,forward,output
修改功能:net表:修改報文的源地址和目標地址。
使用的卡點(下文稱爲鏈):prerouting,output,postrouting
mangle表:修改報文IP,TCP報文首部的某些信息。
使用的卡點(下文稱爲鏈):prerouting,postrouting,input,output,forward
追蹤功能:raw表
使用的卡點(下文稱爲鏈):prerouting,output
3)功能表的優先級:
可以看到在同一個卡點上存在多個功能表的現象,誰先誰後檢查呢?它們存在一個優先級的問題:
高--->低:raw--->mangle--->nat--->filter
所以內核調用netfilter框架中表,表要調用相應的鏈,鏈使用規則來處理報文,這就是netfilter/iptables防火牆的工作邏輯。
3 iptables規則的書寫
iptables書寫規則的格式:
#iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
-t TABLE: -t 指定表,TABLE爲表名稱,當省略該選項時,默認後面定義的規則 指施加在filter表的規則鏈上。
[ ]中爲可選內容,下同。
3.1)查看規則:
#iptables [-t TABLE] -L [ -n -v -x --line-numbers]
-t TABLE: -t 指定表,TABLE爲表名稱,當省略該選項時,默認後面定義的規則 指施加在filter表的規則鏈上。
-L:list,列出指定鏈上所有規則
-n:numeric,以數字格式顯示地址和端口,而不反解爲域名和端口服務名。
-v:verbose,詳細格式
--line-numbers:顯示規則編號
-x:exactly,顯示計數器的精確值,不做單位換算。每個鏈上有2個計數器:1個記錄當前規則所匹配到的報文個數,2記錄當前規則匹配到的報文大小之和
舉例:
1查看net表現有的規則:
2查看filter表的現有規則:
3.2)清除表已定義的規則
#iptables [-t TABLE] -F [chain [rulenum]]
#iptables [-t TABLE] -X [chain]
#iptables [-t TABLE] -Z [chain [rulenum]]
*當省略 -t TABLE時,默認爲filter表。
-F:flush,清空指定鏈上的規則,當沒有指定鏈名時,爲該表中所有鏈上的說有規則
-X:drop,刪除用戶自定義的空鏈,非空自定義鏈,系統內置鏈無法刪除。當沒有指定鏈名時,爲該表中所有自定義的鏈。
-Z:zero,置0,每個鏈上有2個計數器:1個記錄當前規則所匹配到的報文個數,2記錄當前規則匹配到的報文大小之和。當沒有指定鏈名時,爲該表中所有鏈。
舉例:
1)清除filter表中input鏈的規則:
2)清除filter表中所有已定義的規則:
3.3)定義新過濾規則:
既然是過濾規則,那麼規則一般用在filter表的鏈上。
3.3.1)自定義鏈和重命名自定義鏈
自定義鏈只能作爲表中默認鏈的跳轉對象,即在默認鏈通過引用自定義鏈,來生效自定義鏈上的規則。
#iptables [-t TABLE] -N chain-name
#iptables [-t TABLE] -E old-chain-name new-chain-name
*當省略 -t TABLE時,默認爲filter表。
-N:new,新建一個用戶自定義的鏈
-E:rename,重命名自定義的鏈。自定義鏈被引用時無法被重命名。
舉例:
1.在net表中定義一個名爲webrules的新自定義鏈:
2.將net表自定義的鏈webrules重命名爲httpdrules:
3.3.2)定義基本的規則
#iptables [-t TABLE] {-A|-I } CHAIN CRETERIA -j TARGET
*當省略 -t TABLE時,默認爲filter表。
-A:append,在鏈尾追加一條規則
-I:insert,在指定位置插入一條規則,
-I CHAIN n 爲該規則在現有鏈規則中的位置編號,從1開始,自上而下。當n省略時,默認插入放在該鏈的第一條。
CHAIN:鏈名,要根據TABLE來決定,也可是表中自定義的鏈
CRETERIA:匹配條件
主要是:IP首部,TCP,UDP或ICMP首部中信息。
匹配條件:(匹配條件可以有多個,要同時都滿足。)
!-s: !表示取反。
-s,--src,--source:檢查報文中的源ip地址
-d,--dst,--destination:檢測報文中的目標IP地址
-p,--protocol:檢查報文中的協議,即IP報文中被protocols標識的協議 { tcp |udp|icmp}
-i,--interface:檢測報文的流入的接口,通常只用於prerouting,input,forward鏈
-o,--out-interface:檢測報文的流出接口,通常只用於forward,output,postrouting鏈
--sport:指定源端口,必須存在-p 協議
--dport:指定目標端口,必須存在-p 協議
TARGET:處理動作
基本的規則中使用的有3個(需大寫):
DROP:放棄數據包,無任何信息返回
ACCEPT:接受數據包
REJECT:拒絕數據包,有返回信息,不推薦使用,除了在內網或做測試時使用。
舉例:
(1)接受來自192.168.100.0/24 網段,到達本地192.168.100.1/24 eth1 網卡的關於80端口的請求包,其它來源的全部拒絕。
(2)只接受icmp的ping返回包,其餘的icmp包請求拒絕,這樣我可以ping通別人,別人ping不通我。
3.3.3)規則的刪除
#iptables [-t TABLE] -D CHAIN n
*當省略 -t TABLE時,默認爲filter表。
-D:刪除
CHAIN:鏈名
n:規則在鏈中位置編號,從1開始,自上而下。
舉例:刪除filter表中input鏈上第二條規則
3.3.4)替換現有的規則
#iptables [-t TABLE] -R CHAIN n NEW-RULE
*當省略 -t TABLE時,默認爲filter表。
-R:replace,替換指定的規則
CHAIN:鏈名
n:規則在鏈中位置編號,從1開始,自上而下。
NEW-RULE:新的規則
舉例:修改現有關於80端口的拒絕規則爲,拒絕其它所有到達本機任一網卡的請求。
3.3.5)定義默認規則:
每一個鏈中都應定義默認規則,用來處理該鏈中現有規則匹配不到的數據包,但是操作遠程主機時,請注意不要因默認規則將自己擋在主機外。
#iptables [-t TABLE] -P CHAIN TARGET
*當省略 -t TABLE時,默認爲filter表。
-P :設置默認處理規則
TARGET:處理動作,只有DROP和ACCEPT可選。
舉例:將現有input鏈的默認規則定義爲DROP
4 iptables規則書寫的原則
1)鏈中規則從首至尾進行規則匹配,先匹配到的,數據包被處理,鏈中餘下規則不在進行檢測。
2)同類規則,範圍小的放上面
3)不同類的規則,匹配機率大的放上面
4)應該設置默認規則,處理被規則都不匹配的報文
好吧,這就是Centos 6.6上 netfilter/iptables防火牆的基本用法,下篇博文預計寫下面的內容:
1)使用netfilter/iptables 將Linux主機做成nat服務器,
2)filter過濾規則的擴展匹配使用
3)iptables規則的優化
4)iptables規則的保存
5)給內核打補丁,使netfilter/iptables可過濾應用層內容。
時間過的真快, 寫這篇小文又浪費半天,哥只有1天休息時間,餘下的時間去玩mariadb,擼python啦!!除了喝酒吃肉的事不要想起我。