netfilter/iptables:IP 資訊包過濾系統,它實際上由兩個元件 netfilter 和 iptables組成。 主要工作在網路層,針對IP封包,體現在對包內的IP地址、埠等資訊的處理。
netfilter:
屬於「核心態」又稱核心空間(kernel space)的防火牆功能體系。linux 好多東西都是核心態 使用者態,那我們運維人員關注的是使用者態, 核心我們關注不是很多,核心基本是我們開發人員關心的事情是核心的一部分,由一些資訊包過濾表組成,這些表包含核心用來控制資訊包過濾處理的規則集。
iptables :
屬於「使用者態」(User Space, 又稱為使用者空間)的防火牆管理體系。是一種用來管理Linux防火牆的命令程式,它使插入、修改和刪除封包過濾表中的規則變得容易,通常位於/sbin/iptables目錄下。 netfilter/iptables後期簡稱為iptables。iptables是基於核心的防火牆,其中內建了raw、mangle、 nat和filter四個規則表。表中所有規則設定後,立即生效,不需要重啟服務。
iptables由五個表table和五個鏈chain以及一些規則組成
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地址上網。 |
核心中封包的傳輸過程
當一個封包進入網路卡時,封包首先進入PREROUTING鏈,核心根據封包目的IP判斷是否需要 轉送出去
如果封包是進入本機的,封包就會沿著圖向下移動,到達INPUT鏈。封包到達INPUT鏈後, 任何程序都會收到它。本機上執行的程式可以傳送封包,這些封包經過OUTPUT鏈,然後到達
如果封包是要轉發出去的,且核心允許轉發,封包就會向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出
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
使用iptables命令列。
使用圖形化管理工具system- config- firewall
命令格式:
iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制型別]
注意事項:
不指定表名時,預設指filter表
不指定鏈名時,預設指表內的所有鏈
除非設定鏈的預設策略,否則必須指定匹配條件
控制型別使用大寫字母,其餘均為小寫
常用控制型別:
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 | 指定目的埠號 |
[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表。
2、 iptables -L -n,以數位形式顯示輸出結果。-L -n 合在一起寫時,必須n在前,要寫成 -nL。
3、iptables -nL -t nat,檢視nat表。
4,顯示序列號
5、iptables -t filter -F,清空 filter表內所有規則。
6,執行 iptables -F
後,所有的規則鏈(包括預設的鏈)中的規則都會被刪除,但是預設策略(預設動作)不會被改變。
-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
替換:
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
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的規則
清空指定鏈或表中的所有防火牆規則,使用管理選項「-F」。例如,若要清空 filter 表 INPUT
[root@localhost ~]# iptables -F INPUT
[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
未修改的狀況下,預設策略為ACCEPT(允許)。
注意:
將預設策略修改為DROP前,一定要檢查清楚鏈內是否設定了允許tcp協定22埠進行連線的規則。否則一旦修改為DROP,會導致ssh斷連。
iptables -P INPUT DROP //將預設策略修改為DROP
可直接使用, 不依賴於其他條件或擴充套件包括網路協定、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通本機。
使用其他主機ping本機,可以ping通。
要求以特定的協定匹配作為前提,包括埠、TCP標記、ICMP類 型等條件。
埠匹配:--sport 源埠、--dport 目的埠。
可以是個別埠或者埠範圍。
格式 | 含義 |
---|---|
--sport 1000 | 匹配源埠是1000的封包 |
--sport 1000:3000 | 匹配源埠是1000-3000的封包 |
--sport 1000: | 匹配源埠是1000及以上的封包 |
--sport :3000 | 匹配源埠是3000及以下的封包 |
注意: --sport 和 --dport 必須配合 -p <協定型別> 使用
--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
--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其他主機。
要求以「-m擴充套件模組」的形式明確指出型別,包括多埠、MAC地址、IP範圍、封包狀態等條件
-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
-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封包
格式:
-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
#預設關閉,將以上的設定設為白名單
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 入站網路卡