Linux之iptables防火牆

語言: CN / TW / HK

theme: vue-pro

所謂防火牆也稱之為防護牆,它是一種位於內部網路與外部網路之間的網路安全系統。一項資訊保安的防護系統。按照給定的規則,允許或者限制網路報文通過。

  • 硬體防⽕牆:通過硬體和軟體的組合,基於硬體的防⽕牆保護整個內部網路安全。(例如 華為E9000)
  • 軟體防⽕牆:通過純軟體,單獨使⽤軟體系統來完成防⽕牆功能,保護安裝它的系統。

大型公司都是以硬體防火牆為主,軟體防火牆為輔。軟體防火牆根據情況來決定是否開啟,如果伺服器效能不夠,可能會關閉軟體防火牆。

1 iptables防火牆概述

Linux系統自帶的軟體防火牆:

  • iptables:Centos 5/6 系統預設防火牆
  • firewalld:Centos 7/8 系統預設防火牆

1.1 iptables概述

iptables是Linux系統的防火牆, IP資訊包過濾系統,它實際上由兩個元件netfilter和iptables組成。

主要工作在網路層,針對IP資料包。體現在對包內的IP地址、埠、協議等資訊的處理上。屬於典型的包過濾防火牆(或稱為網路層防火牆)。

netfilter和iptables的關係:

netfilter

  • 屬於的“核心態”(Kernel Space, 又稱為核心空間)的防火牆功能體系。
  • 是核心的一部分,由一些資料包過濾表組成,這些表包含核心用來控制資料包過濾處理的規則集。

iptables

  • 屬於“使用者態”(User Space,又稱為使用者空間)的防火牆管理體系。
  • 是一種用來管理Linux防火牆的命令程式,它使插入、修改和刪除資料包過濾表中的規則變得容易,通常位於/sbin/iptables目錄下。

0.png

1.2 iptables的四表五鏈

netfilter/iptables後期簡稱為iptables。iptables是基於核心的防火牆,其中內建了raw、mangle、 nat和filter四個規則表。

表中所有規則配置後,立即生效,不需要重啟服務。

四表五鏈:

規則表的作用:容納各種規則鏈。

規則鏈的作用:容納各種防火牆規則。

即表裡有鏈,鏈裡有規則。

四表:

| 表名 | 作用 | | ------ | -------------------------------------------------------------------------------- | | raw | 確定是否對該資料包進行狀態跟蹤。包含兩個規則鏈,OUTPUT、PREROUTING | | mangle | 修改資料包內容,用來做流量整形,給資料包設定標記。包含五個規則鏈,INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING | | nat | 負責網路地址轉換,用來修改資料包中的源、目標IP地址或埠。包含三個規則鏈,OUTPUT、 PREROUTING、 POSTROUTING | | filter | 負責過濾資料包,確定是否放行該資料包(過濾)。包含三個規則鏈,INPUT、 FORWARD、 OUTPUT |

在iptables的四個規則表中, mangle表和raw表的應用相對較少。

filter表是防火牆的預設表。

五鏈:

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

1.3 資料包控制的匹配流程

1.3.1 規則表之間的優先順序:

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

1.png

1.3.2 規則鏈之間的匹配順序:

主機型防火牆:

  • 入站資料(來自外界的資料包,且目標地址是防火牆本機):PREROUTING --> INPUT -->本機的應用程式
  • 出站資料(從防火牆本機向外部地址傳送的資料包):本機的應用程式---->OUTPUT ----->POSTROUTING

網路型防火牆:

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

3.png

注:標紅的表示該鏈的規則通常在這個表上配置。

1.3.3 規則鏈內部的匹配順序:

  • 自上向下按順序依次進行檢查,找到相匹配的規則即停止(LOG策略例外,表示記錄相關日誌)
  • 若在該鏈內找不到相匹配的規則,則按該鏈的預設策略處理(未修改的狀況下,預設策略為允許)

#例1:  filter表 input鏈:  1、放通 目的地址為192.168.80.0/24的  2、放通 目的地址為192.168.100.0/24的  此時192.168.100.0/24的IP資料包能夠放行。  ​  #例2:  filter表 input鏈:  1、拒絕 源地址為100.100.100.0/24的  2、放通 目的地址為192.168.80.0/24的  3、放通 目的地址為192.168.100.0/24的  此時192.168.100.0/24的IP資料包會被拒絕,因為是自上向下按順序依次進行檢查,第一條規則已匹配到,就不會再向下匹配。

1.3.4 核心中資料包的傳輸過程

  1. 當一個數據包進入網絡卡時,資料包首先進入PREROUTING鏈,核心根據資料包目的IP判斷是否需要轉送出去。
  1. 如果資料包是進入本機的,資料包就會到達INPUT鏈。資料包到達INPUT鏈後, 任何程序都會收到它。本機上執行的程式可以傳送資料包,這些資料包經過OUTPUT鏈,然後返回給傳送方。
  1. 如果資料包是要轉發出去的,且核心允許轉發,資料包就會經過FORWARD鏈,然後到達POSTROUTING鏈輸出。

2 iptables的安裝和規則配置

2.1 iptables的安裝

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

#步驟1、關閉firewalld  [root@yuji ~]# systemctl disable --now firewalld   //設定firwalld開機不自啟,且現在就關閉  Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.  Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.  ​  #步驟2、安裝iptables 和 iptables-services  [root@yuji ~]# yum install -y iptables iptables-services  ​  #安裝完後啟動服務  [root@yuji ~]# systemctl start iptables

4-1.png

4-2.png

2.2 iptables的配置方法

  1. 使用iptables命令列。
  2. 使用圖形化管理工具system- config- firewall

2.3 使用iptables命令列配置規則

命令格式:

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

注意事項:

  • 不指定表名時,預設指filter表
  • 不指定鏈名時,預設指表內的所有鏈
  • 除非設定鏈的預設策略,否則必須指定匹配條件
  • 控制型別使用大寫字母,其餘均為小寫

微信圖片_20220422105948.png

常用控制型別:

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

常用管理選項:

| 管理選項 | 作用 | | -------------- | ----------------------------------------- | | -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.4 規則配置示例

示例1:檢視規則 -nL

[root@yuji ~]# iptables -L     //檢視filter表中所有規則  [root@yuji ~]# iptables -nL     //以數字形式顯示  ​  [root@yuji ~]# iptables -nL -t nat   //檢視nat表ACCEPT  [root@yuji ~]# iptables -nL --line-numbers   //顯示規則序號  ​  [root@yuji ~]#iptables -t filter -F //清空 filter表內所有規則

示例:

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

5-1.png

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

5-2.png

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

5-3.png

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

5-4.png

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

-A,在末尾追加規則。

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

#在INPUT鏈末尾追加規則  [root@yuji ~]# iptables -t filter -A INPUT -p icmp -j REJECT  [root@yuji ~]# iptables -nL  ​  #在INPUT鏈第二行出入規則  [root@yuji ~]# iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT  [root@yuji ~]# iptables -nL --line-numbers

示例:

1、拒絕icmp協議的資料包, 即不允許其他主機ping本機 。REJECT

5-5.png

使用其他的主機ping不通本機,reject拒絕後會迴應一條訊息。

5-6.png

2、丟棄icmp協議的資料包。DROP。

5-7.png

使用其他的主機ping本機,drop丟棄資料包,不給出任何迴應資訊。

5-8.png

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

iptables -nL --line-numbers,可以檢視每條規則的序號。

5-9.png

示例3:刪除規則 -D

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

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

注意:

  • 刪除規則前,先想清楚會不會導致ssh斷連。
  • 如果鏈的預設規則是DROP,在使用iptables -F之前一定要慎重,可能會導致自己斷連,斷連後只能去機房解決。

#先檢視鏈中的規則  [root@yuji ~]# iptables -nL --line-numbers   //顯示規則的序號  Chain INPUT (policy ACCEPT)  num target     prot opt source               destination  1   DROP       icmp --  0.0.0.0/0            0.0.0.0/0  2   DROP       icmp --  0.0.0.0/0            0.0.0.0/0  3   ACCEPT     tcp  --  0.0.0.0/0            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@yuji ~]# iptables -D INPUT 2 //刪除INPUT鏈中的第2條規則  [root@yuji ~]# iptables -nL --line-numbers  Chain INPUT (policy ACCEPT)  num target     prot opt source               destination  1   DROP       icmp --  0.0.0.0/0            0.0.0.0/0  2   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0  ​  Chain FORWARD (policy ACCEPT)  num target     prot opt source               destination  ​  Chain OUTPUT (policy ACCEPT)  ​  #按內容刪除  [root@yuji ~]# iptables -D INPUT -p tcp -j ACCEPT //刪除INPUT鏈中tcp協議ACCEPT的規則  [root@yuji ~]# iptables -nL --line-numbers  Chain INPUT (policy ACCEPT)  num target     prot opt source               destination  1   DROP       icmp --  0.0.0.0/0            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

5-10.png

5-11.png

示例4:修改規則

1、-R 直接修改。但一般不用這種形式。

2、可以先新增一條新規則,之後再刪除舊規則。這樣比較保險。

#方法1:使用-R直接修改  [root@yuji ~]# iptables -A INPUT -p icmp -j DROP //原先設定的規則  [root@yuji ~]# iptables -R INPUT -p icmp -j ACCEPT //將DROP修改成ACCEPT  ​  #方法2:先-A新增一條規則,之後再-D刪除舊規則  [root@yuji ~]# iptables -A INPUT -p icmp -j ACCEPT //新增一條新規則  [root@yuji ~]# iptables -D INPUT -p icmp -j DROP   //刪除舊規則

示例5:設定預設策略 -P

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

注意:

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

[root@yuji ~]# iptables -P INPUT DROP //將預設策略修改為DROP

5-12.png

3 匹配條件

3.1 通用匹配

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

| 協議匹配 | -p 協議名 | | ---- | ----------------------------------- | | 地址匹配 | -s 源地址、-d 目的地址 。可以是IP、網段、域名、空(任何地址) | | 介面匹配 | -i 入站網絡卡、-o 出站網絡卡 |

例:

iptables -A INPUT ! -p icmp -j ACCEPT  #沒有-t指定表,就是指預設表filter表  # !代表條件取反,不是icmp的都放通    iptables -A INPUT -s 192.168.72.10 -j REJECT  #拒絕從哪個主機發資料包過來(-s指定了源地址)    iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP  #在行首插入規則,丟棄該網段從ens33網絡卡進來的資料包

示例1:

! 取反時需要注意。

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

6-1.png

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

6-2.png

示例2:

拒絕192.168.72.10發來的資料包。

6-3.png

使用192.168.72.10這臺機器ping本機,ping不通。REJECT拒絕後,會顯示迴應資訊。

6-4.png

3.2 隱含匹配

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

3.2.1 埠匹配

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

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

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

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

6-5.png

3.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

3.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其他主機。

6-6.png

6-7.png

3.3 顯示匹配

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

3.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.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.3 MAC地址匹配

格式:

-m mac -- -mac- source MAC地址

示例:

iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP  #禁止來自某MAC地址的資料包通過本機轉發

3.3.4 狀態匹配

格式:

-m state --state連線狀態

常見的連線狀態:

| 狀態 | 含義 | | ----------- | -------------------------------------------- | | NEW | 主機連線目標主機,在目標主機上看到的第一個想要連線的包 | | ESTABLISHED | 主機已與目標主機進行通訊,判斷標準只要目標主機迴應了第一個包,就進入該狀態 | | RELATED | 主機已與目標主機進行通訊,目標主機發起新的連結方式,一般與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 出站網絡卡