linux防火牆iptables

2023-08-30 18:00:26

iptables

1,iptables的組成概述

netfilter/iptables:IP 資訊包過濾系統,它實際上由兩個元件 netfilter 和 iptables組成。 主要工作在網路層,針對IP封包,體現在對包內的IP地址、埠等資訊的處理。

netfilter/iptables關係:

netfilter:

屬於「核心態」又稱核心空間(kernel space)的防火牆功能體系。linux 好多東西都是核心態 使用者態,那我們運維人員關注的是使用者態, 核心我們關注不是很多,核心基本是我們開發人員關心的事情是核心的一部分,由一些資訊包過濾表組成,這些表包含核心用來控制資訊包過濾處理的規則集。

iptables :

屬於「使用者態」(User Space, 又稱為使用者空間)的防火牆管理體系。是一種用來管理Linux防火牆的命令程式,它使插入、修改和刪除封包過濾表中的規則變得容易,通常位於/sbin/iptables目錄下。 netfilter/iptables後期簡稱為iptables。iptables是基於核心的防火牆,其中內建了raw、mangle、 nat和filter四個規則表。表中所有規則設定後,立即生效,不需要重啟服務。

 

iptables由五個表table和五個鏈chain以及一些規則組成

image-20230822171325041

五個表

table:filter、nat、mangle、raw、security

filter 過濾規則表,根據預定義的規則過濾符合條件的封包,預設表
nat 地址轉換規則表
mangle 修改資料標記位規則表
raw 關閉啟用的連線跟蹤機制,加快封包穿越防火牆速度
security 用於強制存取控制(MAC)網路規則,由Linux安全模組(如SELinux)實現 (瞭解)

優先順序由高到低的順序為:

security -->raw-->mangle-->nat-->filter

總結

規則表的作用:容納各種規則鏈; 表的劃分依據:防火牆規則的作用相似

規則鏈的作用:容納各種防火牆規則;規則的作用:對封包進行過濾或處理 ;鏈的分類依據:處理封包的不同時機

總結:表裡有鏈,鏈裡有規則

五鏈:

INPUT 處理入站封包,匹配目標IP為本機的封包。
OUTPUT 處理出站封包,一般不在此鏈上做設定。
FORWARD 處理轉發封包,匹配流經本機的封包。
PREROUTING 在進行路由選擇前處理封包,用來修改目的地址,用來做DNAT。相當於把內網伺服器的IP和埠對映到路由器的外網IP和埠上。
POSTROUTING 在進行路由選擇後處理封包,用來修改源地址,用來做SNAT。相當於內網通過路由器NAT轉換功能實現內網主機通過一個公網IP地址上網。

核心中封包的傳輸過程

  1. 當一個封包進入網路卡時,封包首先進入PREROUTING鏈,核心根據封包目的IP判斷是否需要 轉送出去

  2. 如果封包是進入本機的,封包就會沿著圖向下移動,到達INPUT鏈。封包到達INPUT鏈後, 任何程序都會收到它。本機上執行的程式可以傳送封包,這些封包經過OUTPUT鏈,然後到達

  3. 如果封包是要轉發出去的,且核心允許轉發,封包就會向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出

2,實際操作

CentOS7預設使用firewalld防火牆,沒有安裝iptables,若想使用iptables防火牆。必須先關閉firewalld防火牆,再安裝iptables

 

前期準備工作
​
systemctl stop firewalld.service
​
systemctl disable  --now  firewalld.service
##開機不自啟  並且立即關閉
systemctl enable  --now  firewalld.service
##開機自啟  並且 立即開啟
​
yum -y install iptables iptables-services
systemctl start iptables.service
systemctl enable iptables.service

2.1 iptables的設定方法

  1. 使用iptables命令列。

  2. 使用圖形化管理工具system- config- firewall

    2.2使用iptables命令列設定規則

    命令格式:

     iptables  [-t 表名]  管理選項  [鏈名]  [匹配條件] [-j 控制型別]

    注意事項:

  • 不指定表名時,預設指filter表

  • 不指定鏈名時,預設指表內的所有鏈

  • 除非設定鏈的預設策略,否則必須指定匹配條件

  • 控制型別使用大寫字母,其餘均為小寫

image-20230822173546890

常用控制型別:

ACCEPT 允許封包通過
DROP 直接丟棄封包,不給出任何回 應資訊。
REJECT 拒絕封包通過,必要時會給資料傳送端一個響應資訊。
LOG 在/var/log/messages 檔案中記錄紀錄檔資訊,然後將封包傳遞給下一條規則。LOG只是一種輔助動作,並沒有真正處理封包
SNAT 修改封包的源地址。
DNAT 修改封包的目的地址
MASQUERADE 偽裝成一個非固定公網IP地址。

常用管理選項:

-A 在指定鏈的末尾追加(--append)一條新的規則
-I(大寫i) 在指定鏈的開頭插入(--insert)一條新的規則,未指定序號時預設作為第一條規則
-R 修改、替換(--replace) 指定鏈中的某一條規則,可指定規則序號或具體內容
-P 設定指定鏈的預設策略(--policy)
-D 刪除(--delete) 指定鏈中的某一條規則,可指定規則序號或具體內容
-F 清空(--flush)指定鏈中的所有規則,若未指定鏈名,則清空表中的所有鏈
-L 列出(--list) 指定鏈中所有的規則,若未指定鏈名,則列出表中的所有鏈
-n 使用數位形式(--numeric) 顯示輸出結果,如顯示IP地址而不是主機名
-v 顯示詳細資訊,包括每條規則的匹配包數量和匹配位元組數
--line-numbers 檢視規則時,顯示規則的序號

匹配條件:

-p 指定要匹配的封包的協定型別
-s 指定要匹配的封包的源IP地址
-d 指定要匹配的封包的目的IP地址
-i 指定封包進入本機的網路介面
-o 指定封包離開本機做使用的網路介面
–sport 指定源埠號
–dport 指定目的埠號

2.3規則設定範例

範例1:檢視規則 -nL

[root@localhost ~]# iptables -L   //不指定預設檢視filter表中所有規則
[root@localhost ~]# iptables -nL  //以數位形式顯示
[root@localhost ~]# iptables -nL -t nat  //檢視nat表規則
[root@localhost ~]# iptables -nL --line-numbers  //顯示序列號
[root@localhost ~]# iptables -t filter -F  清空 filter表內所有規則
[root@localhost ~]# iptables -nL    //檢視filter為空
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
​
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
[root@localhost ~]# iptables -F  //清空所有規則鏈中的所有規則
​
​

1、 iptables -L,列出表中所有鏈。不指定表名則預設檢視filter表。

image-20230822192213779

2、 iptables -L -n,以數位形式顯示輸出結果。-L -n 合在一起寫時,必須n在前,要寫成 -nL。

image-20230822192306957

3、iptables -nL -t nat,檢視nat表。

image-20230822192431944

4,顯示序列號

image-20230822192721409

5、iptables -t filter -F,清空 filter表內所有規則。

image-20230822192858527

6,執行 iptables -F 後,所有的規則鏈(包括預設的鏈)中的規則都會被刪除,但是預設策略(預設動作)不會被改變。

image-20230822193411588

範例2:新增規則 -A -I

-A,在末尾追加規則。

-I,在指定位置前插入規則。如果不指定,則在首行插入

[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT
#//不允許任何主機ping本主機
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 58 packets, 3088 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
​
[root@localhost ~]# iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT
# //允許主機ssh埠 通過我的
[root@localhost ~]# iptables -nL --line-numbers
#--line-numbers顯示行號
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     icmp --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
​
​

3刪除、清空、替換規則

替換:

iptables -A INPUT -s 192.168.1.200 -j DROP
iptables -nvL  --line-numbers
​
iptables -R INPUT 1 -s 192.168.1.200 -j ACCEPT 
iptables -nvL  --line-numbers

image-20230830162900301

刪除規則 -D

1、按序號刪除,比較準確。

2、按內容刪除,如果有2條相同內容,會刪除序號小的那個。

[root@localhost ~]# iptables -nL --line-number //顯示規則序號
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  192.168.1.200        0.0.0.0/0
​
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
​
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
[root@localhost ~]# iptables -D INPUT 1  刪除INPUT規則連中的第1條規則
[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
​
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
​
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
[root@localhost ~]# iptables -D INPUT -p tcp -j DROP
//刪除INPUT鏈中tcp協定ACCEPT的規則

image-20230830163951886

清空指定鏈或表中的所有防火牆規則,使用管理選項「-F」。例如,若要清空 filter 表 INPUT

[root@localhost ~]# iptables -F INPUT
[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination  
​

設定預設策略 -P

未修改的狀況下,預設策略為ACCEPT(允許)。

注意:

將預設策略修改為DROP前,一定要檢查清楚鏈內是否設定了允許tcp協定22埠進行連線的規則。否則一旦修改為DROP,會導致ssh斷連。

iptables -P INPUT DROP //將預設策略修改為DROP

3 匹配條件

通用匹配

可直接使用, 不依賴於其他條件或擴充套件包括網路協定、IP地址、網路介面等條件。

協定匹配 -p 協定名
地址匹配 -s 源地址、-d 目的地址 。可以是IP、網段、域名、空(任何地址)
介面匹配 -i 入站網路卡、-o 出站網路卡
 iptables -A INPUT ! -p icmp -j ACCEPT
 #沒有-t指定表,就是指預設表filter表
 # !代表條件取反,不是icmp的都放通
  
 iptables -A INPUT -s 192.168.1.100 -j REJECT
 #拒絕從哪個主機發封包過來(-s指定了源地址)
  
 iptables -I INPUT -i ens33 -s 192.168.1.0/24 -j DROP
 #在行首插入規則,丟棄該網段從ens33網路卡進來的封包

範例1:

! 取反時需要注意。

「不是icmp的都放通」,即放通的協定中不包括icmp,這條規則沒有針對icmp。那麼icmp協定會向下查詢匹配,如果匹配不到規則,那麼就會取預設策略ACCEPT,則此時其他主機可以ping通本機。

image-20230830170029038

使用其他主機ping本機,可以ping通。

image-20230830165936700

2 隱含匹配

要求以特定的協定匹配作為前提,包括埠、TCP標記、ICMP類 型等條件。

2.1 埠匹配

埠匹配:--sport 源埠、--dport 目的埠。

可以是個別埠或者埠範圍。

格式 含義
--sport 1000 匹配源埠是1000的封包
--sport 1000:3000 匹配源埠是1000-3000的封包
--sport 1000: 匹配源埠是1000及以上的封包
--sport :3000 匹配源埠是3000及以下的封包

注意: --sport 和 --dport 必須配合 -p <協定型別> 使用

image-20230830170750040

2.2 TCP標記匹配

--tcp-flags TCP標記

 #TCP三次握手時的第一次握手,放行SYN為1的報文,拒絕其他包。
 iptables -I INPUT -P tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH  SYN  -j  REJECT
 
 #第二次握手放行SYN、ACK為1的報文,拒絕其他包。
 iptables -I OUTPUT -P tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH  SYN,ACK  -j  REJECT

2.3 ICMP型別匹配

--icmp-type ICMP型別

ICMP型別可以是字串、數位程式碼

ICMP型別 含義
Echo-Request (程式碼為8 表示請求
Echo- -Reply (程式碼為0) 表示回顯
Dest ination-Unreachable (程式碼為3) 表示目標不可達

注: 其他可用的icmp協定型別,可以執行iptables -p icmp -h 檢視幫助資訊。

 --icmp-type 8   //表示請求(ping),即其他主機向本機請求(ping本機)
 --icmp-type 0   //表示回顯(pong),即本機向其他主機發封包(本機ping其他主機)
 --icmp-type 3   //當本機ping不通其他主機時,提示目標不可達。
 
 例子:
 #丟棄icmp的包,別人ping不通本機,本機也ping不通別人
 iptables -A INPUT -p icmp -j DROP
 
 #丟棄icmp的請求,禁止其他主機ping本機,但本機可以ping其他主機
 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT 
 
 #當本機ping不通其它主機時提示目標不可達,此時其它主機需要設定關於icmp協定的控制型別為REJECT
 iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT

範例:

丟棄icmp協定的請求,禁止其他主機ping本機,但本機可以ping其他主機。

image-20230830171108006

image-20230830171118486

3 顯示匹配

要求以「-m擴充套件模組」的形式明確指出型別,包括多埠、MAC地址、IP範圍、封包狀態等條件

3.1 多埠匹配

  • -m multiport --sport 源埠列表

  • -m multiport --dport 目的埠列表

iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
 iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT

.3.2 IP範圍匹配

  • -m iprange --src-range 源IP範圍

  • -m iprange --dst-range 目的IP範圍

 iptables -A FORWARD -p udp -m iprange --src-range 192.168.72.100-192.168.72.200 -j DROP
 # 禁止轉發源地址位於192.168.72.100——192.168.72.200的udp封包

3.3 狀態匹配

格式:

 -m state --state連線狀態

常見的連線狀態:

狀態 含義
NEW 主機連線目標主機,在目標主機上看到的第一個想要連線的包
ESTABLISHED 主機已與目標主機進行通訊,判斷標準只要目標主機迴應了第一個包,就進入該狀態
主機已與目標主機進行通訊,判斷標準只要目標主機迴應了第一個包,就進入該狀態 主機已與目標主機進行通訊,目標主機發起新的連結方式,一般與ESTABLISHED配合使用
INVALID 無效的封包,例如資料破損的封包狀態

範例:

 iptables -I INPUT -M state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
 #第一個包我只看22埠的包
 #-p tcp是隱含匹配,可以省略-m tcp
  
 iptables -A INPUT -p tcp -m multiport --dport 443,80,22,21,20,53 -j ACCEPT
 #允許放通tcp的這些埠號
 #-m multiport載入多個埠模組
  
 iptables -A INPUT -p udp --dport 53 -j ACCEPT
 #放通UDP的53埠進來的包(DNS伺服器返回資訊時預設使用UDP的53埠)
 ​
 iptables -A INPUT -p tcp -m state --state ESTABLISHED ,RELATED -j ACCEPT
 #對進來的包的狀態進行檢測。已經建立tcp連線的包以及該連線相關的包允許通過。簡單來說就是隻允許所有自己發出去的包進來。
 #比如我和你做生意,我們談成了生意,到了支付的時候,就可以直接呼叫與這筆生意相關的支付功能。
  
 iptables -P INPUT DROP
 #預設關閉,將以上的設定設為白名單

4 總結

1、Linux防火牆的兩個元件:

  • 核心態 netilter(儲存包過濾處理的規則集)

  • 使用者態 iptables(防火牆規則管理工具)


2、封包五要素:

源IP,目的IP,源埠,目的埠 ,協定UDP/TCP


3、四表:

  • raw 對封包進行狀態跟蹤

  • mangle 修改封包內容,給封包設定標記

  • nat 地址轉換,轉換源/目的IP或者埠

  • fileter 過濾封包 放行 丟棄


4、五鏈:

  • INPUT 入站

  • OUTPUT 出站

  • FORWARD 轉發

  • PREROUTING 路由前修改目的地址

  • POSTROUTING 路由後修改源IP


5、匹配順序

1)封包到達防火牆時,規則表之間的優先順序:raw >mangle > nat > filter。

2)規則鏈之間的匹配順序:

主機型防火牆

  • 入站資料(來自外界的封包,且目標地址是防火牆本機):PREROUTING --> INPUT -->本機的應用程式

  • 出站資料(從防火牆本機向外部地址傳送的封包):本機的應用程式---->OUTPUT ----->POSTROUTING;

網路型防火牆

  • 轉發資料(需要經過防火牆轉發的封包):PREROUTING -->FORWARD -->POSTROUTING

3)鏈中的規則集:從上往下一次匹配,匹配到規則即停止,若都沒有匹配到則按預設策略處理


6、管理選項

iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制型別]

  • 增:-A 在末尾新增,-I 在指定位置插入

  • 刪:-D 刪除指定規則,-F 清空所有規則

  • 改:-R,或者-A 新增後 -D 刪除

  • 查:-nL 以數位形式顯示,--line-numbers 顯示規則的序號

  • 設定預設規則:-P

注意:

刪除規則前,以及將預設規則修改為DROP之前,一定要先想清楚會不會導致ssh斷連。


7、 匹配條件

  • -p tcp|udp|icmp

  • -s 源IP

  • -d 目的IP

  • -i 入站網路卡

  • -o 出站網路卡