Linux 防火牆
基礎知識
安全技術:
-
IDS:Intrusion Detection Systems,入侵檢測系統
-
IPS:Intrusion Prevention System,入侵防禦系統
-
FireWall:防火牆
防火牆概念
防火牆是作用與內網和外網之間,根據定義的策略來過濾流量的軟體或者硬體。
防火牆分類
可以根據作用範圍和實現邏輯分類
根據作用範圍分類
-
主機防火牆:針對於單個主機進行防護。
-
網路防火牆:處於網路入口或邊緣,針對於網路入口進行防護,服務於防火牆背後的本地區域網
根據實現邏輯分類
-
硬體防火牆:在硬體級別實現部分防火牆功能,另一部分功能基於軟體實現,效能高,成本高。
-
軟體防火牆:應用軟體處理邏輯運行於通用硬體平臺之上的防火牆,效能低,成本低。
linux的防火牆:netfilter
netfilter元件是整合在核心中的,採用模組化設計的,工作在核心空間。
netfilter的鉤子函式
鉤子函式:hook(勾子) function。是系統預留的一些函式,可以允許外部使用者呼叫鉤子函式。可以通過一些工具來向這五個鉤子函式中寫入規則
netfilter在五個位置放了五個不同的鉤子函式,
-
INPUT
-
OUTPUT
-
FORWARD
-
PREROUTING
-
POSTROUTING
netfilter的報文流向
-
到本機的某程序:PREROUTING –> INPUT
-
由本機轉發的:PREROUTING –> FORWARD –> POSTROUTING
-
由本機某程序發出的:OUTPUT –> POSTROUTING
PREROUTTING:報文的總進口 POSTROUTING:報文的總出口
linux防火牆的管理工具
-
iptables:用來編寫規則,寫好的規則被送往netfilter,告訴核心如何去處理資訊包
-
firewalld:CentOS7提供的,就是基於iptables的二次開發
-
nettable:CentOS8提供的
iptables的相關概念
-
iptables由五表、五鏈和一些規則組成。
-
iptables中的五鏈對應netfilter的五個鉤子函式。
優先順序從高到低: security -->raw-->mangle-->nat-->filter
規則:根據指定的匹配條件來嘗試匹配每個流經此處的報文,一旦匹配成功,則由規則後面指定的處理動作進行處理 鏈:多條規則就形成了一條鏈 表:把具有相同功能的規則的集合叫做”表”
五表:
-
filter:負責過濾功能,防火牆;核心模組:iptables_filter
-
nat:network address translation,網路地址轉換功能;核心模組:iptable_nat
-
mangle:拆解報文,做出修改,並重新封裝 的功能;iptable_mangle
-
raw:關閉啟用的連線跟蹤機制,加快封包穿越防火牆速度
-
security:用於強制訪問控制(MAC)網路規則,由Linux安全模組(如SELinux)實現
表和鏈的關係
表是具有相同功能的鏈的集合。
# 檢視對應鏈上的規則都在哪些表中:iptables -vnL -t table_name PREROUTING 的規則可以存在於:raw表,mangle表,nat表。 INPUT 的規則可以存在於:mangle表,filter表,(centos7中還有nat表,centos6中沒有)。 FORWARD 的規則可以存在於:mangle表,filter表。 OUTPUT 的規則可以存在於:raw表mangle表,nat表,filter表。 POSTROUTING 的規則可以存在於:mangle表,nat表。
iptables中的規則
規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作作出處理。
在實際的使用過程中,往往是通過”表”作為操作入口,對規則進行定義的
檢視iptables的規則:
#檢視iptables表的規則: iptables -t 表名 -L #檢視指定表的指定鏈中的規則: iptables -t 表名 -v -L
#例如:檢視filter表的所有規則 [root@CentOS8 ~]# iptables -t filter -L -t:指定表的型別: -L:list,列出所有規則 -v:顯示詳細資訊 -n:number,不對規則中的IP或者埠進行名稱反解,-n選項表示不解析IP地址。
不指定表名,預設使用的是filter這張表。
#使用 -v 選項顯示的詳細資訊 # pkts:對應規則匹配到的報文的個數。 # bytes:對應匹配到的報文包的大小總和。 # target:規則對應的target,往往表示規則對應的”動作”,即規則匹配成功後需要採取的措施。 # prot:表示規則對應的協議,是否只針對某些協議應用此規則。 # opt:表示規則對應的選項。 #in:表示資料包由哪個介面(網絡卡)流入,即從哪個網絡卡來。 # out:表示資料包將由哪個介面(網絡卡)流出,即到哪個網絡卡去。 # source:表示規則對應的源頭地址,可以是一個IP,也可以是一個網段。 # destination:表示規則對應的目標地址。可以是一個IP,也可以是一個網段
#範例:檢視filter表中的INPUT鏈的所有規則 root@CentOS8 ~]# iptables -t filter --line-numbers -vnL INPUT Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination # -–line-numbers:顯示規則的編號 # policy表示當前鏈的預設策略 # packets表示當前鏈(上例為INPUT鏈)預設策略匹配到的包的數量,0 packets表示預設策略匹配到0個包。 # bytes表示當前鏈預設策略匹配到的所有包的大小總和。
管理iptables的規則
增加規則:
#範例:拒絕10.0.0.11主機的報文 [root@CentOS8 ~]# iptables -t filter -I INPUT -s 10.0.0.11 -j DROP [root@CentOS8 ~]# iptables -t filter -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 10.0.0.11 anywhere # -I:insert, 插入,要指明插入至的規則編號,預設為第一條 # -j:targetname [per-target-options] 指定規則的處理動作 # -s:為source之意,表示源地址。 # -A: 表示在鏈的尾部追加規則,-I表示在鏈的首部插入規則 注意: # 1.如果報文已經被前面的規則匹配到,iptables則會對報文執行對應的動作,即使後面的規則也能匹配到當前報文,很有可能也沒有機會再對報文執行相應的動作了。 # 2.可以在新增規則時,指定新增規則的編號,將規則新增到指定的位置 [root@CentOS8 ~]# iptables -t filter -I INPUT 2 -s 10.0.0.11 -j DROP # -I INPUT 2:表示在2這個位置插入這條規則
刪除規則:
-
方法一:根據規則的編號去刪除規則
-
方法二:根據具體的匹配條件與動作刪除規則
# 範例:刪除filter表中的INPUT鏈上面的第一條規則 [root@CentOS8 ~]# iptables -t filter -D INPUT 1 # -D選項表示刪除指定鏈中的某條規則,-D INPUT 1表示刪除INPUT鏈中的第1條規則
# 範例:刪除filter表中,INPUT鏈上,源地址是10.0.0.11,處理動作是DROP的這條規則 [root@CentOS8 ~]# iptables -t filter -D INPUT -s 10.0.0.11 -j DROP
清除所有規則
-
清除指定鏈中的所有規則:iptables -t 表名 -F 鏈名
-
清除指定表中的所有規則: iptables -F
#範例:清除filter表中,INPUT鏈上的所有規則 [root@CentOS8 ~]# iptables -t filter -F INPUT
修改鏈的預設策略
# 例如:修改filter表中的INPT鏈的預設策略為DROP [root@CentOS8 ~]# iptables -t filter -P INPUT DROP # 當鏈中沒有任何規則時,防火牆會按照預設動作處理報文
白名單和黑名單
-
白名單:只有指定的特定主機可以訪問,其它全拒絕
-
黑名單:只有指定的特定主機拒絕訪問,其它全允許,預設方式
儲存規則:
預設所做的操作是臨時生效的,重啟失效
#CentOS6把儲存iptables規則: service iptables saeve #將規則覆蓋儲存至/etc/sysconfig/iptables檔案中 CentOS 7,8 方法一: iptables-save > /PATH/TO/SOME_RULES_FILE iptables-restore < /PATH/FROM/SOME_RULES_FILE(在rc.local中加入這條命令) #iptables-restore:載入規則 #將規則存在一個檔案,通過開機自動載入這個檔案來實現。 方法二: 安裝iptables.service 因為安裝這個軟體以後,它的/etc/sysconfig/iptables這個檔案帶有他自己預設的規則,通過: iptables-save > /etc/sysconfig/iptables來覆蓋它預設的規則。從而實現規則的的儲存。
iptables的匹配條件
-
基本匹配條件:直接能用的條件
-
擴充套件匹配條件:需要呼叫對應的擴充套件模組
iptables的基本匹配條件
- 源地址
- 目標地址
- 網絡卡名稱
- 協議型別
源地址和目標地址
使用-s選項來指定源地址,可以是網段或者是一臺具體的主機。多個地址或者網段用逗號隔開。
使用-d選項來指定目標地址,可以是網段或者是一臺具體的主機
不指定任何目標地址,則目標地址預設為0.0.0.0/0,同理,如果我們不指定源地址,源地址預設為0.0.0.0/0,0.0.0.0/0表示所有IP 只能表示離散的地址(單個地址逗號隔開),不能表示一個連續的地址(例如10.0.0.11-10.0.0.19)
#範例:來自10.0.0.11這個裝置的資料表都丟棄 [root@CentOS8 ~]# iptables -t filter -I INPUT -s 10.0.0.11 -d 10.0.0.10 -j DROP
網絡卡名稱
有多塊網絡卡時,指定從那塊網絡卡流入或者流出。
-i: 本機有多個網絡卡時,我們可以使用 -i 選項去匹配報文是通過哪塊網絡卡流入本機 -o: 當主機有多塊網絡卡時,可以使用-o選項,匹配報文將由哪塊網絡卡流出 #-i選項只能用於PREROUTING鏈、INPUT鏈、FORWARD鏈,那麼-o選項只能用於FORWARD鏈、OUTPUT鏈、POSTROUTING鏈。
協議型別
匹配不同協議型別的資料包
使用-p引數來匹配指定的協議型別。
#例如: 匹配到來自10.0.0.11這個裝置的tcp資料包就拒絕 [root@CentOS8 ~]# iptables -t filter -I INPUT -s 10.0.0.11 -d 10.0.0.10 -p tcp -j REJECT
#centos6中,-p選項支援如下協議型別: tcp, udp, udplite, icmp, esp, ah, sctp #centos7中,-p選項支援如下協議型別: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh #當不使用-p指定協議型別時,預設表示所有型別的協議都會被匹配到,與使用-p all的效果相同。
擴充套件匹配條件
需要呼叫指定的擴充套件模組才能使用的匹配條件。
擴充套件匹配條件分為:
-
隱式擴充套件:和協議名稱一樣的模組,使用-p執行協議型別的時候,會自動分配一個同名的模組。
-
顯示擴充套件:需要使用 -m 引數手動指定模板才能使用
隱式擴充套件
和協議同名的擴充套件模組:只需要使用-p選項指定協議,會自動呼叫同名的擴充套件模組。
-
tcp
-
udp
-
icmp
tcp 協議的擴充套件選項:
[!] --source-port, --sport port[:port]:匹配報文源埠,可為埠連續範圍 #[!] 表示可以取反 [!] --destination-port,--dport port[:port]:匹配報文目標埠,可為連續範圍
#範例:拒絕外來報文的目標埠為本機的22號埠 [root@CentOS8 html]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -j DROP #注意 1.-m tcp表示使用tcp擴充套件模組,–dport表示tcp擴充套件模組中的一個擴充套件匹配條件 2.使用 -p 指定報文協議,但是沒有使用 -m 指定擴充套件模組時,會預設使用和協議名稱相同的模組 3.連續的埠表示方法: num1:num2
udp 協議的擴充套件選項:
[!] --source-port, --sport port[:port]:匹配報文的源埠或埠範圍 [!] --destination-port,--dport port[:port]:匹配報文的目標埠或埠範圍
icmp 協議的擴充套件選項:
ICMP協議:Internet Control Message Protocol,翻譯為網際網路控制報文協議,它主要用於探測網路上的主機是否可用,目標是否可達,網路是否通暢,路由是否可用等
[!] --icmp-type {type[/code]|typename} type/code 0/0 echo-reply icmp應答 8/0 echo-request icmp請求 使用 –icmp-type 表示根據具體的type與code去匹配對應的icmp報文 ping迴應報文,它的type為0,code也為0 ping請求報文對應的type為8,code為0
#範例:禁止所有icmp型別的報文進入本機 [root@CentOS8 ~]# iptables -t filter -I INPUT -p icmp -j REJECT
#範例:實現能ping通別人,但是不想讓別人ping通我們 [root@CentOS8 ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT –icmp-type 8/0 表示icmp報文的type為8,code為0才會被匹配到,也就是隻有ping請求型別的報文才能被匹配到 我們之所以能夠ping通別人,是因為別人迴應我們的報文的icmp type為0,code也為0,所以無法被上述規則匹配到,所以我們可以看到別人迴應我們的資訊
顯式擴充套件模組
-
multiport:可以指定離散的埠號,使用逗號隔開
-
iprange:指定一個連續的ip地址範圍
-
mac
-
string:匹配含有指定字串的報文
-
time:匹配指定時間段的報文
-
connlimit
-
limit
-
state
iprange擴充套件模組:
兩個擴充套件匹配條件: –src-range: –dst-range #例如: [root@CentOS8 html]# iptables -t filter -I INPUT -m iprange --src-range 10.0.0.10-10.0.0.13 -j DROP
string模組:
常用擴充套件匹配條件: –algo:指定對應的匹配演算法,可用演算法為bm、kmp,此選項為必需選項。 –string:指定需要匹配的字串
#例如: #含有hello1這個字串的報文就丟棄掉 [root@CentOS8 html]# iptables -t filter -I INPUT -m string --algo bm --string "hello1" -j DROP #範例:禁止訪問谷歌 iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
time模組:根據將報文到達的時間與指定的時間範圍進行匹配
(注意:CentOS 8 此模組有問題)
#常用擴充套件匹配條件如下: –timestart:用於指定時間範圍的開始時間,不可取反 –timestop:用於指定時間範圍的結束時間,不可取反 –weekdays:用於指定”星期幾”,可取反 –monthdays:用於指定”幾號”,可取反 –datestart:用於指定日期範圍的開始日期,不可取反 –datestop:用於指定日期範圍的結束時間,不可取反
#範例:每天早上9點到下午6點不能看網頁 [root@CentOS8 html]# iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
connlimit擴充套件模組:限制每個IP地址同時連結到server端的連結數量
–connlimit-above:單獨使用此選項時,表示限制每個IP的連結數量。 –connlimit-mask:此選項不能單獨使用,在使用–connlimit-above選項時,配合此選項,則可以針對”某類IP段內的一定數量的IP”進行連線數量的限制
#範例:限制每個ip地址(客戶端)只能開啟兩個ssh連線到service iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
state擴充套件模組:用來識別報文是主動發出去的還是被動接收的。
state連線的概念:兩臺機器能進行正常的通訊就算建立了連線。
state連線的狀態:
NEW:連線中的第一個包,狀態就是NEW, ESTABLISHED:我們可以把NEW狀態包後面的包的狀態理解為ESTABLISHED,表示連線已建立。 RELATED:有關係的報文 INVALID:如果一個包沒有辦法被識別,或者這個包沒有任何狀態,那麼這個包的狀態就是INVALID UNTRACKED:報文的狀態為untracked時,表示報文未被追蹤,當報文的狀態為Untracked時通常表示無法找到相關的連線
#範例:實現只有迴應我們的報文能夠通過防火牆,如果是別人主動傳送過來的新的報文,則無法通過防火牆 [root@centos8 ~]#iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT [root@centos8 ~]#iptables -A INPUT -m state --state NEW -j REJECT
iptables自定義鏈
target相關概念
target:iptables中的動作,報文被規則匹配到以後,target能是一個”動作”,target也能是一個”自定義鏈”,當target為一個動作時,表示報文按照指定的動作處理,當target為自定義鏈時,表示報文由自定義鏈中的規則處理
自定義鏈:用來解決多條規則的情況下,方便我們對不用服務的規則進行管理。
自定義鏈並不能直接使用,而是需要被預設鏈引用才能夠使用
建立自定義鏈
使用 -N 選項可以建立自定義鏈。
自定義鏈並不能直接使用,而是需要被預設鏈引用才能夠使用
#範例:建立一個叫做IN_WEB的自定義鏈 [root@CentOS8 ~]# iptables -t filter -N IN_WEB [root@CentOS8 ~]# iptables -vL -t filter Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain IN_WEB (0 references) pkts bytes target prot opt in out source destination #自定義鏈的引用計數為0 (0 references),也就是說,這條自定義鏈還沒有被任何預設鏈所引用,所以,即使IN_WEB中配置了規則,也不會生效
在自定義鏈中配置規則
#範例:實現別的主機不能ping通本機 [root@CentOS8 ~]# iptables -t filter -I IN_WEB -p icmp --icmp-type 8/0 -j REJECT #因為沒有在預設鏈裡面引用自定義規則,所以配置的規則不生效。
引用自定義的規則
[root@CentOS8 ~]# iptables -t filter -I INPUT -j IN_WEB #自定義鏈在哪裡建立,應該被哪條預設鏈引用,取決於實際的工作場景,因為此處示例的規則是匹配入站報文,所以在INPUT鏈中引用自定義鏈 #IN_WEB鏈的引用計數已經變為1,表示這條自定義鏈已經被引用了1次,自定義鏈還可以引用其他的自定義鏈
修改自定義的鏈名
-E”選項可以修改自定義鏈名
刪除自定的鏈
”-X”選項可以刪除自定義鏈,但是刪除自定義鏈時,需要滿足兩個條件:
1、自定義鏈沒有被任何預設鏈引用,即自定義鏈的引用計數為0。
2、自定義鏈中沒有任何規則,即自定義鏈為空。
- 執行緒池底層原理詳解與原始碼分析
- 30分鐘掌握 Webpack
- 線性迴歸大結局(嶺(Ridge)、 Lasso迴歸原理、公式推導),你想要的這裡都有
- 【前端必會】webpack loader 到底是什麼
- 中心化決議管理——雲端分析
- HashMap底層原理及jdk1.8原始碼解讀
- 詳解JS中 call 方法的實現
- 列印 Logger 日誌時,需不需要再封裝一下工具類?
- 初識設計模式 - 代理模式
- 密碼學奇妙之旅、01 CFB密文反饋模式、AES標準、Golang程式碼
- Springboot之 Mybatis 多資料來源實現
- CAS核心思想、底層實現
- 面試突擊86:SpringBoot 事務不回滾?怎麼解決?
- 基於electron vue element構建專案模板之【打包篇】
- MiniWord .NET Word模板引擎,藉由Word模板和資料簡單、快速生成檔案。
- 認識執行緒,初始併發
- 1-VSCode搭建GD32開發環境
- 初識設計模式 - 原型模式
- 執行緒安全問題的產生條件、解決方式
- 2>&1到底是什麼意思?