1.1 防火墻的概念
Firewall(防火墻):組件,工作在網(wǎng)絡(luò)邊緣(主機(jī)邊緣),對(duì)進(jìn)出網(wǎng)絡(luò)數(shù)據(jù)包基于一定的規(guī)則檢查,并在匹配某規(guī)則定義的處理進(jìn)行處理的一組功能的組件画株。
防火墻類(lèi)型:根據(jù)工作層次的不同來(lái)劃分沮协,常見(jiàn)的防火墻工作在 OSI 第三層龄捡,即網(wǎng)絡(luò)層防火墻,工作在 OSI 第七層的稱(chēng)為應(yīng)用防火墻慷暂,或者代理服務(wù)器(代理網(wǎng)關(guān))聘殖。
網(wǎng)絡(luò)層防火墻又稱(chēng)包過(guò)濾防火墻,在網(wǎng)絡(luò)層對(duì)數(shù)據(jù)包進(jìn)行選擇行瑞,選擇的依據(jù)是系統(tǒng)內(nèi)設(shè)置的過(guò)濾邏輯奸腺,被稱(chēng)為訪問(wèn)控制列表(ACL),通過(guò)檢查數(shù)據(jù)流中每個(gè)數(shù)據(jù)的源地址血久,目的地址突照,所用端口號(hào)和協(xié)議狀態(tài)等因素,或他們的組合來(lái)確定是否允許該數(shù)據(jù)包通過(guò)氧吐。優(yōu)點(diǎn):對(duì)用戶(hù)來(lái)說(shuō)透明讹蘑,處理速度快且易于維護(hù)。缺點(diǎn):一旦黑客突破防火墻筑舅,就可以輕易地偽造數(shù)據(jù)包的源地址衔肢,目的地址和 IP 的端口號(hào),即 “IP 地址偽造”豁翎。
1.2 防火墻分類(lèi)
硬件防火墻:在硬件級(jí)別實(shí)現(xiàn)部分功能的防火墻角骤;另一個(gè)部分功能基于軟件實(shí)現(xiàn);
軟件防火墻:應(yīng)用軟件處理邏輯運(yùn)行于通用硬件平臺(tái)之上的防火墻心剥;
主機(jī)防火墻:服務(wù)范圍為當(dāng)前主機(jī)邦尊;
網(wǎng)絡(luò)防火墻:服務(wù)于防火墻背后的本地局域網(wǎng),往往處于網(wǎng)絡(luò)入口或邊緣优烧。
1.3 Iptables 的基本認(rèn)識(shí)
Netfilter 組件稱(chēng)為內(nèi)核空間蝉揍,它被集成在 linux 內(nèi)核中。netfilter 是一種內(nèi)核中用于擴(kuò)展各種網(wǎng)絡(luò)服務(wù)的結(jié)構(gòu)化底層框架畦娄。它是在內(nèi)核中選取五個(gè)位置放了五個(gè) hook function又沾,而這五個(gè) hook function 向用戶(hù)開(kāi)放,用戶(hù)可以通過(guò)一個(gè)工具(iptables)向其寫(xiě)入規(guī)則熙卡。
Netfilter 主要由信息過(guò)濾表(table)組成杖刷,包含了控制 IP 包處理的規(guī)則集 (rules)。根據(jù)規(guī)則所處理的 IP 包的類(lèi)型驳癌,規(guī)則被分組放在鏈(chain)中滑燃,從而使內(nèi)核對(duì)來(lái)自某些源,前往某些目的地或具有某些協(xié)議類(lèi)型的信息包處置方法颓鲜,如完成信息包的處理、控制和過(guò)濾等工作。
Iptables 也稱(chēng)為用戶(hù)空間封救,是一個(gè)工作在用戶(hù)層用來(lái)寫(xiě)入規(guī)則的工作,寫(xiě)好的規(guī)則被送往 netfilter瘤袖。這些規(guī)則告訴內(nèi)核中的 netfilter 組件如何去處理信息包。
1.4 Iptables 的組成
iptables 有四個(gè)表和五個(gè)鏈以及一些規(guī)則組成:
- 四個(gè)表: filter昂验、nat捂敌、mangle、raw
filter 表(過(guò)濾規(guī)則表凛篙,該表根據(jù)管理員預(yù)設(shè)定義的一組規(guī)則過(guò)濾符合條件的數(shù)據(jù)包)
nat 表 (地址轉(zhuǎn)換規(guī)則表)
mangle (修改數(shù)據(jù)標(biāo)記位規(guī)則表)
raw (跟蹤數(shù)據(jù)表規(guī)則表)
其中最常用的是 filter 表以及 nat 表
- 五個(gè)鏈: INPUT、OUTPUT栏渺、FORWARD呛梆、PREROUTING、POSTROUTING 表和鏈的對(duì)應(yīng)關(guān)系:
Filter:INPUT,FORWARD,OUTPUT
Mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
Nat:PREROUTING,OUTPUT,POSTROUTING
Raw:PREROUTING,OUTPUT
添加規(guī)則時(shí)的考量點(diǎn):
(1)要實(shí)現(xiàn)哪種功能:判斷添加在哪張表上磕诊;
(2)報(bào)文流經(jīng)的路徑:判斷添加在哪個(gè)鏈上填物;
鏈:鏈上規(guī)則的次序,即為檢查的次序霎终;因此隱含一定的法則
(1)同類(lèi)規(guī)則(訪問(wèn)同一應(yīng)用)滞磺,匹配范圍小的放上面;
(2)不同類(lèi)規(guī)則(訪問(wèn)不同應(yīng)用)莱褒,匹配到報(bào)文頻率較大的放上面击困;
(3)將那些可由一條規(guī)則描述的多個(gè)規(guī)則合并為一個(gè);
(4)設(shè)置默認(rèn)策略广凸;
2.1 基本命令參數(shù)
參數(shù) | 作用 |
---|---|
-p | 設(shè)置默認(rèn)策略:iptables -P INPUT (DROP |ACCEPT) |
-F | 清空規(guī)則鏈 |
-L | 查看規(guī)則鏈 |
-A | 在規(guī)則鏈的末尾加入新規(guī)則 |
-I num | 在規(guī)則鏈的頭部加入新規(guī)則 |
-D num | 刪除某一條規(guī)則 |
-s | 配置來(lái)源地址IP/MASK阅茶,加嘆號(hào)“!”表示除這個(gè)IP外 |
-d | 匹配目標(biāo)地址 |
-i 網(wǎng)卡名稱(chēng) | 匹配從這塊網(wǎng)卡流入的數(shù)據(jù) |
-o 網(wǎng)卡名稱(chēng) | 匹配從這塊網(wǎng)卡流出的數(shù)據(jù) |
--dport num | 匹配目標(biāo)端口號(hào) |
--sport num | 匹配來(lái)源端口號(hào) |
使用iptables命令-L參數(shù)查看已有的防火墻策略:
[root@CentOS7 ~]#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
LOG tcp -- anywhere anywhere tcp dpt:ssh state NEW LOG level warning prefix "want-in-from-port-22"
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
使用iptables命令-F參數(shù)清空已有的防火墻策略:
[root@CentOS7 ~]#iptables -F
[root@CentOS7 ~]#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
可以使用-v選項(xiàng)谅海,查看更多的脸哀、更詳細(xì)的詳細(xì)
[root@CentOS7 ~]#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
解釋各字段的含義:
pkts:對(duì)應(yīng)規(guī)則匹配到的報(bào)文的個(gè)數(shù);
bytes:對(duì)應(yīng)匹配到的報(bào)文包的大小總和扭吁;
target:規(guī)則對(duì)應(yīng)的target撞蜂,往往表示規(guī)則對(duì)應(yīng)的“動(dòng)作”,即規(guī)則匹配成功后需要采取的措施侥袜;
prot:表示規(guī)則對(duì)應(yīng)的協(xié)議蝌诡,是否只針對(duì)某些協(xié)議應(yīng)用此規(guī)則;
opt:表示規(guī)則對(duì)應(yīng)的選項(xiàng)枫吧;
in:表示數(shù)據(jù)包由哪個(gè)接口(網(wǎng)卡)流入送漠,我們可以設(shè)置通過(guò)哪塊網(wǎng)卡流入的報(bào)文需要匹配當(dāng)前規(guī)則;
out:表示數(shù)據(jù)包由哪個(gè)接口(網(wǎng)卡)流出由蘑,我們可以設(shè)置通過(guò)哪塊網(wǎng)卡流出的報(bào)文需要匹配當(dāng)前規(guī)則闽寡;
source:表示規(guī)則對(duì)應(yīng)的源地址代兵,可以是一個(gè)IP,也可以是一個(gè)網(wǎng)段爷狈;
destination:表示規(guī)則對(duì)應(yīng)的目標(biāo)地址植影,可以是一個(gè)IP,可以是一個(gè)網(wǎng)段涎永。
上例中的源地址與目標(biāo)地址都為anywhere思币,在iptables默認(rèn)為我們進(jìn)行了名稱(chēng)解析,在設(shè)置非常多的規(guī)則下羡微,如果進(jìn)行名稱(chēng)解析谷饿,效率會(huì)比較低,所以妈倔,我們可以使用-n選項(xiàng)博投,表示將不對(duì)IP地址進(jìn)行名稱(chēng)反解,直接顯示IP地址
[root@CentOS7 ~]#iptables -nvL -t filter
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
324 37064 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
208 21787 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
可以使用--line-number顯示規(guī)則編號(hào)盯蝴,也可縮寫(xiě)成--line
[root@CentOS7 ~]#iptables --line-number -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 409 46144 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 381 42675 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
2.2 增加規(guī)則
[root@CentOS7 ~]#iptables -t filter -I INPUT -s 192.168.1.106 -j DROP
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 41 packets, 4725 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 192.168.1.106 0.0.0.0/0
上例中毅哗,-t指定了要操作的表,此外指定了操作filter表捧挺,不使用-t選項(xiàng)指定表時(shí)虑绵,默認(rèn)為操作filter表;
使用-I選項(xiàng)闽烙,指明將“規(guī)則”插入至哪個(gè)鏈中翅睛,-I表示insert,即插入的意思黑竞,所以-I INPUT表示將規(guī)則插入于INPUT鏈中宏所,即添加規(guī)則;
使用-s選項(xiàng)摊溶,指明“匹配條件”中的“源地址”爬骤,即如果報(bào)文的源地址屬于-s對(duì)應(yīng)的地址,那么報(bào)文則滿(mǎn)足條件莫换,-s為source霞玄,表示源地址;
使用-j選項(xiàng)拉岁,指明當(dāng)“匹配條件”被滿(mǎn)足時(shí)坷剧,所對(duì)應(yīng)的動(dòng)作,指定的動(dòng)作為DROP喊暖,當(dāng)報(bào)文的源地址為192.168.1.106時(shí)惫企,報(bào)文則被DROP(丟棄);
查看filter表中的INPUT鏈,可以看到規(guī)則已經(jīng)被添加狞尔,動(dòng)作被稱(chēng)之為“target”丛版,“target”字段對(duì)應(yīng)的動(dòng)作為DROP。
通過(guò)192.168.1.106去ping主機(jī)107偏序,PING一直沒(méi)得到回應(yīng)页畦,iptables規(guī)則設(shè)置生效
[root@CentOS6 ~]#ping 192.168.1.107
PING 192.168.1.107 (192.168.1.107) 56(84) bytes of data.
可以查看iptables中的規(guī)則,已經(jīng)有92個(gè)包被對(duì)應(yīng)的規(guī)則匹配到研儒,總計(jì)大小8760bytes
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 884 packets, 97171 bytes)
pkts bytes target prot opt in out source destination
92 8760 DROP all -- * * 192.168.1.106 0.0.0.0/0
在filter表的INPUT鏈中追加一條規(guī)則
[root@CentOS7 ~]#iptables -A INPUT -s 192.168.1.106 -j ACCEPT
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 40 packets, 4054 bytes)
pkts bytes target prot opt in out source destination
1235 105K DROP all -- * * 192.168.1.106 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
上例中豫缨,-A為append之意,所以端朵,-A INPUT則表示在INPUT鏈中追加規(guī)則好芭,而-I選項(xiàng)則表示在鏈中“插入規(guī)則”,直白的說(shuō)就是-A表示在鏈的尾部追加規(guī)則冲呢,-I表示在鏈的首部插入規(guī)則
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 230 packets, 29536 bytes)
pkts bytes target prot opt in out source destination
1420 120K DROP all -- * * 192.168.1.106 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
通過(guò)規(guī)則從上自下的匹配的原則舍败,第二條規(guī)則并沒(méi)有生效,所以當(dāng)前主機(jī)仍然無(wú)法ping通碗硬,此時(shí)我們只需將新規(guī)則添加添加至INPUT鏈的最前面就能夠ping通主機(jī)
[root@CentOS7 ~]#iptables -nvL INPUT
Chain INPUT (policy ACCEPT 26 packets, 2904 bytes)
pkts bytes target prot opt in out source destination
5 420 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
192.168.1.106已經(jīng)可以正常收到響應(yīng)報(bào)文
[root@CentOS6 ~]#ping -c 3 192.168.1.107
PING 192.168.1.107 (192.168.1.107) 56(84) bytes of data.
64 bytes from 192.168.1.107: icmp_seq=1 ttl=64 time=0.349 ms
64 bytes from 192.168.1.107: icmp_seq=2 ttl=64 time=0.317 ms
64 bytes from 192.168.1.107: icmp_seq=3 ttl=64 time=0.290 ms
--- 192.168.1.107 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.290/0.318/0.349/0.031 ms
2.3 刪除規(guī)則
刪除規(guī)則有兩種方法
- 根據(jù)規(guī)則的編號(hào)去刪除規(guī)則
- 根據(jù)具體的匹配條件與動(dòng)作刪除規(guī)則
[root@CentOS7 ~]#iptables --line -vnL INPUT
Chain INPUT (policy ACCEPT 771 packets, 84094 bytes)
num pkts bytes target prot opt in out source destination
1 62 5208 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
2 1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
[root@CentOS7 ~]#iptables -t filter -D INPUT 3
[root@CentOS7 ~]#iptables --line -vnL INPUT
Chain INPUT (policy ACCEPT 10 packets, 1128 bytes)
num pkts bytes target prot opt in out source destination
1 62 5208 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
2 1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
上例中瓤湘,使用-t選項(xiàng)指定要操作的表瓢颅,使用-D選項(xiàng)表示刪除指定鏈中的某條規(guī)則恩尾,-D INPUT 3 表示刪除INPUT鏈中的第3條規(guī)則
我們也可以根據(jù)具體的匹配條件與動(dòng)作去刪除規(guī)則
[root@CentOS7 ~]#iptables -vnL INPUT
Chain INPUT (policy ACCEPT 390 packets, 40752 bytes)
pkts bytes target prot opt in out source destination
62 5208 ACCEPT all -- * * 192.168.1.106 0.0.0.0/0
1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
[root@CentOS7 ~]#iptables -D INPUT -s 192.168.1.106 -j ACCEPT
[root@CentOS7 ~]#iptables -vnL INPUT
Chain INPUT (policy ACCEPT 9 packets, 755 bytes)
pkts bytes target prot opt in out source destination
1706 144K DROP all -- * * 192.168.1.106 0.0.0.0/0
上例中,-D INPUT表示刪除INPUT鏈中的規(guī)則挽懦,-s表示以對(duì)應(yīng)的源地址作為匹配條件翰意,-j ACCEPT表示對(duì)應(yīng)的動(dòng)作為接受,上述命令表示刪除INPUT鏈中源地址為192.168.1.106,動(dòng)作為ACCPET的規(guī)則
刪除所有的規(guī)則可以使用“iptables -t 表名 -F 鏈名
[root@CentOS6 ~]#iptables -t filter -F INPUT
-F選項(xiàng)為flush之意信柿,即刪除指定鏈中的所有規(guī)則冀偶,如果不指定鏈名,只指定表名刪除表中的所有規(guī)則
強(qiáng)調(diào)渔嚷,在沒(méi)有保存iptables規(guī)則時(shí)进鸠,請(qǐng)勿隨便清空鏈或者表中的規(guī)則
2.4 修改規(guī)則
當(dāng)報(bào)文沒(méi)有被鏈中的任何規(guī)則匹配到時(shí),或者形病,當(dāng)鏈中沒(méi)有任何規(guī)則時(shí)客年,防火墻會(huì)按照默認(rèn)動(dòng)作處理報(bào)文,我們可以修改指定鏈的默認(rèn)策略
[root@CentOS7 ~]#iptables -t filter -P FORWARD DROP
Chain FORWARD (policy DROP 0 packets, 0 bytes)
上例使用-t指定要操作的表漠吻,使用-P選項(xiàng)指定要修改的鏈量瓜,-P FORWARD DROP表示將表中FORWRD鏈的默認(rèn)策略改為DROP
2.5 保存規(guī)則
在默認(rèn)情況下,對(duì)防火墻所做出的修改都是”臨時(shí)的”途乃,但重啟iptables服務(wù)或者重啟服務(wù)器以后绍傲,我們平常添加的規(guī)則或者所作做出的修改將丟失。
centos6中耍共,使用“service iptables save”命令保存規(guī)則烫饼,規(guī)則默認(rèn)保存在/etc/sysconfig/iptables文件中猎塞。
[root@CentOS6 ~]#service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@CentOS6 ~]#cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Mon Oct 23 08:46:46 2017
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [8:1328]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Oct 23 08:46:46 2017
上例,文件中保存了filter表中每條鏈的默認(rèn)策略枫弟,以及每條鏈中的規(guī)則
centos7中邢享,使用firewall替代了原來(lái)的iptables service,但我么也可以通過(guò)yum源安裝iptables與iptables-service即可淡诗,在centos7中安裝完成iptables-services后骇塘,即可像centos6中一樣,通過(guò)service iptables save命令保存規(guī)則韩容,規(guī)則同樣保存在/etc/sysconfig/iptables文件中
其他保存方法
使用iptables-save并不能保存當(dāng)前的iptables規(guī)則款违,但我么可以將當(dāng)前的iptables規(guī)則以“保存后的格式”輸出到屏幕上,在配合使用重定向群凶,將規(guī)則重定向到/etc/sysconfig/iptables文件中即可
iptables-save > /etc/sysconfig/iptables
我們也可將/etc/sysconfig/iptables中的規(guī)則重新載入為當(dāng)前的iptables規(guī)則插爹,但留心,未保存入/etc/sysconfig/iptables文件中的修改將會(huì)丟失或者被覆蓋
使用iptables-restore命令可以從指定文件中重載規(guī)則
iptables-restore < /etc/sysconfig/iptables
重載規(guī)則時(shí)请梢,現(xiàn)有規(guī)則將被覆蓋