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