iptables其實(shí)不是真正的防火墻,我們可以把它理解成一個(gè)客戶端代理,用戶通過(guò)iptables這個(gè)代理,將用戶的安全設(shè)定執(zhí)行到對(duì)應(yīng)的"安全框架"中,這個(gè)"安全框架"才是真正的防火墻,這個(gè)框架的名字?.NETfilter。
Netfilter是linux操作系統(tǒng)核心層內(nèi)部的一個(gè)數(shù)據(jù)包處理模塊,它具有如下功能:網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translate),數(shù)據(jù)包內(nèi)容修改以及數(shù)據(jù)包過(guò)濾的防火墻功能!
iptables其實(shí)是一個(gè)命令行工具,位于用戶空間,我們用這個(gè)工具操作真正的框架!
netfilter/iptables(下文中簡(jiǎn)稱為iptables)組成Linux平臺(tái)下的包過(guò)濾防火墻,一般Linux系統(tǒng)是默認(rèn)自帶啟動(dòng)的。
查看是否啟動(dòng):sysctl -p 從指定的文件加載系統(tǒng)參數(shù),如不指定即從/etc/sysctl.conf中加載!
iptables是按照規(guī)則來(lái)辦事的,我們就來(lái)說(shuō)說(shuō)規(guī)則(rules),規(guī)則其實(shí)就是網(wǎng)絡(luò)管理員預(yù)定義的條件,規(guī)則一般的定義為"如果數(shù)據(jù)包頭符合這樣的條件,就這樣處理這個(gè)數(shù)據(jù)包"。規(guī)則存儲(chǔ)在內(nèi)核空間的信息包過(guò)濾表中,這些規(guī)則分別指定了源地址、目的地址、傳輸協(xié)議(如TCP、UDP、ICMP)和服務(wù)類型(如HTTP、FTP和SMTP)等。當(dāng)數(shù)據(jù)包與規(guī)則匹配時(shí),iptables就根據(jù)規(guī)則所定義的方法來(lái)處理這些數(shù)據(jù)包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的主要工作就是添加、修改和刪除這些規(guī)則。
iptables傳輸數(shù)據(jù)包的過(guò)程
當(dāng)我們啟用了防火墻功能時(shí),報(bào)文需要經(jīng)過(guò)如下關(guān)卡,而這些關(guān)卡在iptables中不被稱為"關(guān)卡",而被稱為"鏈"。也就是說(shuō),根據(jù)實(shí)際情況的不同,報(bào)文經(jīng)過(guò)"鏈"可能不同。
所以,根據(jù)上圖,我們能夠想象出某些常用場(chǎng)景中,報(bào)文的流向:
到本機(jī)某進(jìn)程的報(bào)文:PREROUTING --> INPUT
由本機(jī)轉(zhuǎn)發(fā)的報(bào)文:PREROUTING --> FORWARD --> POSTROUTING
由本機(jī)的某進(jìn)程發(fā)出報(bào)文(通常為響應(yīng)報(bào)文):OUTPUT --> POSTROUTING
鏈(chains)
我們知道,防火墻的作用就在于對(duì)經(jīng)過(guò)的報(bào)文匹配"規(guī)則",然后執(zhí)行對(duì)應(yīng)的"動(dòng)作",所以,當(dāng)報(bào)文經(jīng)過(guò)這些關(guān)卡的時(shí)候,則必須匹配這個(gè)關(guān)卡上的規(guī)則,但是,這個(gè)關(guān)卡上可能不止有一條規(guī)則,而是有很多條規(guī)則,當(dāng)我們把這些規(guī)則串到一個(gè)鏈條上的時(shí)候,就形成了"鏈",每個(gè)經(jīng)過(guò)這個(gè)"關(guān)卡"的報(bào)文,都要將這條"鏈"上的所有規(guī)則匹配一遍,如果有符合條件的規(guī)則,則執(zhí)行規(guī)則對(duì)應(yīng)的動(dòng)作。
5種鏈
5種鏈的說(shuō)明如下:
PREROUTING:數(shù)據(jù)包進(jìn)入路由表之前
INPUT:通過(guò)路由表后目的地為本機(jī)
FORWARDING:通過(guò)路由表后,目的地不為本機(jī)
OUTPUT:由本機(jī)產(chǎn)生,向外轉(zhuǎn)發(fā)
POSTROUTHING:發(fā)送到網(wǎng)卡接口之前
表(tables)
每個(gè)"鏈"上都放置了一串規(guī)則,但是這些規(guī)則有些很相似,我們把實(shí)現(xiàn)相同功能的規(guī)則放在一起;我們把具有相同功能的規(guī)則的集合叫做"表",所以說(shuō),不同功能的規(guī)則,我們可以放置在不同的表中進(jìn)行管理。
iptables已經(jīng)為我們定義了4個(gè)表: filter表、nat表、mangle表和raw表:每個(gè)表對(duì)應(yīng)了不同的功能,而我們定義的規(guī)則也都逃脫不了這4種功能的范圍。
filter表:負(fù)責(zé)過(guò)濾功能,防火墻; 內(nèi)核模塊:iptables_filter
nat表:network address translation,網(wǎng)絡(luò)地址轉(zhuǎn)換功能; 內(nèi)核模塊:iptable_nat
mangle表:拆解報(bào)文,做出修改,并重新封裝的功能; 內(nèi)核模塊: iptable_mangle
raw表:關(guān)閉nat表上啟用的連接追蹤機(jī)制; 內(nèi)核模塊:iptable_raw
表鏈關(guān)系
某些"鏈"中注定不會(huì)包含"某類規(guī)則",讓我們看看每個(gè)"鏈"上的規(guī)則都存在于哪些"表"中:
PREROUTING鏈 的規(guī)則可以存在于:raw表,mangle表,nat表。
INPUT 鏈的規(guī)則可以存在于:mangle表,filter表,(centos7中還有nat表,centos6中沒(méi)有)。
FORWARD鏈 的規(guī)則可以存在于:mangle表,filter表。
OUTPUT鏈 的規(guī)則可以存在于:raw表,mangle表,nat表,filter表。
POSTOUTING鏈 的規(guī)則可以存在于:mangle表,nat表。
但是,我們?cè)趯?shí)際的使用過(guò)程中,往往是通過(guò)"表"作為操作入口,對(duì)規(guī)則進(jìn)行定義的,之所以按照上述過(guò)程介紹iptables,是因?yàn)閺?quot;關(guān)卡"的角度更容易從入門的角度理解,但是為了以便在實(shí)際使用的時(shí)候,更加順暢的理解它們,我們還要將各"表"與"鏈"的關(guān)系羅列出來(lái):
表(功能)<--> 鏈(鉤子):
filter表<-->三個(gè)鏈:INPUT、FORWARD、OUTPUT
作用:過(guò)濾數(shù)據(jù)包 內(nèi)核模塊:iptables_filter.
Nat表<-->三個(gè)鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用于網(wǎng)絡(luò)地址轉(zhuǎn)換(IP、端口) 內(nèi)核模塊:iptable_nat
Mangle表<-->五個(gè)鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數(shù)據(jù)包的服務(wù)類型、TTL、并且可以配置路由實(shí)現(xiàn)QOS內(nèi)核模塊
Raw表<-->兩個(gè)鏈:OUTPUT、PREROUTING
作用:決定數(shù)據(jù)包是否被狀態(tài)跟蹤機(jī)制處理
iptables為我們定義了4張"表",當(dāng)他們處于同一條"鏈"時(shí),執(zhí)行的優(yōu)先級(jí)如下
優(yōu)先級(jí)次序(由高而低):raw --> mangle --> nat --> filter
優(yōu)先級(jí)次序(由高而低):raw --> mangle --> nat --> filter
iptables操作
查看filter的詳細(xì)規(guī)則:filter表<-->三個(gè)鏈:INPUT、FORWARD、OUTPUT
————————————————
[root@xing Desktop]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
注:OUTPUT 出站鏈
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED(三次握手狀態(tài))
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(目標(biāo)端口22)
2 318 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited(默認(rèn)拒絕所有)
———————
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
注:FORWARD轉(zhuǎn)發(fā)規(guī)則鏈(當(dāng)源IP地址以及目標(biāo)IP地址都不是本機(jī)的時(shí)候使用的規(guī)則)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
———————
Chain OUTPUT (policy ACCEPT 4 packets, 240 bytes)
注:OUTPUT 出站鏈
pkts bytes target prot opt in out source destination
————————————————
iptables的基本語(yǔ)法格式
iptables [-t 表名] 命令選項(xiàng) [鏈名] [匹配條件] [-j 控制類型]
iptables 【-t filter】 -I 【INPUT】 【-p tcp --dport 80】 【-j ACCEPT】
命令選項(xiàng):
————
添加新的規(guī)則
- -A 在鏈的末尾追加一條規(guī)則
- -I 在鏈的開(kāi)頭(或指定序號(hào))插入一條規(guī)則
————
查看規(guī)則列表
- -L 列出所有規(guī)則條目
- -n 數(shù)字的形式顯示地址、端口信息
- -v 以更詳細(xì)的方式顯示規(guī)則信息
- --line-number 查看規(guī)則時(shí),顯示規(guī)則的序號(hào)
[root@xing Desktop]# iptables -t filter -nvL --line-number
————
刪除、清空規(guī)則
- -D 刪除鏈內(nèi)指定序號(hào)(或內(nèi)容)的一條規(guī)則
- -F 清空所有的規(guī)則
[root@xing Desktop]# iptables -D FORWARD 2
[root@xing Desktop]# iptables -F(清空所有規(guī)則)
[root@xing Desktop]# service iptables restart
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
————
設(shè)置默認(rèn)策略
-P :設(shè)置默認(rèn)策略的(默認(rèn)策略一般只有兩種。默認(rèn)是關(guān)的/默認(rèn)是開(kāi)的)
iptables -P INPUT (DROP|ACCEPT)
[root@xing Desktop]# iptables -P FORWARD DROP
———————
控制類型
ACCEPT 允許通過(guò)
DOROP 直接丟棄,不給出任何提示
REJECT 拒絕通過(guò),必要時(shí)給出提示
LOG 記錄日志信息,然后傳給下一條規(guī)則繼續(xù)匹配
———————
匹配條件【參數(shù)】
通用匹配:
協(xié)議匹配 -p [協(xié)議名]
地址匹配 -s [源地址] -d [目的地址]
接口匹配 -i [入站網(wǎng)卡] 、-o [出站網(wǎng)卡]
隱含匹配(需配合通用匹配一起使用):
端口匹配 --sport [源端口]、--dport [目的端口]
TCP標(biāo)記端口 --tcp-flags [檢查范圍] [被設(shè)置的標(biāo)記](méi)
ICMP類型匹配 --icmp-type [ICMP類型]
常見(jiàn)的顯示匹配條件
多端口匹配 -m multiport -- sport [源端口列表]、-m multiport -- sport [目的端口列表]
IP范圍匹配 -m iprange --src-range [IP范圍]
mac地址匹配 -m mac --mac-source [MAC地址]
———————
注意事項(xiàng):
不指定表名時(shí),默認(rèn)指向filter表
不指定鏈名時(shí),默認(rèn)表內(nèi)所有鏈
除非設(shè)置鏈的默認(rèn)策略,否則必須指定匹配條件
選項(xiàng)、鏈名、控制類型使用大寫字母,其余均為小寫
————————————————
[root@xing Desktop]# iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
注:命令嚴(yán)格區(qū)分大小寫
———————
輔助命令:watch(可以幫你監(jiān)測(cè)一個(gè)命令的運(yùn)行結(jié)果)
格式:watch (選項(xiàng)) (參數(shù))
選項(xiàng)
-n:指定指令執(zhí)行的間隔時(shí)間(秒);
-d:高亮顯示指令輸出信息不同之處;
-t:不顯示標(biāo)題。
參數(shù)
指令:需要周期性執(zhí)行的指令。
watch -n1 iptables -t filter -nvL
————————————————
規(guī)則備份與還原
iptables-save工具:可結(jié)合重定向輸出保存到指定文件
將當(dāng)前狀態(tài)保存到一個(gè)桌面的文件中
[root@xing Desktop]# iptables-save > /root/Desktop/ipt.txt
將備份規(guī)則文件導(dǎo)入:
[root@xing Desktop]# iptables-restore < /root/Desktop/ipt.txt
將當(dāng)前狀態(tài)保存為默認(rèn)規(guī)則
[root@xing Desktop]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
恢復(fù)到默認(rèn)規(guī)則
[root@xing Desktop]# service iptables restart
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
————————————————
[root@xing Desktop]# iptables -t nat -nvL --line-number
[root@xing Desktop]# iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 172.168.1.0/24 -j SNAT --to-source 12.34.56.89
[root@xing Desktop]# iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 172.168.1.0/24 -j MASQUERADE






