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