iptables其實不是真正的防火墻,我們可以把它理解成一個客戶端代理,用戶通過iptables這個代理,將用戶的安全設定執行到對應的"安全框架"中,這個"安全框架"才是真正的防火墻,這個框架的名字?.NETfilter。
Netfilter是linux操作系統核心層內部的一個數據包處理模塊,它具有如下功能:網絡地址轉換(Network Address Translate),數據包內容修改以及數據包過濾的防火墻功能!
iptables其實是一個命令行工具,位于用戶空間,我們用這個工具操作真正的框架!
netfilter/iptables(下文中簡稱為iptables)組成Linux平臺下的包過濾防火墻,一般Linux系統是默認自帶啟動的。
查看是否啟動:sysctl -p 從指定的文件加載系統參數,如不指定即從/etc/sysctl.conf中加載!

iptables是按照規則來辦事的,我們就來說說規則(rules),規則其實就是網絡管理員預定義的條件,規則一般的定義為"如果數據包頭符合這樣的條件,就這樣處理這個數據包"。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的主要工作就是添加、修改和刪除這些規則。
iptables傳輸數據包的過程
當我們啟用了防火墻功能時,報文需要經過如下關卡,而這些關卡在iptables中不被稱為"關卡",而被稱為"鏈"。也就是說,根據實際情況的不同,報文經過"鏈"可能不同。

所以,根據上圖,我們能夠想象出某些常用場景中,報文的流向:
到本機某進程的報文:PREROUTING --> INPUT
由本機轉發的報文:PREROUTING --> FORWARD --> POSTROUTING
由本機的某進程發出報文(通常為響應報文):OUTPUT --> POSTROUTING
鏈(chains)
我們知道,防火墻的作用就在于對經過的報文匹配"規則",然后執行對應的"動作",所以,當報文經過這些關卡的時候,則必須匹配這個關卡上的規則,但是,這個關卡上可能不止有一條規則,而是有很多條規則,當我們把這些規則串到一個鏈條上的時候,就形成了"鏈",每個經過這個"關卡"的報文,都要將這條"鏈"上的所有規則匹配一遍,如果有符合條件的規則,則執行規則對應的動作。

5種鏈
5種鏈的說明如下:
PREROUTING:數據包進入路由表之前
INPUT:通過路由表后目的地為本機
FORWARDING:通過路由表后,目的地不為本機
OUTPUT:由本機產生,向外轉發
POSTROUTHING:發送到網卡接口之前
表(tables)
每個"鏈"上都放置了一串規則,但是這些規則有些很相似,我們把實現相同功能的規則放在一起;我們把具有相同功能的規則的集合叫做"表",所以說,不同功能的規則,我們可以放置在不同的表中進行管理。
iptables已經為我們定義了4個表: filter表、nat表、mangle表和raw表:每個表對應了不同的功能,而我們定義的規則也都逃脫不了這4種功能的范圍。
filter表:負責過濾功能,防火墻; 內核模塊:iptables_filter
nat表:network address translation,網絡地址轉換功能; 內核模塊:iptable_nat
mangle表:拆解報文,做出修改,并重新封裝的功能; 內核模塊: iptable_mangle
raw表:關閉nat表上啟用的連接追蹤機制; 內核模塊:iptable_raw
表鏈關系
某些"鏈"中注定不會包含"某類規則",讓我們看看每個"鏈"上的規則都存在于哪些"表"中:
PREROUTING鏈 的規則可以存在于:raw表,mangle表,nat表。
INPUT 鏈的規則可以存在于:mangle表,filter表,(centos7中還有nat表,centos6中沒有)。
FORWARD鏈 的規則可以存在于:mangle表,filter表。
OUTPUT鏈 的規則可以存在于:raw表,mangle表,nat表,filter表。
POSTOUTING鏈 的規則可以存在于:mangle表,nat表。
但是,我們在實際的使用過程中,往往是通過"表"作為操作入口,對規則進行定義的,之所以按照上述過程介紹iptables,是因為從"關卡"的角度更容易從入門的角度理解,但是為了以便在實際使用的時候,更加順暢的理解它們,我們還要將各"表"與"鏈"的關系羅列出來:
表(功能)<--> 鏈(鉤子):
filter表<-->三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包 內核模塊:iptables_filter.
Nat表<-->三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用于網絡地址轉換(IP、端口) 內核模塊:iptable_nat
Mangle表<-->五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數據包的服務類型、TTL、并且可以配置路由實現QOS內核模塊
Raw表<-->兩個鏈:OUTPUT、PREROUTING
作用:決定數據包是否被狀態跟蹤機制處理
iptables為我們定義了4張"表",當他們處于同一條"鏈"時,執行的優先級如下

優先級次序(由高而低):raw --> mangle --> nat --> filter
優先級次序(由高而低):raw --> mangle --> nat --> filter
iptables操作
查看filter的詳細規則:filter表<-->三個鏈: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(三次握手狀態)
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(目標端口22)
2 318 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited(默認拒絕所有)
———————
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
注:FORWARD轉發規則鏈(當源IP地址以及目標IP地址都不是本機的時候使用的規則)
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的基本語法格式
iptables [-t 表名] 命令選項 [鏈名] [匹配條件] [-j 控制類型]
iptables 【-t filter】 -I 【INPUT】 【-p tcp --dport 80】 【-j ACCEPT】
命令選項:
————
添加新的規則
- -A 在鏈的末尾追加一條規則
- -I 在鏈的開頭(或指定序號)插入一條規則
————
查看規則列表
- -L 列出所有規則條目
- -n 數字的形式顯示地址、端口信息
- -v 以更詳細的方式顯示規則信息
- --line-number 查看規則時,顯示規則的序號
[root@xing Desktop]# iptables -t filter -nvL --line-number
————
刪除、清空規則
- -D 刪除鏈內指定序號(或內容)的一條規則
- -F 清空所有的規則
[root@xing Desktop]# iptables -D FORWARD 2
[root@xing Desktop]# iptables -F(清空所有規則)
[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 ]
————
設置默認策略
-P :設置默認策略的(默認策略一般只有兩種。默認是關的/默認是開的)
iptables -P INPUT (DROP|ACCEPT)
[root@xing Desktop]# iptables -P FORWARD DROP
———————
控制類型
ACCEPT 允許通過
DOROP 直接丟棄,不給出任何提示
REJECT 拒絕通過,必要時給出提示
LOG 記錄日志信息,然后傳給下一條規則繼續匹配
———————
匹配條件【參數】
通用匹配:
協議匹配 -p [協議名]
地址匹配 -s [源地址] -d [目的地址]
接口匹配 -i [入站網卡] 、-o [出站網卡]
隱含匹配(需配合通用匹配一起使用):
端口匹配 --sport [源端口]、--dport [目的端口]
TCP標記端口 --tcp-flags [檢查范圍] [被設置的標記]
ICMP類型匹配 --icmp-type [ICMP類型]
常見的顯示匹配條件
多端口匹配 -m multiport -- sport [源端口列表]、-m multiport -- sport [目的端口列表]
IP范圍匹配 -m iprange --src-range [IP范圍]
mac地址匹配 -m mac --mac-source [MAC地址]
———————
注意事項:
不指定表名時,默認指向filter表
不指定鏈名時,默認表內所有鏈
除非設置鏈的默認策略,否則必須指定匹配條件
選項、鏈名、控制類型使用大寫字母,其余均為小寫
————————————————
[root@xing Desktop]# iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
注:命令嚴格區分大小寫
———————
輔助命令:watch(可以幫你監測一個命令的運行結果)
格式:watch (選項) (參數)
選項
-n:指定指令執行的間隔時間(秒);
-d:高亮顯示指令輸出信息不同之處;
-t:不顯示標題。
參數
指令:需要周期性執行的指令。
watch -n1 iptables -t filter -nvL
————————————————
規則備份與還原
iptables-save工具:可結合重定向輸出保存到指定文件
將當前狀態保存到一個桌面的文件中
[root@xing Desktop]# iptables-save > /root/Desktop/ipt.txt
將備份規則文件導入:
[root@xing Desktop]# iptables-restore < /root/Desktop/ipt.txt
將當前狀態保存為默認規則
[root@xing Desktop]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
恢復到默認規則
[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