您好,登錄后才能下訂單哦!
一、iptables簡介
iptables 的前身叫ipfirewall (內核1.x時代),這是一個從freeBSD上移植過來的,能夠工作在內核當中的,對數據包進行檢測的一款簡易訪問控制工具。但是 ipfirewall工作功能極其有限(它需要將所有的規則都放進內核當中,這樣規則才能夠運行起來,而放進內核,這個做法一般是極其困難的)。當內核發 展到2.x系列的時候,軟件更名為ipchains,它可以定義多條規則,將他們串起來,共同發揮作用,而現在,它叫做iptables,可以將規則組成一個列表,實現絕對詳細的訪問控制功能。
iptables和netfilter的關系是一個很容易讓人搞不清的問題。很多的知道iptables卻不知道 netfilter。其實iptables只是Linux防火墻的管理工具而已,位于/sbin/iptables。真正實現防火墻功能的是 netfilter,它是Linux內核中實現包過濾的內部結構。
二、iptables基礎
規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息 包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規 則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的 主要工作就是添加、修改和刪除這些規則。
三、iptables傳輸數據包的過程
① 當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
② 如果數據包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。數據包到了INPUT鏈后,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然后到達POSTROUTING鏈輸出。
③ 如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然后到達POSTROUTING鏈輸出。
四、iptables的規則和鏈
上圖中的五個位置也被稱為五個鉤子函數(hook functions),也叫五個規則鏈。
1.PREROUTING (路由前)
2.INPUT (數據包流入口)
3.FORWARD (轉發管卡)
4.OUTPUT(數據包出口)
5.POSTROUTING(路由后)
這是netfilter規定的五個規則鏈,任何一個數據包,只要經過本機,必將經過這五個鏈中的其中一個鏈。
iptables包含4個表,5個鏈。其中表是按照對數據包的操作區分的,鏈是按照不同的Hook點來區分的,表和鏈實際上是netfilter的兩個維度。
(1)4表:
filter,nat,mangle,raw,默認表是filter(沒有指定表的時候就是filter表)
filter:一般的過濾功能
nat:用于nat功能(端口映射,地址映射等)
mangle:用于對特定數據包的修改
raw:有限級最高,設置raw時一般是為了不再讓iptables做數據包的鏈接跟蹤處理,提高性能
(2)5鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
PREROUTING:數據包進入路由表之前
INPUT:通過路由表后目的地為本機
FORWARDING:通過路由表后,目的地不為本機
OUTPUT:由本機產生,向外轉發
POSTROUTING:發送到網卡接口之前。
(3)規則表:
1.filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包 內核模塊:iptables_filter.
2.Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用于網絡地址轉換(IP、端口) 內核模塊:iptable_nat
3.Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數據包的服務類型、TTL、并且可以配置路由實現QOS內核模塊:iptable_mangle(別看這個表這么麻煩,咱們設置策略時幾乎都不會用到它)
4.Raw表——兩個鏈:OUTPUT、PREROUTING
作用:決定數據包是否被狀態跟蹤機制處理 內核模塊:iptable_raw
(4)規則鏈:
1.INPUT——進來的數據包應用此規則鏈中的策略
2.OUTPUT——外出的數據包應用此規則鏈中的策略
3.FORWARD——轉發數據包時應用此規則鏈中的策略
4.PREROUTING——對數據包作路由選擇前應用此鏈中的規則
(記住!所有的數據包進來的時侯都先由這個鏈處理)
5.POSTROUTING——對數據包作路由選擇后應用此鏈中的規則
(所有的數據包出來的時侯都先由這個鏈處理)
(5)規則表之間的優先順序:
raw——mangle——nat——filter
五、iptables的命令管理
命令格式:iptables [-t table] SUBCOMMAND chain [matches...] [target]
如圖示
詳細介紹:
(1)鏈管理
-N: new,新增一條自定義鏈;
-X:delete,刪除自定義的空鏈;
-P:policy,設置鏈的默認策略;
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
-E:rename,重命名自定義的未被引用(引用計數為0)的鏈;
(2)規則管理
-A:append,追加,默認為最后一個;
-I:insert,插入,默認為第一個;
-D:delete,刪除
(1) rule specification
(2) rule number
-R:replace,替換
-F:flush,清除規則
-Z:zero,置0;
iptables的每條規則都有兩個計數器:
(1) 由本規則匹配到的所有的packets;
(2) 由本規則匹配到的所有的bytes;
-S:selected,以iptables-save命令的格式顯示鏈上的規則;
例:虛擬機ip地址為192.168.1.108,已安裝httpd服務,編寫一條規則讓所有主機不可訪問
1 | [root@bogon ~] # iptables -t filter -A INPUT -d 192.168.1.108 -p tcp --dport 80 -j REJECT |
此時再通過瀏覽器就不能訪問apache測試頁面了
再編寫一條規則,讓192.168.1.X網段內的主機可以訪問
1 2 3 4 5 6 7 8 9 10 11 12 | [root@bogon ~] # iptables -t filter -D INPUT 1 #先刪除之前的規則 [root@bogon ~] # iptables -t filter -I INPUT -s 192.168.1.0/24 -d 192.168.1.108 -j ACCEPT #添加規則 [root@bogon ~] # iptables -nvL --line-number #查看 Chain INPUT (policy ACCEPT 3 packets, 840 bytes) num pkts bytes target prot opt in out source destination 1 72 5308 ACCEPT all -- * * 192.168.1.0 /24 192.168.1.108 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 51 packets, 5708 bytes) num pkts bytes target prot opt in out source destination |
修改本規則,讓本網段內的不能訪問apache測試頁面
1 | [root@bogon ~] # iptables -t filter -R INPUT 1 -s 192.168.1.0/24 -d 192.168.1.108 -j REJECT |
(3)查看
-L: list,列出規則
-n:numeric,以數字格式顯示地址和端口;
-v:verbose,詳細信息;-vv, -vvv
-x:exactly,顯示計數器的精確值而非單位換算后的結果;
--line-numbers:顯示鏈上的規則的編號;
組合:-nvL
1 2 3 4 5 6 7 8 9 | [root@bogon ~] # iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination |
匹配條件
(4)基本匹配:netfilter自帶的匹配機制
[!] -s, --source address[/mask][,...]:原地址匹配
[!] -d, --destination address[/mask][,...]:目標地址匹配
[!] -i, --in-interface name:限制報文流入的接口,只能用于PREROUTING,INPUT及FORWARD;
[!] -o, --out-interface name:限制報文流出的接口,只能用于OUTPUT,FORWARD及POSTROUTING;
(5)擴展匹配:經由擴展模塊引入的匹配機制,-m matchname
隱式擴展:可以不用使用-m選項專門加載響應模塊;前提是要使用-p選項可匹配何種協議;
tcp、udp、icmp
顯式擴展:必須由-m選項專門加載響應模塊;
multiport
iprange
string
time
connlimit
limit
state
(5.1)隱式擴展
[!] -p, --protocol PROTOCOL PROTOCOL:
協議:tcp, udp, icmp, icmpv6, esp, ah, sctp, mh or "all"
tcp: 隱含指明了“-m tcp”,有專用選項:
[!] --source-port,--sport port[:port]:匹配報文中的tcp首部的源端口;可以是端口范圍;
[!] --destination-port,--dport port[:port]:匹配報文中的tcp首部的目標端口;可以是端口范圍;
[!] --tcp-flags mask comp:檢查報文中mask指明的tcp標志位,而要這些標志位comp中必須為1;
--tcp-flags syn,fin,ack,rst syn
--tcp-flags syn,fin,ack,rst ack,fin
[!] --syn:
--syn相當于“--tcp-flags syn,fin,ack,rst syn”;tcp三次握手的第一次
udp:隱含指明了“-m udp”,有專用選項:
[!] --source-port,--sport port[:port]:匹配報文中的udp首部的源端口;可以是端口范圍;
[!] --destination-port,--dport port[:port]:匹配報文中udp首部的目標端口;可以是端口范圍
icmp:隱含指明了“-m icmp”,有專用選項:
[!] --icmp-type {type[/code]|typename}
type/code:
0/0:echo reply 別人可以ping自己
8/0:echo request 自己可以ping別人
例:將虛擬機192.168.1.108設置為,自己可以ping別人,而別人不能ping自己
對于ping這個協議,進來的為8(ping),出去的為0(響應).我們為了達到目的,需要8出去,允許0進來
1 2 | [root@bogon ~] # iptables -t filter -A INPUT -d 192.168.1.108 -p icmp --icmp-type 8 -j DROP #設置別人ping自己的數據包不能通過 [root@bogon ~] # iptables -t filter -A OUTPUT -s 192.168.1.108 -p icmp --icmp-type 0 -j ACCEPT #設置自己ping別人的數據包可以通過 |
(5.2)顯式擴展
5.2.1 multiport:多端口匹配
以離散方式定義多端口匹配,最多可以指定15個端口;
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
1 2 | [root@bogon ~] # iptables -I INPUT -s 0/0 -d 192.168.1.108 -p tcp -m multiport --dports 22,80 -j ACCEPT #允許所有主機訪問192.168.1.108的22和80端口 [root@bogon ~] # iptables -I OUTPUT -d 0/0 -s 192.168.1.108 -p tcp -m multiport --sports 22,80 -j ACCEPT #允許192.168.1.108的主機可以通過22和80端口發送數據包 |
5.2.2 iprange:指明一段連續的ip地址范圍做為源地址或目標地址匹配;
[!] --src-range from[-to]:源地址范圍
[!] --dst-range from[-to]:目標地址范圍
1 | [root@bogon ~] # iptables -A INPUT -p tcp -m iprange --src-range 192.168.0.100-192.168.0.105 --dport 22 -j ACCEPT #匹配一組ip地址192.168.0.100-192.168.0.105 |
5.2.3 string:對報文中的應用層數據做字符串匹配檢測;
--algo {bm|kmp}:指明算法
(bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)
[!] --string pattern:給定要檢查的字符串模式;
[!] --hex-string pattern:給定要檢查的字符串模式;
1 | [root@bogon ~] # iptables -I OUTPUT -s 192.168.1.108 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT #有"old"字符串的拒絕訪問 |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。