iptables是Linux中的重要組件,它是對報文進行過濾,在2001年的1月Linux 2.4內核發布以來,就已經是Linux的一部分了。
現在的iptbales已經成為了功能很大的防火墻,具備了專有的商業防火墻的大多數的功能了。
1、防火墻簡介
防火墻是我們在外網接收數據進行過濾的第一道防線,也可能是最后一道防線,它是一個隔離工具,工作在主機或網絡的邊緣,對經由的報文根據預先定義好的規則或者說是識別標準進行檢測,對于能夠匹配到的報文則根據預先生成的規則進行處理的一套組件。防火墻也有分類,其分類主要以下兩種:
硬件防火墻:主要在硬件級別上實現部分功能。
軟件防火墻:主要在應用軟件邏輯在通用硬件的基礎上實現。
2、iptables/netfilter簡介
iptables是一個生成規則,可以保存到文件重載使用的一個用戶命令,工作在應用層當中,它解析命令行并將防火墻策略傳遞給內核。而在netfilter中,它是一個防火墻的框架,將iptables的規則承載并生效,本身并不對數據包進行過濾,它只是允許可以過濾數據包的函數掛接到內核中適當位置。
3、規則鏈與策略
眾所周知,內核是面向硬件從而用來對硬件進行管理和驅動,它也有不同的功能,進程管理、內存功能、網絡協議棧功能、安全功能、文件系統、驅動程序等。那么防火墻就工作在網絡協議棧上,它是安全功能的一種,其功能在內核中共分為五個,分別是路由前(prerouting)、路由后(postrouting)、導入(input)、導出(output)和轉發功能(forward)。使其規則生效,我們稱之為鉤子函數,工作在netfilter之上。我們可以自己定義一個規則鏈,而后手動關聯至指定的鉤子上,使其生效。
在iptables命令當中對以上功能是一樣的,不過是要在netfilter當中生效,對于在iptables當中來說,我們稱之為"規則鏈",我們自己定義規則是要寫到上面去的,而每個鏈都有屬于它的功能,其功能分為四個,我們稱之為"表",優先級我們也是由高而低。分別是:
raw::關閉nat表上啟用的鏈接追蹤機制 mangle:拆解報文,做出修改,而后重新封裝 NAT:負責地址解析轉換。修改數據包中的源、目標IP地址或端口 filter:對數據包進行過濾
每一個功能對應一個鉤子函數,分別是:
raw:prerouting、output mangle:prerouting、forward、postrouting、input、output nat: prerouting、input、output、postrouting filter:input、forward、output
4、iptables命令使用
我們知道,我們的操作都是在shell界面下來進行的,根本無法直接接觸內核,對于防火墻來說也是一樣,它也是有用戶命令的,可以定義不同的表,每個表都包含幾個內部的鏈,也能包含用戶定義的鏈。
每個鏈都是一個規則列表,對對應的包進行匹配:每條規則指定應當如何處 理與之相匹配的包。這被稱作'target'(目標),也可以跳向同一個表內的用戶定義的鏈。安裝netfilter位于內核中的tcp/ip協議棧報文處理框架,對于iptables來說,在CentOS
5/6中用來生成規則,可保存于文件中以反復裝載生效。
iptables的命令格式如下:
# iptables [-t table] COMMAND [chain] [PARAMETERS] [-m matchname [per-match-options]][-j targetname [per-target-options]]
以上就是命令的格式,使用iptables管理時,都會有它的子命令,其子命令如下:
COMMANDs:
鏈管理:
-N, --new-chain chain 新建一個自定義的鏈 -X, --delete-chain [chain] 刪除用戶自定義的引用計數器為0的鏈 -F, --flush [chain] 清空指定規則鏈上的規則 -E, --rename-chain old-chain new-chain 重命名鏈 -Z, --zero [chain [rulenum]] 置零計數器 -P, --policy chain target 設置規則鏈的默認值,默認值有:ACCEPT、DROP
需要注意的是:每個規則都由兩個計數器,一個是packets
,它是被本規則所匹配到的所有報文的個數;另一個是bytes
,被本規則所匹配到的所有報文的大小之和。
除了鏈管理之外,還有規則管理以及規則顯示,其子命令如下:
規則管理:
-A, --append chain rule-specification 追加新規則與指定鏈的尾部 -I, --insert chain [rulenum] rule-specification 插入新規則于指定鏈的指定位置,默認為首部 -R, --replace chain rulenum rule-specification 替換指定的規則為新的規則 -D, --delete chain rulenum 根據規則編號刪除規則 -D, --delete chain rule-specification 根據規則本身刪除規則
規則顯示:
-L, --list [chain] 列出規則 -v, --verbose 詳細信息 -n, --numberic 數字格式顯示主機地址和端口號 -x,--exact 顯示計數器的精確值 --line-numbers 列出規則時,顯示其在鏈上的相應的編號 -S, --list-rules [chain] 顯示指定鏈上的所有規則
以上就是對于子命令的規則介紹,但是添加添加規則時,還需考量一下因素:
1、實現的功能:用于判定規則添加至那個表中。
2、報文流經的位置:用于判定規則添加至那個鏈當中。
3、報文的流向:判斷規則何為"源",何為"目標"。
4、匹配條件:用于編寫正確的匹配規則,條件如下:
(1) 專用于某種應用的同類規則,匹配交小的放前面。
(2) 專用于某種應用的不用淚規則,匹配較大的放在后面。
(3) 用于通用目的的規則放在前面。
以上就是我們添加規則時所考量的因素,其中filter表就是防火墻的核心所在,那么在所有的規則編輯或者定義完成之后,自然少不了它的匹配條件,那么匹配條件也分為兩種,一種是通用匹配和擴展匹配,另一種是跳轉目標,歸結如下:
[!] -s, --source address[/mask][,...] 檢查報文的源IP地址是否鍍鉻此處指定的范圍,或是否等于此處給定的地址。 [!] -d, --destination address[/mask][,...] 檢查報文的目標IP地址是否符合此處的指定范圍,或是否等于此處。 [!] -p, --protocol protocol 匹配報文中的協議,可用值為tcp, udp, icmp等,或者"all",亦可以數字格式指明協議。 -m, --match match 調用指定的擴展匹配模塊來匹配條件檢查機制。 [!] -i, --in-interface name 限定報文僅能夠從指定的接口流入。 [!] -o, --out-interface name 限定報文僅能夠從指定的接口流出。
以上就是通用匹配,接下來介紹跳轉目標,選項為-j,那么跳轉目標每個意義都不一樣,歸結如下:
1、ACCEPT允許通過。
2、LOG:記錄日志信息。
3、REJECT:拒絕通過,給出提示。
4、DROP:直接丟棄,不給出任何回應。
其中REJECT和DROP的操作都是將數據包拒絕,但REJECT會再回復一條“您的信息我已收到,但被扔掉了”,那通過ping命令測試REJECT如下:
[root@localhost ~]# ping -c 4 192.168.10.10 PING 192.168.10.10 (192.168.10.10)56(84) bytes of data. From 192.168.10.10 icmp_seq=1 Destination Port Unreachable From 192.168.10.10 icmp_seq=2 Destination Port Unreachable From 192.168.10.10 icmp_seq=3 Destination Port Unreachable From 192.168.10.10 icmp_seq=4 Destination Port Unreachable --- 192.168.10.10 ping statistics --- 4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3002ms
好的,對于選項的匹配規則注意事項已經介紹的差不多了,那么接下來我們該做一小例子了,在做試驗要注意一點,都必須將22好端口開啟通過,不然的話,你的遠程會話就連接不上去了。
在下一篇當中我們接觸iptables進階。
原創文章,作者:劉 祥宇,如若轉載,請注明出處:http://www.www58058.com/67309