1. 程式人生 > 其它 >iptables 防火牆

iptables 防火牆

iptables 防火牆

一: iptables 概述

1.1 iptables 的組成和工作位置

  1. 組成:它是linux系統的防火牆: iP資訊包過濾系統,它實際上由兩個元件 netfilter 和 iptables 組成

  2. 工作位置:主要工作在網路層,針對IP 資料包。體現在對包內ip地址,埠資訊,協議等處理

1.2 netfiler 和 iptables 的關係

  1. netfilter:

    • 屬於“核心態”的防火牆功能體系。

    • 是核心的一部分,由一些資料包過濾表組成,這些表包含核心用來控制資料包過濾處理的規則集

  2. iptables:

    • 屬於“使用者態” 的防火牆管理體系

    • 是一種用來管理Linux防火牆的命令程式,它使插入,修改,和刪除資料包過濾表中的規則變得容易,通常位於 /usr/sbin/iptables 檔案

    netfilter/iptables 後期簡稱為 iptables 。 iptables 是基於核心的防火牆,其中內建了四個規則表。表中所有的規則配置後,立即生效,不需要重啟服務

1.3 四表五鏈

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

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

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

1.3.1 四表

raw表∶ 確定是否對該資料包進行狀態跟蹤。包含兩個規則鏈, OUTPUT、PREROUTING。

mangle表∶修改資料包內容,用來做流量整形的,給資料包設定標記。包含五個規則鏈,INPUT、oUTPUT、FORWARD、PRERoUTTNG、PosTRou TING。

nat表∶ 負責網路地址轉換,用來修改資料包中的源、目標IP地址或埠。包含三個規則鏈, oUTPUT、PRERoUTING、PoSTRoUTING。

filter表:負責過濾資料包, 確定是否放行該資料包(過濾)。 包含三個規則鋅鏈,INPUT、FORWARD、OUTPUT。

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

1.3.2 五鏈

  • INPUT:處理入站資料包,匹配目標IP為本機的資料包。

  • OUTPUT:處理出站資料包,一般不在此鏈上做配置。

  • FORWARD:處理轉發資料包,匹配流經本機的資料包。

  • PREROUTING鏈:在進行路由選擇前處理資料包,用來修改目的地址,用來做DNAT。相當於把內網伺服器的工P和埠對映到路由器的外網IP和埠上

  • POSTROUTING鏈:在進行路由選擇後處理資料包,用來修改源地址,用來做SNAT。相當於內網通過路由器NAT轉換功能實現內網主機通過一個公網IP地址上網。

1.3.3 規則表的匹配順序

raw → mangle → nat → filter

1.3.4 規則鏈之間的匹配順序

  1. 主機型防火牆

    • 入站資料(來自外界的資料包,且目標地址是防火牆本機)

      • PREROUTING --> INPUT --> 本機的應用程式

    • 出站資料(從防火牆本機向外部地址傳送的資料包)

      • 本機的應用程式 --> OUTPUT --> POSTROUTING

  2. 網路型防火牆

    • 轉發資料(需要經過防火牆轉發的資料包)

      • PREROUTING --> FORWARD --> POSTROUTING

  1. 規則鏈內的匹配順序

    • 自上向下按順序依次進行檢查,找到相匹配的規則即停止(LOG策略例外,表示記錄相關日誌)

    • 若在該鏈內找不到相匹配的規則,則按該鏈的預設策略處理(未修改的狀況下,預設策略為允許)

二: 編寫防火牆規則

2.1 安裝iptables防火牆

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

#關閉防火firewalld 防火牆,並取消開機自啟
systemctl stop firewalld
systemctl disable firewalld

#下載iptables 防火牆,並啟動
yum -y install iptables iptables-services
systemctl start iptables

2.2 iptables 的配置方法

2.2.1 命令列配置格式

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

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

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

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

  • 選項、鏈名、控制型別使用大寫字母,其餘均為小寫

2.2.2 常用控制型別

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

2.2.3 常用管理選項

  • -A ∶ 在指定鏈的末尾追加 (–append)一條新的規則

  • -I ∶ 在指定鏈的開頭插入(–insert)一條新的規則, 未指定序號時預設作為第一條規則

  • -R ∶ 修改、替換(–replace)指定鏈中的某一條規則,可指定規則序號或具體內容

  • -P ∶設定指定鏈的預設策略(–policy)

  • -D ∶ 刪除 (–delete)指定鏈中的某一條規則, 可指定規則序號或具體內容

  • -F ∶ 清空(–flush)指定鏈中的所有規則,若未指定鏈名,則清空表中的所有鏈

  • -L∶列出 (–list)指定鏈中所有的規則,若未指定鏈名,則列出表中的所有鏈

  • -n ∶ 使用數字形式(–numeric)顯示輸出結果,如顯示 IP 地址而不是主機名

  • -v ∶ 顯示詳細資訊,包括每條規則的匹配包數量和匹配位元組數

  • --line-numbers∶ 檢視規則時,顯示規則的序號

2.2.4匹配條件

  • -p :指定要匹配的資料包協議型別

  • -s :指定要匹配的資料包源 IP 地址

  • -d : 指定要匹配的資料包的目的 IP 地址

  • -i :指定資料包進入本機的網路介面

  • -o :指定資料包離開本機的網路介面

  • --sport :指定源埠號

  • --dport :指定目的埠號

2.2.5 新增,檢視,刪除規則

  1. 新增新規則

iptables -t filter -A INPUT -p icmp -j REJECT 禁止ping通本主機(有響應)
iptables -t filter -A INPUT -p icmp -j DROP 禁止ping通本主機(無響應)
iptables -I INPUT 2 -p tcp--dport 22 -jACCEPT
  1. 檢視規則表

iptables [-t 表名 ]-n -L[ 鏈名][--line-numbers]

iptables -[vn]L #注意∶不可以合寫為 -Ln
iptables -n -L --line-numbers
  1. 設定預設策略

iptlables [-t 表名 ] -P <鏈名><控制型別>
iptables -P INPUT DROp iptables -P FORWARD DROp
  1. 刪除規則

iptables -D INPUT 2
iptables -t filter -D INPUT -p icmp -jREJECT

注意∶

若規則列表中有多條相同的規則時, 按內容匹配只刪除的序號最小的一條

按號碼匹配刪除時, 確保規則號碼小於等於已有規則數,否則報錯

按內容匹配刪數時, 確保規則存在, 否則報錯

  1. 清空規則

iptables [-t 表名] -F [鏈名]
iptables -F INPUT
iptables -F

注意:

-F 僅僅是清空鏈中的規則,並不影響 -P 設定的預設規則,預設規則需要手動進行修改

-P 設定了DROP後,使用-F 一定要小心

防止把允許遠端連線的相關規則清除後導致無法遠端連線主機,此情況如果沒有儲存規則可重啟主機解決

如果不寫表名和鏈名,預設清空filter表中所有鏈裡的所有規

2.3 規則的匹配

2.3.1 通用匹配

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

協議匹配∶ -p 協議名(如tcp,udp,ip,icmp等)

地址匹配∶ -s 源地址、-d 目的地址 #可以是IP、網段、域名、空(任何地址)

介面匹配∶ -i 入站網絡卡(如ens33,ens36等網絡卡)、 -o 出站網絡卡

#設定FORWARD 鏈規則,除了 icmp 協議資料包,其他都允許通過
iptables -A FORWARD ! -p icmp -j ACCEPT

#設定INPUT鏈規則,源ip 是192.168.23.103 的資料包,丟棄
iptables -A INPUT -s 192.168.23.103 -j DROP

#設定INPUT 鏈規則,從網絡卡 ens33進入,且源 ip 是192.168.23.0 網段的資料包丟棄
iptables -I INPUT -i ens33 -s 192.168.23.0/24 -j DROP

2.3.2 隱含匹配

要求以特定的協議匹配作為前提,包括埠,TCP標記,ICMP標記

  • 埠匹配

    --sport 源埠、

    --dport 目的埠

    #可以是個別埠、埠範圍

    --sport 1000 匹配源埠是1000的資料包 --sport 1000:3000 匹配源埠是1000-3000的資料包 --sport :3000 匹配源埠是3000及以下的資料包 --sport 1000: 匹配源埠是1000及以上的資料包 注意:--sport 和 --dport 必須配合 -p <協議型別> 使用

# 在 INPUT 鏈末尾追加規則, tcp協議,且目標埠是20到21 埠的資料包,允許通過
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT

#在FORWARD 鏈 開頭插入規則, 目標ip 是192.168.23.0/24 網段,協議是tcp協議,且目標埠是24500到24600的資料包,丟棄
iptables -I FORWARD -d 192.168.23.0/24 -p tcp --dport 24500:24600 -j DROP

  • TCP標記匹配

--tcp-flags TCP標記( URG,ACK,PSH,RST,SYN,FIN)

iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -jACCEPT
#丟棄SYN請求包,放行其他包

  • ICMP型別匹配

    ICMP型別匹配:--icmp-type ICMP型別 #可以是字串、數字程式碼、、目標不可達

    • “Echo-Request”(程式碼為 8)表示 請求

    • “Echo-Reply”(程式碼為 0)表示 回顯

    • “Destination-Unreachable”(程式碼為 3)表示 目標不可達

    • 關於其它可用的 ICMP 協議型別,可以執行“iptables -p icmp -h”命令,檢視幫助資訊

iptables -A INPUT -p icmp --icmp-type 8 -j DROP   #禁止其它主機ping 本機
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #允許本機ping 其它主機

iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #當本機ping 不通其它主機時提示目標不可達
#此時其它主機需要配置關於icmp協議的控制型別為 REJECT
iptables -A INPUT -p icmp -j REJECT

2.3.3 顯示匹配

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

  • 多埠匹配

-m multiport --sport 源埠列表

-m multiport --dport 目的埠列表

iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
#INPUT 鏈允許 tcp 協議 目標埠 80,22,21,20,52 的資料包通過

iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
#INPUT 鏈 允許 udp 協議,目標埠是 53 的資料包通過

  • IP範圍匹配

    -m iprange --src-range IP範圍

iptables -A FORWARD -p udp -m iprange --src-range 192.168.23.100-192.168.80.23 -j DROP      
#禁止轉發源地址位於192.168.23.100-192.168.23.200的udp資料包

  • 狀態匹配

    -m state --state 連線狀態

    常見的連線狀態:

    • NEW :與任何連線無關的,還沒開始連線

    • ESTABLISHED :響應請求或者已建立連線的,連線態

    • RELATED :與已有連線有相關性的(如FTP 主被動模式的資料連線),衍生態,一般與ESTABLISHED 配合使用

    • INVALID :不能被識別屬於哪個連線或沒有任何狀態

iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
#禁止轉發與正常 TCP 連線無關的非--syn 請求資料包(如偽造的網路攻擊資料包)

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

三 SNAT 和 DNAT

3.1 SNAT 原理與應用

3.1.1 應用

  • 區域網主機共享單個公網IP地址接入Internet(私有IP不能在Internet中正常路由)

3.1.2SNAT原理

  • 修改資料包的源地址

3.1.3 SNAT轉換前提條件

  1. 區域網各主機已正確設定IP地址、子網掩碼、預設閘道器地址

  2. Linux閘道器開啟IP路由轉發

臨時開啟:
echo 1 > /proc/sys/net/ipv4/ip_forward

sysctl -w net.ipv4.ip_forward=1

永久開啟:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #將此行寫入配置檔案

sysctl -p #讀取修改後的配置

3.1.4 SNAT 轉換

#SNAT轉換 1:固定的公網IP地址:
iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -o ens33 -j SNAT --to 12.0.0.1

iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -o ens33 -j SNAT --to-source 12.0.0.1-12.0.0.10
#192.168.23.0/24 內網ip
#-o 指定網網絡卡
# ens33 外網網絡卡


#SNAT轉換2:非固定的公網IP地址(共享動態IP地址):
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j MASQUERADE

3.2 DNAT 原理與應用

3.2.1 DNAT 應用環境

在Internet中釋出位於區域網內的伺服器

3.2.2 DNAT原理

修改資料包的目的地址。

3.2.3 DNAT轉換前提條件

  • 區域網的伺服器能夠訪問Internet

  • 閘道器的外網地址有正確的DNS解析記錄

  • Linux閘道器開啟IP路由轉發

3.2.4 DNAT 轉換

釋出內網的Web服務
#把從ens33進來的要訪問web服務的資料包目的地址轉換為 192.168.23.11
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.80.11

iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11

iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.80.11-192.168.80.20
# -i 指定入站網絡卡
# ens33 外網網絡卡
# 12.0.0.1 外網ip



2、釋出時修改目標埠
#釋出區域網內部的OpenSSH伺服器,外網主機需使用250埠進行連線
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.80.11:22

#在外網環境中使用SSH測試
ssh -p 250 [email protected]

yum -y install net-tools #若沒有 ifconfig 命令可提前使用 yum 進行安裝
ifconfig ens33

四: 防火牆規則備份和還原

iptables 規則檔案儲存在/etc/sysconfig/iptables中,iptables 啟動時,會自動還原規則

iptables-save > /etc/sysconfig/iptables

#停止iptables服務,會清空所有表的規則
systemctl stop iptables

#啟動iptables 服務會自動還原 /etc/sysconfig/iptables
systemctl start iptables

4.1 匯出(備份)所有表的規則

iptables-save  > /opt/ipt.txt 
#將規則匯出到檔案 ipt.txt中

4.2 匯入(還原)規則

iptables-restore  </opt/ipt.txt

五: 抓包命令 tcpdump

tcpdump  tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.23.0/24 -w ./target.cap

#tcp: 協議型別,放在第一個引數,用來過濾資料型別。如 ip,icmp,arp,rarp,tcp,udp 等
# -i ens33 : 只抓取經過介面 ens33 的包
# -t : 不顯示時間戳
# -s 0 : 抓取資料包時預設抓取長度為 68 位元組。加上 -s 0 後嗎,可以抓到完整的資料包
# -c 100 : 只抓取 100 個包
# dst port ! 22 : 不抓取目標埠是 22 的包
#src net 192.168.23.0/24 :資料包的源ip為 192.168.23.0/24 網段
#-w ./target.cap :儲存成 cap 檔案,可以拷貝到windows使用 (wireshark )分析