Linux 防火牆

語言: CN / TW / HK

基礎知識

安全技術:

  • 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、自定義鏈中沒有任何規則,即自定義鏈為空。