目錄
引言
一、iptables防火墻
1、簡述
2、防火墻組成
3、iptables的表和鏈接結構
四表五鏈
四表(raw、mangle、nat、filter)
五鏈
4、資料包和規則鏈的匹配流程
資料包過濾的匹配流程
規則鏈之間的匹配順序
資料包在規則表、鏈間的匹配流程
二、撰寫防火墻規則
1、iptabes 安裝
2、基本語法、資料包控制型別
基本語法
資料包的常見控制型別
3、常用管理選項
4、匹配條件
5、添加新的規則
6、查看規則串列
7、洗掉、清空、更改規則
8、規則的匹配條件
通用匹配
隱含匹配
顯式匹配
狀態匹配
引言
今天突然想問大家一個問題,什么是防火墻?很多小伙伴可能會告訴我,防火墻是計算機內外網路中一道相對隔絕的保護屏障,用來保護資訊安全的技術,那這個名詞是怎么由來的呢?有個很有意思的解說,就是防火墻就是森林中防火的一道墻,還有汽車中引擎和人之間防火的一道墻,其實在我來看,本質就是用來隔絕我們不需要或者危險的一道墻
一、iptables防火墻
1、簡述
Linux 的防火墻體系在TCP/IP網路模型中,傳輸層、網路層和應用層都有涉及,但是主要作業在網路層,針對 TCP/IP 資料包實施過濾和限制,屬于典型的包過濾防火墻,Linux 系統的防火墻體系基于內核編碼實作, 具有非常穩定的性能和高效率,也因此獲得廣泛的應用,
2、防火墻組成
Linux中:IP 資訊包過濾系統,它實際上由兩個組件 netfilter 和 iptables組成
netfilter:屬于“內核態”又稱內核空間的防火墻功能體系,是內核的一部分,由一些資訊包過濾表組成,這些表包含內核用來控制資訊包過濾處理的規則集
iptables : 屬于“用戶態” 的防火墻管理體系,用來管理命令程式,它使插入、修改和洗掉資料包過濾表中的規則變得容易,通常位于/sbin/iptables目錄下
3、iptables的表和鏈接結構

四表五鏈
規則表的作用:容納各種規則鏈(表的劃分依據:防火墻規則的作用相似)
規則鏈的作用:容納各種防火墻規則(規則的作用:對資料包進行過濾或處理 )(鏈的分類依據:處理資料包的不同時機)
總結:表里有鏈,鏈里有規則
四表(raw、mangle、nat、filter)
raw:主要用來決定是否對資料包進行狀態跟蹤 包含兩個規則鏈,OUTPUT、PREROUTING
mangle : 修改資料包內容,用來做流量整形的,給資料包設定標記,包含五個規則鏈,INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING
nat:負責網路地址轉換,用來修改資料包中的源、目標IP地址或埠,包含三個規則鏈,OUTPUT、PREROUTING、POSTROUTING
filter:負責過濾資料包,確定是否放行該資料包(過濾),包含三個鏈,即PREROUTING、POSTROUTING、OUTPUT
在iptables 的四個規則表中,mangle 表 和raw表的應用相對較少
五鏈
INPUT: 處理入站資料包,匹配目標IP為本機的資料包
OUTPUT: 處理出站資料包,一般不在此鏈上做配置
FORWARD: 處理轉發資料包,匹配流經本機的資料包
PREROUTING鏈: 在進行路由選擇前處理資料包,用來修改目的地址,用來做DNAT,相當于把內網服務器的IP和埠映射到路由器的外網IP和埠上
POSTROUTING鏈: 在進行路由選擇后處理資料包,用來修改源地址,用來做SNAT,相當于內網通過路由器NAT轉換功能實作內網主機通過一個公網IP地址上網
4、資料包和規則鏈的匹配流程
資料包過濾的匹配流程
raw——mangle——nat——filter
規則鏈之間的匹配順序
主機型防火墻
資料包直接進入到防火墻所在的服務器的內部某一個應用程式當中
入站資料(來自外界的資料包,且目標地址是防火墻本機)
PREROUTING ——> INPUT ——> 本機的應用程式
出站資料(從防火墻本機向外部地址發送的資料包)
本機的應用程式——>OUTPUT——>POSTROUTING
網路型防火墻
轉發資料(需要經過防火墻轉發的資料包)
PREROUTING——> FORWARD——> POSTROUTING
規則鏈內的匹配順序
自上向下按順序依次進行檢查,找到相匹配的規則即停止(LOG策略例外,表示記錄相關日志)要么放行,要么丟棄
若在該鏈內找不到相匹配的規則,則按該鏈的默認策略處理(未修改的狀況下,默認策略為允許)
注:按第一條規則……第二條規則的順序進行匹配處理,遵循“匹配即停止”的原則,一旦找到一條匹配規則將不再檢查后續的其他規則,如果一直找不到匹配的規則,就按默認規則處理
默認規則用iptables -L查看,規則鏈后面出現(policy ACCEPT)即是默認放行
默認策略不參與鏈內規則的順序編排
-F清空鏈時,默認策略不受影響
資料包在規則表、鏈間的匹配流程

入站資料流向
來自外界的資料包到達防火墻后,首先被 PREROUTING 鏈處理(是否修改資料包地址等),然后進行路由選擇(判斷該資料包應發往何處,如果資料包的目標地址是防火墻本機(如 Internet 用戶訪問網關的 Web 服務埠),那么內核將其傳 遞給 INPUT 鏈進行處理(決定是否允許通過等),通過以后再交給系統上層的應用程式 ,如 httpd 服務器)進行回應
轉發資料流向
來自外界的資料包到達防火墻后,首先被 PREROUTING 鏈處理,然后再進行路由選擇;如果資料包的目標地址是其他外部地址(如局域網用戶通過網關訪問 QQ 服務器),則內核將其傳遞給 FORWARD 鏈進行處理(允許轉發或攔截、丟棄),最后交給 POSTROUTING 鏈(是否修改資料包的地址等)進行處理,
出站資料流向
防火墻本機向外部地址發送的資料包(如在防火墻主機中測驗公網 DNS 服務時),首先進行路由選擇,確定了輸出路徑后,再經由 OUTPUT 鏈處理,最后再交 POSTROUTING 鏈(是否修改資料包的地址等)進行處理
流程:入站——PREROUTING——INPUT——應用程式——OUTPUT——POSTROUTING
二、撰寫防火墻規則
1、iptabes 安裝
CentOS7默認使用firewalld防火墻,沒有安裝iptables,若想使用iptables防火墻,必須先關閉firewalld防火墻,再安裝iptables
關閉firewalld防火墻
systemctl stop firewalld.service
systemctl disable firewalld.service
安裝iptables 防火墻
yum -y install iptables iptables-services
設定iptables開機啟動
systemctl start iptables.service
systemctl enable iptables.service
2、基本語法、資料包控制型別
基本語法
iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制型別]
表名、鏈名用來指定 iptables 命令所操作的表和鏈,未指定表名時將默認使用 filter 表
管理選項:表示iptables規則的操作方式,如插入、增加、洗掉、查看等
匹配條件:用來指定要處理的資料包的特征,不符合指定條件的資料包將不會處理
控制型別指的是資料包的處理方式,如允許、拒絕、丟棄等

注意事項:
不指定表名時,默認指filter表
不指定鏈名時,默認指表內的所有鏈
除非設定鏈的默認策略,否則必須指定匹配條件
選項、鏈名、控制型別使用大寫字母,其余均為小寫
資料包的常見控制型別
對于防火墻,資料包的控制型別非常關鍵,直接關系到資料包的放行、封堵及做相應的日志記錄等
防火墻規則的“匹配即停止”對于 LOG 操作來說是一個特例,因為 LOG 只是一種輔助動作,并沒有真正處理資料包
| 控制型別 | 作用 |
| ACCEPT | 允許資料包通過 |
| DROP | 直接丟棄資料包,不給出任何回 應資訊 |
| REJECT | 拒絕資料包通過,必要時會給資料發送端一個回應資訊 |
| LOG | 在/var/log/messages 檔案中記錄日志資訊,然后將資料包傳遞給下一條規則 |
| SNAT | 修改資料包的源地址 |
| DNAT | 修改資料包的目的地址 |
| MASQUERADE | 偽裝成一個非固定公網IP地址 |
3、常用管理選項
| 管理選項 | 用法示例 |
| -A | 在指定鏈末尾追加一條規則 iptables -A INPUT (操作) |
| -I | 在指定鏈中插入一條新的,未指定序號默認作為第一條 iptables -I INPUT (操作) |
| -P | 指定默認規則 iptables -P OUTPUT ACCEPT (操作) |
| -R | 修改、替換某一條規則 iptables -t nat -R INPUT (操作) |
| -L | 查看 iptables -t nat -L (查看) |
| -n | 所有欄位以數字形式顯示(比如任意ip地址是0.0.0.0而不是anywhere,比如顯示協議埠號而不是服務名) iptables -L -n,iptables -nL,iptables -vnL (查看) |
| -v | 查看時顯示更詳細資訊,常跟-L一起使用 (查看) |
| --line-number | 規則帶編號 iptables -t nat -L -n --line-number /iptables -t nat -L --line-number |
| -F | 清除鏈中所有規則 iptables -F (操作) |
| -X | 清空自定義鏈的規則,不影響其他鏈 iptables -X |
| -Z | 清空鏈的計數器(匹配到的資料包的大小和總和) iptables -Z |
| -S | 查看鏈的所有規則或者某個鏈的規則/某個具體規則后面跟編號 iptables -t nat -S、iptables -t nat -S POSTROUTING 1 |
| -D | 洗掉 iptables -t nat -D INPUT (操作) |
4、匹配條件
| 匹配條件 | 說明 |
| -p | 指定要匹配的資料包的協議型別 |
| -s | 指定要匹配的資料包的源IP地址 |
| -d | 指定要匹配的資料包的目的IP地址 |
| -I | 指定資料包進入本機的網路介面 |
| -o | 指定資料包離開本機做使用的網路介面 |
| –sport | 指定源埠號 |
| –dport | 指定目的埠號 |
5、添加新的規則
添加新的防火墻規則時,使用管理選項“-A”、“-I”,前者用來追加規則,后者用來插入規則
若要在 filter 表 INPUT 鏈的末尾添加一條防火墻規則,可以執行以下操作(其中 “-p 協議名”作為匹配條件)
iptables -t filter -A INPUT -p icmp -j REJECT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -s 192.168.80.11 -j DROP
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP
6、查看規則串列
查看已有的防火墻規則時,使用管理選項“-L”,結合“--line-numbers”選項還可顯示各條規則在鏈內的順序號
若要查看 filter 表 INPUT 鏈中的所有規則,并顯示規則序號, 可以執行以下操作
iptables [-t表名] -n -L [鏈名] |[-- line-numbers]
或
iptables - [vn]L
#注意:不可以合寫為-Ln
當防火墻規則的數量較多時,若能夠以數字形式顯示地址和埠資訊,可以減少地址決議的環節,在一定程度上加快命令執行的速度
若要以數字地址形式查看 filter 表INPUT 鏈中的所有規則,可以執行以下操作
iptables -nL INPUT
7、洗掉、清空、更改規則
洗掉一條防火墻規則時,使用管理選項“-D”
若要洗掉 filter 表 INPUT 鏈中的第五條規則,可以執行以下操作
iptables -D INPUT 5
若要洗掉 filter 表 INPUT 不允許任何主機ping本主機,可以執行以下操作
iptables -t filter -R INPUT 序號(iptables -L INPUT --line-numbers查詢) -j REJECT
若要清空 filter 表 INPUT 鏈中的所有規則,可以執行以下操作
iptables -F INPUT
主意:
若規則串列中有多條相同的規則時,按內容匹配只洗掉的序號最小的一條
按號碼匹配洗掉時,確保規則號碼小于等于已有規則數,否則報錯
按內容匹配刪數時,確保規則存在,否則報錯
-F僅僅是清空鏈中的規則,并不影響-P設定的默認規則,默認規則需要手動進行修改
-P設定了DROP后,使用-F--定要小心,防止把允許遠程連接的相關規則清除后導致無法遠程連接主機,此情況如果沒有保存規則可重啟主機解決
如果不寫表名和鏈名,默認清空filter表中所有鏈里的所有規則
8、規則的匹配條件
在撰寫防火墻規則時,匹配條件的設定起著決定性的作用,只有清晰、準確地設定好匹配條件,防火墻才知道要對符合什么條件的資料包進行處理,避免“誤殺”,對于同一條防火墻規則,可以指定多個匹配條件,表示這些條件必須都滿足規則才會生效,根據資料包的各種特征,結合iptables的模塊結構,匹配條件的設定包括三大類:通用匹配、隱含匹配、顯式匹配
通用匹配
通用匹配也稱為常規匹配,這種匹配方式可以獨立使用,不依賴于其他條件或擴展模塊, 常見的通用匹配包括協議匹配、地址匹配、網路介面匹配
撰寫 iptables 規則時使用“-p 協議名”的形式指定,用來檢查資料包所使用的網路協議,如 tcp、udp、icmp 和 all(針對所有 IP 資料包)等,可用的協議型別存放于 Linux 系統的/etc/procotols 檔案中
可直接使用,不依賴于其他條件或擴展,包括網路協議、IP地址、網路介面等條件
協議匹配: -p協議名
地址匹配: -s源地址、-d目的地址
#可以是IP、網段、域名、空(任何地址)
介面匹配: -i入站網卡、-o出站網卡
iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -s 192.168.80.11 -j DROP
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT //感嘆號”!”表示取反
隱含匹配
要求以特定的協議匹配作為前提,包括埠、TCP標記、ICMP型別等條件
埠匹配: --sport 源埠、--dport 目的埠
#可以是個別埠、埠范圍
--sport 1000 匹配源埠是1000的資料包
--sport 1000:3000 匹配源埠是1000-3000的資料包
--sport :3000 匹配源埠是3000及以下的資料包
--sport 1000: 匹配源埠是1000及以上的資料包
注意: --sport和--dport 必須配合-p <協議型別>使用
iptables -A INPUT -p tcp --sport 1000:3000 -j REJECT
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
TCP標記匹配: --tcp-flags TCP標記
iptables -I INPUT -i ens33 -P tcp --tcp-flags SYN, RST,ACK SYN -j ACCEPT
#丟棄SYN請求包,放行其他包
ICMP型別匹配: -- icmp-type ICMP型別
#可以是字串、數字代碼
"Echo- Request" (代碼為8)表示請求
"Echo- Reply" (代碼為0)表示回顯
"Dest ination-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 -j DROP
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #當本機ping不通其它主機時提示目標不可達
#此時其它主機需要配置關于icmp協議的控制型別為REJECT
iptables -A INPUT -p icmp -j REJECT
顯式匹配
要求以“-m擴展模塊”的形式明確指出型別,包括多埠、MAC地址、IP范圍、資料包狀態等條件
多埠匹配: -m multiport --sport 源埠串列
-m multiport --dport 目的埠串列
iptables -A INPUT -p tcp -m multiport --dport 80,21,20,53 -j ACCEPT
iptables -A INPUT -P udp -m multiport --dport 53 -j ACCEPT
IP范圍匹配: -m iprange --src-range IP范圍
iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
#禁止轉發源地址位于192.168.80.100-192.168.80.200的udp資料包
MAC地址匹配: -m mac --mac-source MAC地址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
#禁止來自某MAC地址的資料包通過本機轉發
狀態匹配
狀態匹配: -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,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
#對進來的包的狀態進行檢測,已經建立tcp連接的包以及該連接相關的包允許通過,
#比如我和你做生意,我們談成了生意,到了支付的時候,就可以直接呼叫與這筆生意相關的支付功能
iptables -P INPUT DROP
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300965.html
標籤:其他
