從邏輯上將,防火牆大致能夠分爲主機防火牆和網絡防火牆。
主機防火牆:針對於單個主機進行防禦
網絡防火牆:每每處於網絡入口或邊緣,針對於網絡入口進行防禦,服務於防火牆背後的本地局域網 node
iptables並非真正的防火牆,咱們能夠把它理解成一個客戶端代理,用戶經過iptables這個代理,將用戶的安全設定執行到對應的「安全框架」中,這個「安全框架」纔是真正的防火牆,而這個框架的名字叫作netfilter。
netfilter纔是防火牆真正的安全框架,它位於內核空間。
然而,iptables只是一個命令行工具,位於用戶空間,咱們藉助這個工具操做真正的框架。 web
咱們知道iptables是按照規則來辦事的,而規則(rules)其實就是網絡管理員預約義的條件,規則通常的定義爲「若是數據包頭符合這樣的條件,就這樣處理這個數據包」。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工做就是添加、修改和刪除這些規則。算法
當咱們對每一個「鏈」上都放置了一串規則,可是這些規則是有些很類似,好比,A類規則都是對IP或者端口的過濾,B類規則是修改報文,那麼這個時候,咱們就須要把實現相同功能的規則放在一塊兒。
咱們把具備相同功能的規則的集合叫作「表」。因此說,不一樣功能的規則,咱們能夠放置在不一樣的表中進行管理。而iptables已經爲咱們定義了4中表,每種表對應了不一樣的功能,而咱們定義的規則也都逃脫不了這4中功能的範圍,也就是說,全部的規則都存在於這4張「表」中。
iptables爲咱們提供的表的分類,以下: centos
PREROUTING 的規則能夠存在於:raw表、mangle表、nat表。
INPUT 的規則能夠存在於:mangle表、filter表 (centos7中還有nat表,centos6中沒有)。
FORWARD 的規則能夠存在於:mangle表、filter表。
OUTPUT 的規則能夠存在於:raw表、mangle表、nat表、filter表。
POSTROUTING 的規則能夠存在於:mangle表、nat表。 安全
raw 表中的規則能夠被哪些鏈使用:PREROUTING、OUTPUT
mangle 表中的規則能夠被哪些鏈使用:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 表中的規則能夠被哪些鏈使用:PREROUTING、OUTPUT、POSTROUTING(centos7中還有INPUT,centos6中沒有)
filter 表中的規則能夠被哪些鏈使用:INPUT、FORWARD、OUTPUT bash
ACCEPT:容許數據包經過
DROP:直接丟棄數據包,不給任何迴應信息,這時候客戶端會感受本身的請求石沉大海了,過了超時時間纔會有反應。
REJECT:拒絕數據包經過,必要時會給數據發送端一個相應的信息,客戶端剛請求就會收到拒絕的信息。
SNAT:源地址轉換,解決內網用戶用同一個公網地址上網的問題。
MASQUERADE:是SNAT的一種特殊形式,適用於動態的、臨時會變的IP上。
DNAT:目標地址轉換。
REDIRECT:在本機作端口映射。
LOG:在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條數據,也就是說除了記錄之外不對數據包作任何其餘操做,仍然讓下一條規則去匹配。 服務器
-n:以數字格式顯示地址和端口號
-v:顯示詳細信息
-vv:更詳細
-L:查看規則 網絡
[root@CentOS7-2 ~]#iptables -vnL Chain INPUT (policy ACCEPT 14412 packets, 1265K bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 22 packets, 1848 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 1154 packets, 139K bytes) pkts bytes target prot opt in out source destination
-t:指定表併發
[root@CentOS7-2 ~]#iptables -vnL -t nat Chain PREROUTING (policy ACCEPT 154 packets, 21417 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 139 packets, 20247 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 Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
-A:添加規則
-p:指定協議、--dport:指定目標端口、--sport:指定源端口 框架
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.104 -p icmp -j REJECT [root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.1 -j ACCEPT
--line-numbers:查看規則序列號
[root@CentOS7-2 ~]#iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable 120 8148 ACCEPT all -- * * 192.168.36.1 ....
-R:替換指定鏈上的指定規則編號
[root@CentOS7-2 ~]#iptables -R INPUT 1 -s 192.168.36.100 -p icmp -j REJECT [root@CentOS7-2 ~]#iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 56 packets, 5013 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable ....
-Z:置零,將計數器清零
[root@CentOS7-2 ~]#iptables -Z INPUT [root@CentOS7-2 ~]#iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 9 packets, 662 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable ....
-S:以命令格式顯示
[root@CentOS7-2 ~]#iptables -S -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N TEST -A INPUT -s 192.168.36.100/32 -p icmp -j REJECT --reject-with icmp-port-unreachable
-I:插入,要指明插入至的規則編號
[root@CentOS7-2 ~]#iptables -I INPUT 3 -j REJECT
-D:刪除規則,要指明規則編號
規則刪除,後面的規則編號自動進行排序 [root@CentOS7-2 ~]#iptables -D INPUT 1 [root@CentOS7-2 ~]#iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 193 13252 ACCEPT all -- * * 192.168.36.1 0.0.0.0/0 2 679 62517 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
-N:new, 自定義一條新的規則鏈
[root@CentOS7-2 ~]#iptables -N TEST [root@CentOS7-2 ~]#iptables -vnL ... Chain TEST (0 references) pkts bytes target prot opt in out source destination
-X:delete,刪除自定義的空的規則鏈
[root@CentOS7-2 ~]#iptables -X TEST-M
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:ACCEPT:接受、DROP:丟棄
[root@CentOS7-2 ~]#iptables -P INPUT DROP [root@CentOS7-2 ~]#iptables -vnL Chain INPUT (policy DROP 0 packets, 0 bytes)
-E:重命名自定義鏈;引用計數不爲0的自定義鏈不可以被重命名,也不能被刪除
[root@CentOS7-2 ~]#iptables -E TEST TEST-M [root@CentOS7-2 ~]#iptables -vnL .... Chain TEST-M (0 references) pkts bytes target prot opt in out source destination
-F:清空指定的規則鏈,不指定鏈則清空當前表
[root@CentOS7-2 ~]#iptables -F -t filter
以離散方式定義多端口匹配,最多指定15個端口
例題:拒絕192.1688.36.100主機訪問192.168.36.104(本機)的20,21,22,80端口
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -d 192.168.36.104 -p tcp -m multiport --dport 20:22,80 -j REJECT
指明連續的(但通常不是整個網絡)ip地址範圍
例題:禁止192.168.36.90-192.168.36.101主機訪問192.168.36.104主機的80端口
[root@CentOS7-2 ~]#iptables -A INPUT -d 192.168.36.104 -p tcp --dport 80 -m iprange --src-range 192.168.36.90-192.168.36.101 -j REJECT
指明源MAC地址
適用於:PREROUTING, FORWARD,INPUT鏈
例題:指明源MAC地址,能夠經過icmp協議訪問本機
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p icmp -m mac --mac-source 00:0C:29:5A:43:B7 -j ACCEPT [root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -j REJECT
對報文中的應用層數據作字符串模式匹配檢測
例題1:對訪問的地址進行限制
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p tcp --dport 80 -m string --algo bm --string "mage" -j REJECT
例題2:對web站點頁面中任何包含magedu的字符串的頁面進行規則限制
請求報文中不會包含mage,一半來說只包含訪問某個頁面,那麼請求內容無非包含了請求某個連接而已。 響應報文中會封裝頁面的內容信息,所以網頁內容會出如今響應報文中,而不是請求報文。 因此,對web頁面內容進行規則限制須要在OUTPUT鏈進行規則設定 [root@CentOS7-2 ~]#iptables -A OUTPUT -d 192.168.36.100 -p tcp --sport 80 -m string --algo bm --string "magedu" -j REJECT
例題3:拒絕含有「OOXX」字樣的報文進入主機
[root@CentOS7-2 ~]#iptables -A INPUT -m string --algo bm --string "OOXX" -j REJECT
根據將報文到達的時間與指定的時間範圍進行匹配
例題1:禁止192.168.36.0/24網段主機在08:00~18:00時間段內訪問主機80端口
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.0/24 -d 192.168.36.104 -p tcp --dport 80 -m time --timestart 08:00 --timestop 18:00 --kerneltz -j DROP
例題2:週六日不能訪問80端口
[root@CentOS7-2 ~]#iptables -A OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j DROP
使用connlimit擴展模塊,能夠限制每一個IP地址同時連接到server端的鏈接數量,注意:不須要指定IP,此模塊默認就是針對「每一個客戶端IP」,即對單IP的併發鏈接數限制。
例題1:每一個IP地址最多隻能佔用兩個ssh連接遠程到本機
[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
例題2:24網段的IP地址限制server端ssh最多鏈接10個
[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT
限制單位時間內流入的包的數量,基於收發報文的速率作匹配
例題:每分鐘生成放行10個icmp包
[root@CentOS7-2 ~]#iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT [root@CentOS7-2 ~]#iptables -t filter -A INPUT -p icmp -j REJECT
conntrack機制:追蹤本機上的請求和響應之間的關係
狀態有以下幾種:
例題1:讓已經創建的鏈接容許經過
[root@node2 ~]# iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
例題2:開啓鏈接追蹤放行響應的報文
[root@node2 ~]# iptables -I CLASS -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT [root@LVS ~]#iptables -I FORWARD -d 192.168.36.0/24 -p icmp --icmp-type 0 -j ACCEPT
[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT [root@LVS ~]#iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT [root@LVS ~]#iptables -vnL Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 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 91 7644 ACCEPT icmp -- * * 192.168.36.0/24 0.0.0.0/0 icmptype 8 16 1344 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
SNAT解決局域網訪問互聯網,本地網絡中的主機經過某一特定的地址訪問外部網絡,實現地址假裝。請求報文:修改源IP---POSTROUTING
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9 iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE
DNAT解決內網私有地址能夠被互聯網訪問, 指數據包從網卡發送出去的時候,修改數據包中的目的IP,表現爲若是你想訪問A,但是由於網關作了DNAT,把全部訪問A的數據包的目的IP所有修改成B,那麼,你實際上訪問的是B。請求報文:修改目的IP---PREROUTING
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080 iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22