2023-08-31 01:54:52 來源 : 博客園
netfilter/iptables:IP 信息包過濾系統(tǒng),它實(shí)際上由兩個(gè)組件 netfilter 和 iptables組成。 主要工作在網(wǎng)絡(luò)層,針對(duì)IP數(shù)據(jù)包,體現(xiàn)在對(duì)包內(nèi)的IP地址、端口等信息的處理。
netfilter/iptables關(guān)系:netfilter:
(資料圖)
屬于“內(nèi)核態(tài)”又稱內(nèi)核空間(kernel space)的防火墻功能體系。linux 好多東西都是內(nèi)核態(tài) 用戶態(tài),那我們運(yùn)維人員關(guān)注的是用戶態(tài), 內(nèi)核我們關(guān)注不是很多,內(nèi)核基本是我們開發(fā)人員關(guān)心的事情是內(nèi)核的一部分,由一些信息包過濾表組成,這些表包含內(nèi)核用來控制信息包過濾處理的規(guī)則集。
iptables :
屬于“用戶態(tài)”(User Space, 又稱為用戶空間)的防火墻管理體系。是一種用來管理Linux防火墻的命令程序,它使插入、修改和刪除數(shù)據(jù)包過濾表中的規(guī)則變得容易,通常位于/sbin/iptables目錄下。 netfilter/iptables后期簡稱為iptables。iptables是基于內(nèi)核的防火墻,其中內(nèi)置了raw、mangle、 nat和filter四個(gè)規(guī)則表。表中所有規(guī)則配置后,立即生效,不需要重啟服務(wù)。
iptables由五個(gè)表table和五個(gè)鏈chain以及一些規(guī)則組成
五個(gè)表table:filter、nat、mangle、raw、security
filter | 過濾規(guī)則表,根據(jù)預(yù)定義的規(guī)則過濾符合條件的數(shù)據(jù)包,默認(rèn)表 |
---|---|
nat | 地址轉(zhuǎn)換規(guī)則表 |
mangle | 修改數(shù)據(jù)標(biāo)記位規(guī)則表 |
raw | 關(guān)閉啟用的連接跟蹤機(jī)制,加快封包穿越防火墻速度 |
security | 用于強(qiáng)制訪問控制(MAC)網(wǎng)絡(luò)規(guī)則,由Linux安全模塊(如SELinux)實(shí)現(xiàn) (了解) |
優(yōu)先級(jí)由高到低的順序?yàn)椋?/strong>
security -->raw-->mangle-->nat-->filter
總結(jié)
規(guī)則表的作用:容納各種規(guī)則鏈; 表的劃分依據(jù):防火墻規(guī)則的作用相似
規(guī)則鏈的作用:容納各種防火墻規(guī)則;規(guī)則的作用:對(duì)數(shù)據(jù)包進(jìn)行過濾或處理 ;鏈的分類依據(jù):處理數(shù)據(jù)包的不同時(shí)機(jī)
總結(jié):表里有鏈,鏈里有規(guī)則
五鏈:INPUT | 處理入站數(shù)據(jù)包,匹配目標(biāo)IP為本機(jī)的數(shù)據(jù)包。 |
---|---|
OUTPUT | 處理出站數(shù)據(jù)包,一般不在此鏈上做配置。 |
FORWARD | 處理轉(zhuǎn)發(fā)數(shù)據(jù)包,匹配流經(jīng)本機(jī)的數(shù)據(jù)包。 |
PREROUTING | 在進(jìn)行路由選擇前處理數(shù)據(jù)包,用來修改目的地址,用來做DNAT。相當(dāng)于把內(nèi)網(wǎng)服務(wù)器的IP和端口映射到路由器的外網(wǎng)IP和端口上。 |
POSTROUTING | 在進(jìn)行路由選擇后處理數(shù)據(jù)包,用來修改源地址,用來做SNAT。相當(dāng)于內(nèi)網(wǎng)通過路由器NAT轉(zhuǎn)換功能實(shí)現(xiàn)內(nèi)網(wǎng)主機(jī)通過一個(gè)公網(wǎng)IP地址上網(wǎng)。 |
內(nèi)核中數(shù)據(jù)包的傳輸過程
當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),數(shù)據(jù)包首先進(jìn)入PREROUTING鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的IP判斷是否需要 轉(zhuǎn)送出去
如果數(shù)據(jù)包是進(jìn)入本機(jī)的,數(shù)據(jù)包就會(huì)沿著圖向下移動(dòng),到達(dá)INPUT鏈。數(shù)據(jù)包到達(dá)INPUT鏈后, 任何進(jìn)程都會(huì)收到它。本機(jī)上運(yùn)行的程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包經(jīng)過OUTPUT鏈,然后到達(dá)
如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包就會(huì)向右移動(dòng),經(jīng)過FORWARD鏈,然后到達(dá)POSTROUTING鏈輸出
2,實(shí)際操作CentOS7默認(rèn)使用firewalld防火墻,沒有安裝iptables,若想使用iptables防火墻。必須先關(guān)閉firewalld防火墻,再安裝iptables
前期準(zhǔn)備工作?systemctl stop firewalld.service?systemctl disable --now firewalld.service##開機(jī)不自啟 并且立即關(guān)閉systemctl enable --now firewalld.service##開機(jī)自啟 并且 立即開啟?yum -y install iptables iptables-servicessystemctl start iptables.servicesystemctl enable iptables.service
2.1 iptables的配置方法使用iptables命令行。
使用圖形化管理工具system- config- firewall
2.2使用iptables命令行配置規(guī)則命令格式:
iptables [-t 表名] 管理選項(xiàng) [鏈名] [匹配條件] [-j 控制類型]
注意事項(xiàng):
不指定表名時(shí),默認(rèn)指filter表
不指定鏈名時(shí),默認(rèn)指表內(nèi)的所有鏈
除非設(shè)置鏈的默認(rèn)策略,否則必須指定匹配條件
控制類型使用大寫字母,其余均為小寫
常用控制類型:
ACCEPT | 允許數(shù)據(jù)包通過 |
---|---|
DROP | 直接丟棄數(shù)據(jù)包,不給出任何回 應(yīng)信息。 |
REJECT | 拒絕數(shù)據(jù)包通過,必要時(shí)會(huì)給數(shù)據(jù)發(fā)送端一個(gè)響應(yīng)信息。 |
LOG | 在/var/log/messages 文件中記錄日志信息,然后將數(shù)據(jù)包傳遞給下一條規(guī)則。LOG只是一種輔助動(dòng)作,并沒有真正處理數(shù)據(jù)包 |
SNAT | 修改數(shù)據(jù)包的源地址。 |
DNAT | 修改數(shù)據(jù)包的目的地址 |
MASQUERADE | 偽裝成一個(gè)非固定公網(wǎng)IP地址。 |
常用管理選項(xiàng):
-A | 在指定鏈的末尾追加(--append)一條新的規(guī)則 |
---|---|
-I(大寫i) | 在指定鏈的開頭插入(--insert)一條新的規(guī)則,未指定序號(hào)時(shí)默認(rèn)作為第一條規(guī)則 |
-R | 修改、替換(--replace) 指定鏈中的某一條規(guī)則,可指定規(guī)則序號(hào)或具體內(nèi)容 |
-P | 設(shè)置指定鏈的默認(rèn)策略(--policy) |
-D | 刪除(--delete) 指定鏈中的某一條規(guī)則,可指定規(guī)則序號(hào)或具體內(nèi)容 |
-F | 清空(--flush)指定鏈中的所有規(guī)則,若未指定鏈名,則清空表中的所有鏈 |
-L | 列出(--list) 指定鏈中所有的規(guī)則,若未指定鏈名,則列出表中的所有鏈 |
-n | 使用數(shù)字形式(--numeric) 顯示輸出結(jié)果,如顯示IP地址而不是主機(jī)名 |
-v | 顯示詳細(xì)信息,包括每條規(guī)則的匹配包數(shù)量和匹配字節(jié)數(shù) |
--line-numbers | 查看規(guī)則時(shí),顯示規(guī)則的序號(hào) |
匹配條件:
-p | 指定要匹配的數(shù)據(jù)包的協(xié)議類型 |
---|---|
-s | 指定要匹配的數(shù)據(jù)包的源IP地址 |
-d | 指定要匹配的數(shù)據(jù)包的目的IP地址 |
-i | 指定數(shù)據(jù)包進(jìn)入本機(jī)的網(wǎng)絡(luò)接口 |
-o | 指定數(shù)據(jù)包離開本機(jī)做使用的網(wǎng)絡(luò)接口 |
–sport | 指定源端口號(hào) |
–dport | 指定目的端口號(hào) |
[root@localhost ~]# iptables -L //不指定默認(rèn)查看filter表中所有規(guī)則[root@localhost ~]# iptables -nL //以數(shù)字形式顯示[root@localhost ~]# iptables -nL -t nat //查看nat表規(guī)則[root@localhost ~]# iptables -nL --line-numbers //顯示序列號(hào)[root@localhost ~]# iptables -t filter -F 清空 filter表內(nèi)所有規(guī)則[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 //清空所有規(guī)則鏈中的所有規(guī)則??
1、 iptables -L,列出表中所有鏈。不指定表名則默認(rèn)查看filter表。
2、 iptables -L -n,以數(shù)字形式顯示輸出結(jié)果。-L -n 合在一起寫時(shí),必須n在前,要寫成 -nL。
3、iptables -nL -t nat,查看nat表。
4,顯示序列號(hào)
5、iptables -t filter -F,清空 filter表內(nèi)所有規(guī)則。
6,執(zhí)行 iptables -F
后,所有的規(guī)則鏈(包括默認(rèn)的鏈)中的規(guī)則都會(huì)被刪除,但是默認(rèn)策略(默認(rèn)動(dòng)作)不會(huì)被改變。
-A,在末尾追加規(guī)則。
-I,在指定位置前插入規(guī)則。如果不指定,則在首行插入
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT#//不允許任何主機(jī)ping本主機(jī)[root@localhost ~]# iptables -nvLChain 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# //允許主機(jī)ssh端口 通過我的[root@localhost ~]# iptables -nL --line-numbers#--line-numbers顯示行號(hào)Chain INPUT (policy ACCEPT)num target prot opt source destination1 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22??
3刪除、清空、替換規(guī)則替換:
iptables -A INPUT -s 192.168.1.200 -j DROPiptables -nvL --line-numbers?iptables -R INPUT 1 -s 192.168.1.200 -j ACCEPT iptables -nvL --line-numbers
刪除規(guī)則 -D1、按序號(hào)刪除,比較準(zhǔn)確。
2、按內(nèi)容刪除,如果有2條相同內(nèi)容,會(huì)刪除序號(hào)小的那個(gè)。
[root@localhost ~]# iptables -nL --line-number //顯示規(guī)則序號(hào)Chain INPUT (policy ACCEPT)num target prot opt source destination1 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規(guī)則連中的第1條規(guī)則[root@localhost ~]# iptables -nL --line-numberChain 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協(xié)議ACCEPT的規(guī)則
清空指定鏈或表中的所有防火墻規(guī)則,使用管理選項(xiàng)“-F”。例如,若要清空 filter 表 INPUT
[root@localhost ~]# iptables -F INPUT[root@localhost ~]# iptables -nL INPUTChain INPUT (policy ACCEPT)target prot opt source destination ?
設(shè)置默認(rèn)策略 -P未修改的狀況下,默認(rèn)策略為ACCEPT(允許)。
注意:
將默認(rèn)策略修改為DROP前,一定要檢查清楚鏈內(nèi)是否設(shè)置了允許tcp協(xié)議22端口進(jìn)行連接的規(guī)則。否則一旦修改為DROP,會(huì)導(dǎo)致ssh斷連。
iptables -P INPUT DROP //將默認(rèn)策略修改為DROP
3 匹配條件通用匹配可直接使用, 不依賴于其他條件或擴(kuò)展包括網(wǎng)絡(luò)協(xié)議、IP地址、網(wǎng)絡(luò)接口等條件。
協(xié)議匹配 | -p 協(xié)議名 |
---|---|
地址匹配 | -s 源地址、-d 目的地址 ??梢允荌P、網(wǎng)段、域名、空(任何地址) |
接口匹配 | -i 入站網(wǎng)卡、-o 出站網(wǎng)卡 |
iptables -A INPUT ! -p icmp -j ACCEPT#沒有-t指定表,就是指默認(rèn)表filter表# !代表?xiàng)l件取反,不是icmp的都放通 iptables -A INPUT -s 192.168.1.100 -j REJECT#拒絕從哪個(gè)主機(jī)發(fā)數(shù)據(jù)包過來(-s指定了源地址) iptables -I INPUT -i ens33 -s 192.168.1.0/24 -j DROP#在行首插入規(guī)則,丟棄該網(wǎng)段從ens33網(wǎng)卡進(jìn)來的數(shù)據(jù)包
示例1:
! 取反時(shí)需要注意。
“不是icmp的都放通”,即放通的協(xié)議中不包括icmp,這條規(guī)則沒有針對(duì)icmp。那么icmp協(xié)議會(huì)向下查找匹配,如果匹配不到規(guī)則,那么就會(huì)取默認(rèn)策略ACCEPT,則此時(shí)其他主機(jī)可以ping通本機(jī)。
使用其他主機(jī)ping本機(jī),可以ping通。
2 隱含匹配要求以特定的協(xié)議匹配作為前提,包括端口、TCP標(biāo)記、ICMP類 型等條件。
2.1 端口匹配端口匹配:--sport 源端口、--dport 目的端口。
可以是個(gè)別端口或者端口范圍。
格式 | 含義 |
---|---|
--sport 1000 | 匹配源端口是1000的數(shù)據(jù)包 |
--sport 1000:3000 | 匹配源端口是1000-3000的數(shù)據(jù)包 |
--sport 1000: | 匹配源端口是1000及以上的數(shù)據(jù)包 |
--sport :3000 | 匹配源端口是3000及以下的數(shù)據(jù)包 |
注意:--sport 和 --dport 必須配合 -p <協(xié)議類型> 使用
2.2 TCP標(biāo)記匹配--tcp-flags TCP標(biāo)記
#TCP三次握手時(shí)的第一次握手,放行SYN為1的報(bào)文,拒絕其他包。iptables -I INPUT -P tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT#第二次握手放行SYN、ACK為1的報(bào)文,拒絕其他包。iptables -I OUTPUT -P tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
2.3 ICMP類型匹配--icmp-type ICMP類型
ICMP類型可以是字符串、數(shù)字代碼
ICMP類型 | 含義 |
---|---|
Echo-Request (代碼為8 | 表示請(qǐng)求 |
Echo- -Reply (代碼為0) | 表示回顯 |
Dest ination-Unreachable (代碼為3) | 表示目標(biāo)不可達(dá) |
注: 其他可用的icmp協(xié)議類型,可以執(zhí)行iptables -p icmp -h 查看幫助信息。
--icmp-type 8 //表示請(qǐng)求(ping),即其他主機(jī)向本機(jī)請(qǐng)求(ping本機(jī))--icmp-type 0 //表示回顯(pong),即本機(jī)向其他主機(jī)發(fā)數(shù)據(jù)包(本機(jī)ping其他主機(jī))--icmp-type 3 //當(dāng)本機(jī)ping不通其他主機(jī)時(shí),提示目標(biāo)不可達(dá)。例子:#丟棄icmp的包,別人ping不通本機(jī),本機(jī)也ping不通別人iptables -A INPUT -p icmp -j DROP#丟棄icmp的請(qǐng)求,禁止其他主機(jī)ping本機(jī),但本機(jī)可以ping其他主機(jī)iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT #當(dāng)本機(jī)ping不通其它主機(jī)時(shí)提示目標(biāo)不可達(dá),此時(shí)其它主機(jī)需要配置關(guān)于icmp協(xié)議的控制類型為REJECTiptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
示例:
丟棄icmp協(xié)議的請(qǐng)求,禁止其他主機(jī)ping本機(jī),但本機(jī)可以ping其他主機(jī)。
3 顯示匹配要求以“-m擴(kuò)展模塊”的形式明確指出類型,包括多端口、MAC地址、IP范圍、數(shù)據(jù)包狀態(tài)等條件
3.1 多端口匹配-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPTiptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
.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# 禁止轉(zhuǎn)發(fā)源地址位于192.168.72.100——192.168.72.200的udp數(shù)據(jù)包
3.3 狀態(tài)匹配格式:
-m state --state連接狀態(tài)
常見的連接狀態(tài):
狀態(tài) | 含義 |
---|---|
NEW | 主機(jī)連接目標(biāo)主機(jī),在目標(biāo)主機(jī)上看到的第一個(gè)想要連接的包 |
ESTABLISHED | 主機(jī)已與目標(biāo)主機(jī)進(jìn)行通信,判斷標(biāo)準(zhǔn)只要目標(biāo)主機(jī)回應(yīng)了第一個(gè)包,就進(jìn)入該狀態(tài) |
主機(jī)已與目標(biāo)主機(jī)進(jìn)行通信,判斷標(biāo)準(zhǔn)只要目標(biāo)主機(jī)回應(yīng)了第一個(gè)包,就進(jìn)入該狀態(tài) | 主機(jī)已與目標(biāo)主機(jī)進(jìn)行通信,目標(biāo)主機(jī)發(fā)起新的鏈接方式,一般與ESTABLISHED配合使用 |
INVALID | 無效的封包,例如數(shù)據(jù)破損的封包狀態(tài) |
示例:
iptables -I INPUT -M state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT#第一個(gè)包我只看22端口的包#-p tcp是隱含匹配,可以省略-m tcp iptables -A INPUT -p tcp -m multiport --dport 443,80,22,21,20,53 -j ACCEPT#允許放通tcp的這些端口號(hào)#-m multiport加載多個(gè)端口模塊 iptables -A INPUT -p udp --dport 53 -j ACCEPT#放通UDP的53端口進(jìn)來的包(DNS服務(wù)器返回信息時(shí)默認(rèn)使用UDP的53端口)?iptables -A INPUT -p tcp -m state --state ESTABLISHED ,RELATED -j ACCEPT#對(duì)進(jìn)來的包的狀態(tài)進(jìn)行檢測。已經(jīng)建立tcp連接的包以及該連接相關(guān)的包允許通過。簡單來說就是只允許所有自己發(fā)出去的包進(jìn)來。#比如我和你做生意,我們談成了生意,到了支付的時(shí)候,就可以直接調(diào)用與這筆生意相關(guān)的支付功能。 iptables -P INPUT DROP#默認(rèn)關(guān)閉,將以上的設(shè)置設(shè)為白名單
4 總結(jié)1、Linux防火墻的兩個(gè)組件:
內(nèi)核態(tài) netilter(保存包過濾處理的規(guī)則集)
用戶態(tài) iptables(防火墻規(guī)則管理工具)
2、數(shù)據(jù)包五要素:
源IP,目的IP,源端口,目的端口 ,協(xié)議UDP/TCP
3、四表:
raw 對(duì)數(shù)據(jù)包進(jìn)行狀態(tài)跟蹤
mangle 修改數(shù)據(jù)包內(nèi)容,給數(shù)據(jù)包設(shè)置標(biāo)記
nat 地址轉(zhuǎn)換,轉(zhuǎn)換源/目的IP或者端口
fileter 過濾數(shù)據(jù)包 放行 丟棄
4、五鏈:
INPUT 入站
OUTPUT 出站
FORWARD 轉(zhuǎn)發(fā)
PREROUTING 路由前修改目的地址
POSTROUTING 路由后修改源IP
5、匹配順序
1)數(shù)據(jù)包到達(dá)防火墻時(shí),規(guī)則表之間的優(yōu)先順序:raw >mangle > nat > filter。
2)規(guī)則鏈之間的匹配順序:
主機(jī)型防火墻
入站數(shù)據(jù)(來自外界的數(shù)據(jù)包,且目標(biāo)地址是防火墻本機(jī)):PREROUTING --> INPUT -->本機(jī)的應(yīng)用程序
出站數(shù)據(jù)(從防火墻本機(jī)向外部地址發(fā)送的數(shù)據(jù)包):本機(jī)的應(yīng)用程序---->OUTPUT ----->POSTROUTING;
網(wǎng)絡(luò)型防火墻
轉(zhuǎn)發(fā)數(shù)據(jù)(需要經(jīng)過防火墻轉(zhuǎn)發(fā)的數(shù)據(jù)包):PREROUTING -->FORWARD -->POSTROUTING
3)鏈中的規(guī)則集:從上往下一次匹配,匹配到規(guī)則即停止,若都沒有匹配到則按默認(rèn)策略處理
6、管理選項(xiàng)
iptables [-t 表名] 管理選項(xiàng) [鏈名] [匹配條件] [-j 控制類型]
增:-A 在末尾添加,-I 在指定位置插入
刪:-D 刪除指定規(guī)則,-F 清空所有規(guī)則
改:-R,或者-A 添加后 -D 刪除
查:-nL 以數(shù)字形式顯示,--line-numbers 顯示規(guī)則的序號(hào)
設(shè)置默認(rèn)規(guī)則:-P
注意:
刪除規(guī)則前,以及將默認(rèn)規(guī)則修改為DROP之前,一定要先想清楚會(huì)不會(huì)導(dǎo)致ssh斷連。
7、 匹配條件
-p tcp|udp|icmp
-s 源IP
-d 目的IP
-i 入站網(wǎng)卡
-o 出站網(wǎng)卡