iptables 防火墻(一)
- 一、Linux 防火墻基礎
- 防火墻分類
- 二、iptables 的表、鏈結構
- 規則表
- 規則鏈
- 數據包過濾的匹配流程
- 三、編寫防火墻規則
- iptables 的安裝
- iptables的基本語法
- 規則的匹配條件
- 通用匹配
- 隱含匹配
- 顯式匹配
- 四、總結
在網絡安全的世界里,防火墻無疑是我們抵御外部威脅的第一道防線。而iptables,作為Linux系統上最強大的防火墻工具之一,為我們提供了細致控制網絡流量的能力。本系列博客將帶您逐步了解并掌握iptables的基礎知識與配置方法。
一、Linux 防火墻基礎
防火墻的定義
- 防火墻是一種由硬件和軟件組合而成,在內部網和外部網之間、專有網和公共網之間構造的保護屏障,用已保護用戶資料和信息安全的一種技術
防火墻的作用
- 主要在于及時發現并處理計算機網絡運行時可能存在的安全風險、數據傳輸等問題,從而實現對計算機不安全網絡因素的阻斷。確保網絡正常運行,保障信息安全,為用戶提供良好的網絡體驗
防火墻分類
- 邏輯上分:主機防火墻和網絡防火墻
- 主機型防火墻:針對單個主機進行防護
- 網絡型防火墻:針對網絡進行保護,保護內部的局域網
- 物理上分:硬件防火墻和軟件防火墻
- 硬件防火墻:在硬件上實現防火墻功能,性能高,成本高。
- 軟件防火墻:依靠軟件來實現防火墻功能,性能低,成本低
Linux包過濾防火墻概述
- Linux防火墻是一種功能強大的信息包過濾系統
netfilter
- 是Linux內核中的一種包過濾功能體系
- 稱為Linux防火墻的 “內核態”
iptables
- 位于 /sbin/iptables,是防火墻規則的管理工具
- 稱為Linux防火墻的 ”用戶態“
——上述2種稱呼都可以表示Linux防火墻
包過濾的工作層次
- 主要是網絡層,針對IP數據包
- 體現在對數據包內的IP地址、端口等信息的處理上
二、iptables 的表、鏈結構
規則表
- 表的作用:容納各種規則鏈
- 表的劃分依據:防火墻規則的作用相似
默認包括4個規則表
- raw表:是否對數據包進行狀態跟蹤
- mangle表:是否為數據包設置標記
- nat表:是否修改數據包中的源、目標IP地址或端口
- filter表:是否放行該數據包(過濾)
規則鏈
- 規則的作用:對數據包進行過濾或處理
- 鏈的作用:容納各種防火墻規則
- 鏈的分類依據:處理數據包的不同時機
默認包括5種規則鏈
- INPUT:處理入站數據包
- OUTPUT:處理出站時間包
- FORWARD:處理轉發數據包
- POSTROUTING:在進行路由選擇后處理數據包
- PREROUTING:在進行路由選擇前處理數據包
數據包過濾的匹配流程
- 規則表之間的順序
- raw→mangle→nat→filter
- 規則鏈之間的順序
- 入站:PREROUTING→INPUT
- 出站:OUTPUT→POSTROUTING
- 轉發:PREROUTING→FORWARD→POSTROUTING
- 規則鏈內的匹配順序
- 按順序依次檢查,匹配即停止(LOG策略例外)
- 若找不到相匹配的規則,則按該鏈的默認策略處理
三、編寫防火墻規則
iptables 的安裝
- CentOS 7.3 默認使用 firewalld 防火墻,如果想使用 iptables 防火墻,必須先關閉firewalld 防火墻
# 關閉 firewalld 防火墻
[root@localhost ~]# systemctl stop firewalld
# 關閉自啟動
[root@localhost ~]# systemctl disable firewalld
- Firewalld 防火墻關閉之后,可以通過 yum 方式再安裝 iptables,因為默認 CentOS7.3系統中并沒有安裝 iptables
# 安裝 iptables
[root@localhost ~]# yum -y install iptables iptables-services
# 啟動 iptables
[root@localhost ~]# systemctl start iptables
# 設置開機自啟動
[root@localhost ~]# systemctl enable iptables
iptables的基本語法
數據包的常見控制類型
- ACCEPT:允許通過
- DROP:直接丟棄,不給出任何回應
- REJECT:拒絕通過,必要時會給出提示
- LOG:記錄日志信息,然后傳給下一條規則繼續匹配
添加、查看、刪除規則等基本操作
選項名 | 功能及特點 |
---|---|
-A | 在指定鏈的末尾添加(--append)一條新的規則 |
-D | 刪除(--delete)指定鏈中的某一條規則,可指定規則序號或具體內容 |
-I | 在指定鏈中插入(--insert)一條新的規則,未指定序號時默認作為第一條規則 |
-R | 修改、替換(--replace)指定鏈中的某一條規則,可指定規則序號或具體內容 |
-L | 列出(--list)指定鏈中所有的規則,若未指定鏈名,則列出表中的所有鏈 |
-F | 清空(--flush)指定鏈中的所有規則,若未指定鏈名,則清空表中的所有鏈 |
-P | 設置指定鏈的默認策略(--policy) |
-n | 使用數字形式(--numeric)顯示輸出結果,如顯示 IP 地址而不是主機名 |
-v | 查看規則列表時顯示詳細(--verbose)的信息 |
-h | 查看命令幫助信息(--help) |
--line-numbers | 查看規則列表時,同時顯示規則在鏈中的順序號 |
-t | 指定要操作的表 |
-i | 入站網卡 |
-o | 出戰網卡 |
-d | 目的地址 |
-p | 協議名 |
-s | 源地址 |
-X | 刪除指定表中用戶自定義的規則鏈 |
-N | 新建一條用戶自己定義的規則鏈 |
-Z | 將所有表的所有鏈的字節和數據包計數器清零 |
-j | 指定目標動作或跳轉 |
! | 條件取反 |
添加新的規則
- 添加新的防火墻規則時,使用管理選項“-A”、“-I”,前者用來追加規則,后者用來插入規則。
- 例如,若要在 filter 表 INPUT 鏈的末尾添加一條防火墻規則,可以執行以下操作(其中“-p 協議名”作為匹配條件)
[root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
- 當使用管理選項“-I”時,允許同時指定新添加規則的順序號,未指定序號時默認作為第一條。
- 例如,以下操作添加的兩條規則將分別位于 filter 表的第一條、第二條(其中省略了“-t filter”選項,默認使用 filter 表)。
[root@localhost ~]# iptables -I INPUT -p udp -j ACCEPT
[root@localhost ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
查看規則列表
- 查看已有的防火墻規則時,使用管理選項“-L”,結合“–line-numbers”選項還可顯示各條規則在鏈內的順序號。
- 例如,若要查看 filter 表 INPUT 鏈中的所有規則,并顯示規則序號, 可以執行以下操作。
[root@bogon ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP udp -- bogon anywhere
2 ACCEPT tcp -- anywhere anywhere
3 ACCEPT all -- bogon anywhere
4 ACCEPT all -- bogon/24 anywhere
- 當防火墻規則的數量較多時,若能夠以數字形式顯示地址和端口信息,可以減少地址解析的環節,在一定程度上加快命令執行的速度。
- 例如,若要以數字地址形式查看 filter 表INPUT 鏈中的所有規則,可以執行以下操作。
[root@bogon ~]# iptables -n -L INPUT # "-n -L"可合寫為"-nL"
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP udp -- 192.168.72.1 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 192.168.72.1 0.0.0.0/0
ACCEPT all -- 192.168.72.0/24 0.0.0.0/0
刪除、清空規則
- 刪除一條防火墻規則時,使用管理選項“-D”。
- 例如,若要刪除 filter 表 INPUT 鏈中的第三條規則,可以執行以下操作。
[root@bogon ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP udp -- 192.168.72.1 0.0.0.0/0
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 192.168.72.1 0.0.0.0/0
4 ACCEPT all -- 192.168.72.0/24 0.0.0.0/0 [root@bogon ~]# iptables -D INPUT 3
[root@bogon ~]# iptables -nL --line-numbers # 確認刪除效果
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP udp -- 192.168.72.1 0.0.0.0/0
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 192.168.72.0/24 0.0.0.0/0
- 清空指定鏈或表中的所有防火墻規則,使用管理選項“-F”。
- 例如,若要清空 filter 表INPUT鏈中的所有規則,可以執行以下操作。
[root@bogon ~]# iptables -F INPUT
[root@bogon ~]# iptables -nL --line-numbers # 確認刪除效果
Chain INPUT (policy ACCEPT)
num target prot opt source destination
- 使用管理選項“-F”時,允許省略鏈名而清空指定表所有鏈的規則。
- 例如,執行以下操作分別用來清空 filter 表、nat 表、mangle 表。
[root@bogon ~]# iptables -F
[root@bogon ~]# iptables -t nat -F
[root@bogon ~]# iptables -t mangle -F
設置默認策略
- iptables 的各條鏈中,默認策略是規則匹配的最后一個環節——當找不到任何一條能夠匹配數據包的規則時,則執行默認策略。默認策略的控制類型為 ACCEPT(允許)、DROP(丟棄)兩種。
- 例如,執行以下操作可以將 filter 表中 FORWARD 鏈的默認策略設為丟棄,OUTPUT 鏈的默認策略設為允許。
[root@bogon ~]# iptables -t filter -P FORWARD DROP
[root@bogon ~]# iptables -P OUTPUT ACCEPT
- 需要注意的是,當使用管理選項“-F”清空鏈時,默認策略不受影響。
- 因此若要修改默認策略,必須通過管理選項“-P”重新進行設置。
- 另外,默認策略并不參與鏈內規則的順序編排, 因此在其他規則之前或之后設置并無區別。
規則的匹配條件
常用的隱含匹配條件
- 端口匹配:–sport源端口、–dport目的端口
- ICMP類型匹配:–icmp-type ICMP類型
常用的顯式匹配條件
- 多端口匹配:-m multiport --sports 源端口列表
-m multiport --dports 目的端口列表 - IP范圍匹配:-m iprange --src-range IP范圍
- MAC地址匹配:-m mac --mac-source MAC地址
- 狀態匹配:-m state --state 連接狀態
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange -src-range 192.168.4.21-192.168.4.28-ACCEPT
[root@localhost ~]#iptables -A INPUT -m mac -mac-source 00:0c:29:c0:55:3f -j DROP
通用匹配
(1) 協議匹配
- 編寫 iptables 規則時使用“-p 協議名”的形式指定,用來檢查數據包所使用的網絡協議(–protocol)
# 丟棄通過 icmp 協議訪問防火墻本機的數據包,允許轉發經過防火墻的除 icmp 協議之外的數據包
[root@localhost ~]# iptables -I INPUT -p icmp -j DROP
[root@localhost ~]# iptables -A FORWARD ! -p icmp -j ACCEPT #感嘆號”!”表示取反
(2) 地址匹配
- 編寫 iptables 規則時使用“-s 源地址”或“-d 目標地址”的形式指定,用來檢查數據包的源地址(–source)或目標地址(–destination)
# 拒絕轉發源地址為192.168.1.11 的數據,允許轉發源地址位于 192.168.7.0/24 網段的數據
[root@localhost ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
[root@localhost ~]# iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
# 檢測到來自某個網段(如 10.20.30.0/24)的頻繁掃描、登錄窮舉等不良企圖,可立即添加防火墻規則進行封鎖
[root@localhost ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP
[root@localhost ~]# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
(3) 網絡接口匹配
- 編寫 iptables 規則時使用“-i 接口名”和“-o 接口名”的形式,用于檢查數據包從防火墻的哪一個接口進入或發出,分別對應入站網卡(–in-interface)、出站網卡(–out-interface)
# 丟棄從外網接口(ens33)訪問防火墻本機且源地址為私有地址的數據包
[root@localhost ~]# iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP
[root@localhost ~]# iptables -A INPUT -i ens33 -s 172.16.0.0/16 -j DROP
[root@localhost ~]# iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP
隱含匹配
(1) 端口匹配
- 編寫 iptables 規則時使用“–sport 源端口”或“–dport 目標端口”的形式,針對的協議為TCP 或 UDP,用來檢查數據包的源端口(–source-port)或目標端口(–destination-port)。
- 單個端口號或者以冒號“:”分隔的端口范圍都是可以接受的,但不連續的多個端口不能采用這種方式
# 允許為網段 192.168.4.0/24 轉發 DNS 查詢數據包
[root@localhost ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -d 192.168.4.0/24 -p udp --sport 53 -j ACCEPT
# 開放 20、21 端口,以及用于被動模式的端口范圍為 24500~24600
[root@localhost ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
(2) ICMP 類型匹配
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp -j DROP# 可用的 ICMP 協議類型
iptables -p icmp -h
顯式匹配
(1) 多端口匹配
# 允許本機開放 25、80、110、143 端口,以便提供電子郵件服務
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
(2) IP 范圍匹配
# 禁止轉發源 IP 地址位于 192.168.4.21 與 192.168.4.28 之間的 TCP
數據包
[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j DROP
(3) MAC 地址匹配
# 根據 MAC 地址封鎖主機,禁止其訪問本機的任何應用
[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
(4) 狀態匹配
# 禁止轉發與正常 TCP 連接無關的非--syn 請求數據包(如偽造的網絡攻擊數據包)
[root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP# 只開放本機的 Web 服務(80 端口),但對發給本機的 TCP 應答數據包予以放行,其他入站數據包均丟棄
[root@localhost ~]# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
四、總結
iptables是一個功能強大的防火墻工具,通過合理的配置可以為我們提供強大的網絡安全保障。但請注意,iptables的配置相對復雜,需要具備一定的網絡基礎和Linux系統管理經驗。在配置iptables時,請務必謹慎操作,避免誤操作導致網絡故障。