https://www.zsythink.net/archives/1199
https://www.zsythink.net/archives/1517
http://www.zsythink.net/archives/1604
基礎知識
到本機某進程的報文:PREROUTING --> INPUT
由本機轉發的報文:PREROUTING --> FORWARD --> POSTROUTING
由本機的某進程發出報文(通常為響應報文):OUTPUT --> POSTROUTING
iptables為我們提供了如下"表"
filter表:負責過濾功能,防火墻;內核模塊:iptables_filter
nat表:network address translation,網絡地址轉換功能;內核模塊:iptable_nat
mangle表:拆解報文,做出修改,并重新封裝 的功能;iptable_mangle
raw表:關閉nat表上啟用的連接追蹤機制;iptable_raw
也就是說,我們自定義的所有規則,都是這四種分類中的規則,或者說,所有規則都存在于這4張"表"中
每個"鏈"中的規則都存在于哪些"表"中。
PREROUTING 的規則可以存在于:raw表,mangle表,nat表。
INPUT 的規則可以存在于:mangle表,filter表,(centos7中還有nat表,centos6中沒有)。
FORWARD 的規則可以存在于:mangle表,filter表。
OUTPUT 的規則可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING 的規則可以存在于:mangle表,nat表。
但是,我們在實際的使用過程中,往往是通過"表"作為操作入口,對規則進行定義的,之所以按照上述過程介紹iptables,是因為從"關卡"的角度更容易從入門的角度理解,但是為了以便在實際使用的時候,更加順暢的理解它們,此處我們還要將各"表"與"鏈"的關系羅列出來,
表(功能)<--> 鏈(鉤子):
raw 表中的規則可以被哪些鏈使用:PREROUTING,OUTPUT
mangle 表中的規則可以被哪些鏈使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表中的規則可以被哪些鏈使用:PREROUTING,OUTPUT,POSTROUTING(centos7中還有INPUT,centos6中沒有)
filter 表中的規則可以被哪些鏈使用:INPUT,FORWARD,OUTPUT
處理動作
處理動作在iptables中被稱為target(這樣說并不準確,我們暫且這樣稱呼),動作也可以分為基本動作和擴展動作。
此處列出一些常用的動作,之后的文章會對它們進行詳細的示例與總結:
ACCEPT:允許數據包通過。
DROP:直接丟棄數據包,不給任何回應信息,這時候客戶端會感覺自己的請求泥牛入海了,過了超時時間才會有反應。
REJECT:拒絕數據包通過,必要時會給數據發送端一個響應的信息,客戶端剛請求就會收到拒絕的信息。
SNAT:源地址轉換,解決內網用戶用同一個公網地址上網的問題。
MASQUERADE:是SNAT的一種特殊形式,適用于動態的、臨時會變的ip上。
DNAT:目標地址轉換。
REDIRECT:在本機做端口映射。
LOG:在/var/log/messages文件中記錄日志信息,然后將數據包傳遞給下一條規則,也就是說除了記錄以外不對數據包做任何其他操作,仍然讓下一條規則去匹配。
基本操作
1. 查看
-t 指定表
iptables -nvL
iptables -t filter -L 等價于:iptables -L 默認查看filter
iptables -t raw -L
iptables -t mangle -L
iptables -t nat -L
指定鏈路
iptables -t filter -L INPUT
可顯示規則的編號
iptables --line -nvL INPUT
2. 新增
-I: 插入最前面
-A: 在后面添加
與匹配策略順序有關,從上到下
命令語法:iptables -t 表名 -A 鏈名 匹配條件 -j 動作
示例:
iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
iptables -t filter -I INPUT -s 10.40.66.185 -j ACCEPT
iptables -t filter -I INPUT -s 10.40.66.205 -j DROP
命令語法:iptables -t 表名 -I 鏈名 規則序號 匹配條件 -j 動作
示例:
iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT
命令語法:iptables -t 表名 -P 鏈名 動作
示例:iptables -t filter -P FORWARD ACCEPT
3. 刪除規則
按照規則序號刪除規則,刪除指定表的指定鏈的指定規則,-D選項表示刪除對應鏈中的規則。
命令語法:iptables -t 表名 -D 鏈名 規則序號
示例:
iptables -t filter -D INPUT 3
上述示例表示刪除filter表中INPUT鏈中序號為3的規則。
按照具體的匹配條件與動作刪除規則,刪除指定表的指定鏈的指定規則。
命令語法:
iptables -t 表名 -D 鏈名 匹配條件 -j 動作
示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP
4. 清空規則
刪除指定表的指定鏈中的所有規則,-F選項表示清空對應鏈中的規則,執行時需三思。
命令語法:iptables -t 表名 -F 鏈名
示例:iptables -t filter -F INPUT
5. 修改規則
注意點:如果使用-R選項修改規則中的動作,那么必須指明原規則中的原匹配條件,例如源IP,目標IP等。
修改指定表中指定鏈的指定規則,-R選項表示修改對應鏈中的規則,使用-R選項時要同時指定對應的鏈以及規則對應的序號,并且規則中原本的匹配條件不可省略。
命令語法:iptables -t 表名 -R 鏈名 規則序號 規則原本的匹配條件 -j 動作
示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT
上述示例表示修改filter表中INPUT鏈的第3條規則,將這條規則的動作修改為ACCEPT, -s 192.168.1.146為這條規則中原本的匹配條件,如果省略此匹配條件,修改后的規則中的源地址可能會變為0.0.0.0/0。
其他修改規則的方法:先通過編號刪除規則,再在原編號位置添加一條規則。
6. 保存規則
在centos7中,使用firewall替代了原來的iptables service
我們只要通過yum源安裝iptables與iptables-services即可(iptables一般會被默認安裝,但是iptables-services在centos7中一般不會被默認安裝),在centos7中安裝完iptables-services后,即可像centos6中一樣,通過service iptables save命令保存規則了,規則同樣保存在/etc/sysconfig/iptables文件中。
#配置好yum源以后安裝iptables-service
# yum install -y iptables-services
#停止firewalld
# systemctl stop firewalld
#禁止firewalld自動啟動
# systemctl disable firewalld
#啟動iptables
# systemctl start iptables
#將iptables設置為開機自動啟動,以后即可通過iptables-service控制iptables服務
# systemctl enable iptables
上述配置過程只需一次,以后即可在centos7中愉快的使用service iptables save命令保存iptables規則了。
其他通用保存方法
使用如下方法保存規則
iptables-save > /etc/sysconfig/iptables
可以使用如下命令從指定的文件載入規則,注意:重載規則時,文件中的規則將會覆蓋現有規則。
iptables-restore < /etc/sysconfig/iptables
7. iptables的黑白名單機制
允許指定ip段訪問指定端口,其余ip不可以訪問此端口
實例:172.16.65開頭的ip可以訪問此機器的2181 端口,其余不可以訪問
iptables -I INPUT -s 172.16.65.0/24 -p tcp --dport 2181 -j ACCEPT
iptables -A INPUT -p tcp --dport 2181 -j DROP
黑名單:阻止10.1.1.1 訪問3010端口,其他都可以訪問
iptables -I INPUT -s 10.1.1.1 -p tcp --dport 3010 -j DROP
我們就來做一個簡單的白名單吧,也就是說,只放行被規則匹配到的報文,其他報文一律拒絕