iptables 詳解

用途

1.使用iptables防火牆保護公司web服務器
2.使用iptables搭建路由器,通過SNAT使用內網機器上網
3.限制某些IP地址訪問服務器
4.使用DNAT功能把內網web服務器端口映射到路由器外網

簡介

實際上由兩個組件netfilter 和 iptables 組成。
netfilter/iptables 關係:
netfilter 組件也稱爲內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。 iptables是基於內核的防火牆,功能非常強大,iptables內置了filter,nat和mangle三張表。所有規則配置後,立即生效,不需要重啓服務。

三表

filter負責過濾數據包,包括的規則鏈有,input,output和forward;
nat則涉及到網絡地址轉換,包括的規則鏈有,prerouting,postrouting和output;
mangle表則主要應用在修改數據包內容上,用來做流量整形的,給數據包打個標識,默認的規則鏈有:INPUT,OUTPUT、 forward,POSTROUTING,PREROUTING;

五鏈

input匹配目標IP是本機的數據包
output 出口數據包 , 一般不在此鏈上做配置
forward匹配流經本機的數據包
prerouting用來修改目的地址,用來做DNAT 。如:把內網中的80端口映射到路由器外網端口上
postrouting用來修改源地址用來做SNAT。 如:內網通過路由器NAT轉換功能實現內網PC機通過一個公網IP地址上網。
在這裏插入圖片描述
在這裏插入圖片描述

整體數據包分兩類: 1、發給防火牆本身的數據包 ;2、需要經過防火牆的數據包
1.當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
2.如果數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。
3.如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。

注意:規則的次序非常關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。

[root@localhost ~]# systemctl stop firewalld.service            #停止firewall
[root@localhost ~]# systemctl disable firewalld.service        #禁止firewall開機啓動
[root@localhost ~]# yum install iptables-services            #安裝
[root@localhost ~]# ls /etc/sysconfig/iptables   #配置文件位置
[root@localhost ~]# systemctl start iptables.service  #啓動服務
[root@localhost ~]# systemctl enable iptables.service  #開機啓動

語法

在這裏插入圖片描述
在這裏插入圖片描述
-A <鏈名> APPEND,追加一條規則(放到最後)

iptables -t filter -A INPUT -j DROP    #拒絕所有人訪問服務器

在 filter 表的 INPUT 鏈裏追加一條規則(作爲最後一條規則),匹配所有訪問本機 IP 的數據包,匹配到的丟棄

-I <鏈名> [規則號碼] INSERT,插入一條規則

iptables -I INPUT -j DROP   # 在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 1 條)
iptables -I INPUT 3 -j DROP #    在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 3 條)

注意:
1、-t filter 可不寫,不寫則自動默認是 filter 表
2、-I 鏈名 [規則號碼],如果不寫規則號碼,則默認是 1
3、確保規則號碼 ≤ (已有規則數 + 1),否則報錯

-R num:Replays替換/修改第幾條規則
iptables –t filter -R INPUT 3 ………… 修改filter的INPUT鏈第三條規則

-D <鏈名> <規則號碼 | 具體規則內容> DELETE,刪除一條規則

iptables -D INPUT 1  #按號碼匹配,刪除 filter 表 INPUT 鏈中的第1條規則

-P <鏈名> <動作> POLICY,設置某個鏈的默認規則

 iptables -P INPUT DROP # 設置 filter 表 INPUT 鏈的默認規則(policy)是 DROP

-F [鏈名] FLUSH,清空規則

[root@localhost ~]# iptables -t filter -A INPUT -j DROP
[root@localhost ~]# iptables -F INPUT   #清除INPUT鏈上的規則
[root@localhost ~]# iptables -F   #清除filter表中所有鏈上的規則
[root@localhost ~]# iptables -t nat -F  #清空NAT表中    所有鏈上的規則
[root@localhost ~]# iptables -t nat -F PREROUTING  #清空NAT表中  PREROUTING鏈上的

注意:
1.-F 僅僅是清空鏈中規則,並不影響 -P 設置的默認規則。 需要手動改:
2.-P 設置了 DROP 後,使用 -F 一定要小心!!!
##在生產環境中,使用-P DROP 這條規則,一定要小心,設置之前最好配置下面兩個任務計劃,否則容易把自己drop掉,鏈接不上遠程主機。
3.如果不寫鏈名,默認清空某表裏所有鏈裏的所有規則

-Z 將封包計數器歸零

-L [鏈名] LIST,列出規則
v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數
x:在 v 的基礎上,禁止自動單位換算(K、M)
n:只顯示 IP 地址和端口號碼,不顯示域名和服務名稱
–line-number 可以查看到規則號

iptables -t nat -vnL   # 用詳細方式列出 nat 表所有鏈的所有規則,只顯示 IP 地址和端口號

匹配條件

1.流入、流出接口(-i、-o)
2.來源、目的地址(-s、-d)
3.協議類型 (-p)
4.來源、目的端口(–sport、–dport)

-i <匹配數據進入的網絡接口> #此參數主要應用於nat表,例如目標地址轉換
-i eth0 #匹配是否從網絡接口 eth0 進來
-i ppp0 #匹配是否從網絡接口 ppp0 進來
-o #匹配數據流出的網絡接口

按目的地址匹配

-s <匹配來源地址>
可以是 IP、 網段、域名,也可空(任何地址)
-s 192.168.0.1 #匹配來自 192.168.0.1 的數據包
-s 192.168.1.0/24 #匹配來自 192.168.1.0/24 網絡的數據包
-s 192.168.0.0/16 #匹配來自 192.168.0.0/16 網絡的數據包

-d <匹配目的地址> #可以是 IP、 網段、域名,也可以空
-d 202.106.0.20 匹配去往 202.106.0.20 的數據包
-d 202.106.0.0/16 匹配去往 202.106.0.0/16 網絡的數據包
-d www.abc.com 匹配去往域名 www.abc.com 的數據包

按協議類型匹配

-p <匹配協議類型>
可以是 TCP、UDP、ICMP 等,也可爲空
-p tcp
-p udp
-p icmp --icmp-type 類型

按來源目的端口匹配

–sport <匹配源端口>
可以是個別端口,可以是端口範圍
–sport 1000 #匹配源端口是 1000 的數據包
–sport 1000:3000 匹配源端口是 1000-3000 的數據包(含1000、3000)
–sport :3000 #匹配源端口是 3000 以下的數據包(含 3000)
–sport 1000: #匹配源端口是 1000 以上的數據包(含 1000)

–dport <匹配目的端口>
可以是個別端口,可以是端口範圍
–dport 80 #匹配目的端口是 80 的數據包
–dport 6000:8000 #匹配目的端口是 6000-8000 的數據包(含6000、8000)
–dport :3000 #匹配目的端口是 3000 以下的數據包(含 3000)
–dport 1000: #匹配目的端口是 1000 以上的數據包(含 1000)
注意:–sport 和 --dport 必須配合 -p 參數使用

匹配應用舉例

-p udp --dport 53 #匹配網絡中目的端口是 53 的 UDP 協議數據包
-s 10.1.0.0/24 -d 172.17.0.0/16 #匹配來自 10.1.0.0/24 去往 172.17.0.0/16 的所有數據包端口和地址聯合匹配 
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80 #匹配來自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 協議數據包

動作

-j ACCEPT
通過,允許數據包通過本鏈而不攔截它

iptables -A INPUT -j ACCEPT #允許所有訪問本機 IP 的數據包通過

-j DROP
丟棄,阻止數據包通過本鏈而丟棄它

iptables -A FORWARD -s 192.168.80.39 -j DROP #阻止來源地址爲 192.168.80.39 的數據包通過本機

-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 鏈)
源地址轉換,SNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池(一組連續的 IP 地址)

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1

將內網 192.168.0.0/24 的原地址修改爲 1.1.1.1,用於 NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10 #同上,只不過修改成一個地址池裏的 IP

-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 鏈)
目的地址轉換,DNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1 #把從 eth0 進來的要訪問 TCP/80 的數據包目的地址改爲 192.168.0.1
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to 192.168.0.1:81 
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.169.0.10 #把從 eth0 進來的要訪問 TCP/80 的數據包目的地址改爲 192.168.0.1-192.169.1.10

-j MASQUERADE 僞裝
動態源地址轉換(動態 IP 的情況下使用)
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE #將源地址是 192.168.0.0/24 的數據包進行地址僞裝,轉換成eth0上的IP地址。eth0爲路由器外網出口IP地址

附加模塊
1.按包狀態匹配 (state)
2.按來源 MAC 匹配(mac)
3.按包速率匹配 (limit)
4.多端口匹配 (multiport)

按包狀態匹配 (state)
-m state --state 狀態
狀態:NEW、RELATED、ESTABLISHED、INVALID
NEW:有別於 tcp 的 syn #如果我們發送一個流的初始化包,狀態就會在OUTPUT鏈 裏被設置爲NEW,當我們收到迴應的包時,狀態就會在PREROUTING鏈裏被設置爲ESTABLISHED。如果第一個包不是本地產生的,那就會在PREROUTING鏈裏被設置爲NEW狀 態。
ESTABLISHED:連接態
RELATED:衍生態,與 conntrack 關聯(FTP)
INVALID:不能被識別屬於哪個連接或沒有任何狀態

iptables -A INPUT -m state --state RELATED,ESTABLISHED  -j ACCEPT

按來源 MAC 匹配(mac)
-m mac --mac-source MAC
匹配某個 MAC 地址

iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP #阻斷來自某 MAC 地址的數據包,通過本機

注意: 報文經過路由後,數據包中原有的 mac 信息會被替換,所以在路由後的 iptables 中使用 mac 模塊是沒有意義的

按包速率匹配 (limit)
-m limit --limit 匹配速率 [–burst 緩衝數量]

 iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s  -j ACCEPT
 iptables -A FORWARD -d 192.168.0.1 -j DROP

注意:limit 英語上看是限制的意思,但實際上只是按一定速率去匹配而已,50/s表示1秒中轉發50個數據包,要想限制的話後面要再跟一條 DROP

多端口匹配 (multiport)
-m multiport <–sports|–dports|–ports> 端口1[,端口2,…,端口n]
一次性匹配多個端口,可以區分源端口,目的端口或不指定端口

iptables -A INPUT -p tcp -m multiport --dports  21,22,25,80,110 -j ACCEPT

注意:必須與 -p 參數一起使用

service iptables save

直接添加的規則,一定要保存。或直接修改配置文件進行保存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章