防火牆管理工具
防火牆作為公網與內網之間的保護屏障,在保障數據的安全性方面起着至關重要的作用。
防火牆策略可以基於流量的源目地址、端口號、協議、應用等信息來定制,然后防火牆使用預先定制的策略規則監控出入的流量,若流量與某一條策略規則相匹配,則執行相應的處理,反之則丟棄。
在Linux系統中其實存在多個防火牆管理工具,旨在方便運維人員管理Linux系統中的防火牆策略,只需要配置妥當其中的一個就足夠。
iptables與firewalld只是用來定義防火牆策略的防火牆管理工具,並不是真正的防火牆。或者說,它們只是一種服務。iptables服務會把配置好的防火牆策略交由內核層面的netfilter網絡過濾器來處理,而firewalld服務則是把配置好的防火牆策略交由內核層面的nftables包過濾框架來處理。
iptables
在早期的Linux系統中(RHEL7之前),默認使用的是iptables防火牆管理服務來配置防火牆。盡管新型的firewalld防火牆管理服務已經被投入使用多年,但是大量的企業在生產環境中依然出於各種原因而繼續使用iptables。iptables在當前生產環境中還具有頑強的生命力。
策略與規則鏈
防火牆會從上至下的順序來讀取配置的策略規則,在找到匹配項后就立即結束匹配工作(即下面的規則不再匹配)並去執行匹配項中定義的行為(即允許或拒絕)。如果在讀取完所有的策略規則之后沒有匹配項,就去執行默認的策略。
防火牆策略規則的設置無非就是兩種:允許或拒絕。
當防火牆的默認策略為拒絕時,就要設置允許規則,否則誰都進不來;
當防火牆的默認策略為允許時,就要設置拒絕規則,否則誰都能進來,防火牆也就失去了防范的作用。
iptables服務把用於處理或過濾流量的策略條目稱之為規則,多條規則可以組成一個規則鏈,而規則鏈則依據數據包處理位置的不同進行分類:
在進行路由選擇前處理數據包(PREROUTING);#SNAT
處理流入的數據包(INPUT);#外網-->內網
處理流出的數據包(OUTPUT);#外網<--內網
處理轉發的數據包(FORWARD);#通過第三方
在進行路由選擇后處理數據包(POSTROUTING)。#DNAT
從內網向外網發送的流量一般都是可控且良性的,因此使用最多的就是INPUT規則鏈(從外網流入內網的流量),該規則鏈可以增大黑客人員從外網入侵內網的難度。
匹配策略規則采取的動作:
ACCEPT(允許):允許流量通過
LOG(登記):允許流量通過,但記錄日志信息
REJECT(拒絕):拒絕流量通過且明確給予拒絕的響應(考試時務必用REJECT,讓系統明確知道流量被拒絕)
DROP(丟棄):拒絕流量通過但不響應
iptables中的基本命令參數
iptables是一款基於命令行的防火牆策略管理工具。
iptables命令可以根據流量的源地址、目的地址、傳輸協議、服務類型等信息進行匹配,一旦匹配成功,iptables就會根據策略規則所預設的動作來處理這些流量。防火牆策略規則的匹配順序是從上至下的,因此要把較為嚴格、優先級較高的策略規則放到前面,以免發生錯誤。
iptables中常用的參數以及作用
參數 | 作用 |
---|---|
-P | 設置默認策略 |
-F | 清空規則鏈 |
-L | 查看規則鏈 |
-A | 在規則鏈的末尾加入新規則 |
-I num | 在規則鏈的頭部加入新規則 |
-D num | 刪除某一條規則 |
-s | 匹配來源地址IP/MASK,加嘆號“!”表示除這個IP外 |
-d | 匹配目標地址 |
-i 網卡名稱 | 匹配從這塊網卡流入的數據 |
-o 網卡名稱 | 匹配從這塊網卡流出的數據 |
-p | 匹配協議,如TCP、UDP、ICMP |
--dport num | 匹配目標端口號 |
--sport num | 匹配來源端口號 |
-j | 采取的動作(ACCEPT、LOG、REJECT、DROP) |
實例:
1 iptables -L #查看已有的防火牆規則鏈
2 iptables -F #清空已有的防火牆規則鏈
3 iptables -L #再次查看防火牆規則鏈,發現之前存在的規則鏈均已被刪除
4 iptables -P INPUT DROP #把INPUT規則鏈的默認策略設置為拒絕,規則鏈的默認拒絕動作只能是DROP,不能是REJECT
5 iptables -L #查看規則鏈,顯示Chain INPUT (policy DROP)
6 iptables -I INPUT -p icmp -j ACCEPT #向INPUT鏈頭部中添加允許ICMP流量進入的策略規則
7 ping -c 4 192.168.10.10 #此時可以ping通,但是其余的ssh什么的是不行的
8 iptables -D INPUT 1 #刪除INPUT規則鏈的第1條規則(即剛剛允許ICMP那條)
9 iptables -P INPUT ACCEPT #把INPUT規則鏈默認策略設置為允許
10 iptables -L #查看規則鏈,顯示Chain INPUT (policy ACCEPT),ping,ssh什么的都允許
11 iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT #將INPUT規則鏈設置為只允許指定網段的主機訪問本機的22端口(必須先指明協議才能指明端口號)
12 iptables -A INPUT -p tcp --dport 22 -j REJECT #向INPUT規則鏈尾部添加拒絕來自所有主機訪問本機22端口的規則(結合上一條規則的效果就是只允許指定網段主機訪問本機22端口,拒絕其他主機訪問)
13 iptables -L #查看已有規則鏈,此時應有2條,一條允許一條拒絕
14 iptables -I INPUT -p tcp --dport 12345 -j REJECT #向INPUT規則鏈中添加拒絕所有人訪問本機12345端口(tcp+udp)的策略規則
15 iptables -I INPUT -p udp --dport 12345 -j REJECT
16 iptables -L
17 iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT #向INPUT規則鏈中添加拒絕192.168.10.5主機訪問本機80端口(Web服務)的策略規則
18 iptables -L
19 iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT #向INPUT規則鏈中添加拒絕所有主機訪問本機1000~1024端口的策略規則
20 iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
21 iptables -L
22 service iptables save #讓配置的防火牆策略永久生效(防火牆規則默認會在系統下一次重啟時失效)
firewalld
RHEL 7系統中集成了多款防火牆管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系統的動態防火牆管理器)服務是默認的防火牆配置管理工具,它擁有基於CLI(命令行界面)和基於GUI(圖形用戶界面)的兩種管理方式。
firewalld支持動態更新技術並加入了區域(zone)的概念。區域就是firewalld預先准備了幾套防火牆策略集合(策略模板),用戶可以根據生產場景的不同而選擇合適的策略集合,從而實現防火牆策略之間的快速切換。
firewalld中常用的區域名稱(默認為public)及策略規則
區域 | 默認規則策略 |
---|---|
trusted | 允許所有的數據包 |
home | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、mdns、ipp-client、amba-client與dhcpv6-client服務相關,則允許流量 |
internal | 等同於home區域 |
work | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、ipp-client與dhcpv6-client服務相關,則允許流量 |
public | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、dhcpv6-client服務相關,則允許流量 |
external | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量 |
dmz | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量 |
block | 拒絕流入的流量,除非與流出的流量相關 |
drop | 拒絕流入的流量,除非與流出的流量相關 |
終端管理工具
firewall-cmd是firewalld防火牆配置管理工具的CLI(命令行界面)版本。它的參數一般都是以“長格式”來提供的。
firewall-cmd命令中使用的參數以及作用
參數 | 作用 |
---|---|
--get-default-zone | 查詢默認的區域名稱 |
--set-default-zone=<區域名稱> | 設置默認的區域,使其永久生效 |
--get-zones | 顯示可用的區域 |
--get-services | 顯示預先定義的服務 |
--get-active-zones | 顯示當前正在使用的區域與網卡名稱 |
--add-source= | 將源自此IP或子網的流量導向指定的區域 |
--remove-source= | 不再將源自此IP或子網的流量導向某個指定區域 |
--add-interface=<網卡名稱> | 將源自該網卡的所有流量都導向某個指定區域 |
--change-interface=<網卡名稱> | 將某個網卡與區域進行關聯 |
--list-all | 顯示當前區域的網卡配置參數、資源、端口以及服務等信息 |
--list-all-zones | 顯示所有區域的網卡配置參數、資源、端口以及服務等信息 |
--add-service=<服務名> | 設置默認區域允許該服務的流量 |
--add-port=<端口號/協議> | 設置默認區域允許該端口的流量 |
--remove-service=<服務名> | 設置默認區域不再允許該服務的流量 |
--remove-port=<端口號/協議> | 設置默認區域不再允許該端口的流量 |
--reload | 讓“永久生效”的配置規則立即生效,並覆蓋當前的配置規則 |
--panic-on | 開啟應急狀況模式 |
--panic-off | 關閉應急狀況模式 |
使用firewalld配置的防火牆策略有兩個模式:
運行時(Runtime)模式:默認的firewall防火牆策略模式,又稱為當前生效模式,策略會隨着系統的重啟會失效。
永久(Permanent)模式:在用firewall-cmd命令正常設置防火牆策略時添加--permanent參數,配置的防火牆策略就可以永久生效。但是,使用永久生效模式設置的策略只有在系統重啟之后才能自動生效。如果想讓永久模式下配置的策略立即生效,需要手動執行firewall-cmd --reload命令。
實例1:firewall防火牆常用配置
1 firewall-cmd --get-default-zone #查看firewalld服務當前所使用的區域(默認應該是public)
2 firewall-cmd --get-zone-of-interface=eno16777728 #查詢eno16777728網卡當前在firewalld服務中的區域(默認也應該是public)
3 firewall-cmd --permanent --zone=external --change-interface=eno16777728 #把firewalld服務中eno16777728網卡的默認區域修改為external,並在系統重啟后永久生效。
4 firewall-cmd --get-zone-of-interface=eno16777728 #查看eno16777728網卡在當前的區域(應該仍為public)
5 firewall-cmd --permanent --get-zone-of-interface=eno16777728 #查看eno16777728網卡在永久模式下的區域(應該為external)
6 firewall-cmd --set-default-zone=public #把firewalld服務的當前默認區域設置為public
7 firewall-cmd --get-default-zone #查看firewall當前默認區域
8 firewall-cmd --panic-on #啟動firewalld防火牆服務的應急狀況模式,阻斷一切網絡連接(當遠程控制服務器時請慎用)
9 firewall-cmd --panic-off #關閉firewall防火牆服務的應急狀況模式
10 firewall-cmd --zone=public --query-service=ssh #查詢public區域當前是否允許SSH服務的流量(查到為yes)
11 firewall-cmd --zone=public --query-service=https #查詢public區域當前是否允許HTTPS服務的流量(查到為no)
12 firewall-cmd --zone=public --add-service=https #設置public區域當前允許請求HTTPS服務的流量通過
13 firewall-cmd --permanent --zone=public --add-service=https #設置piblic區域允許請求HTTPS服務的流量通過,永久生效
14 firewall-cmd --reload #讓firewall服務永久模式下的策略設置立即生效
15 firewall-cmd --permanent --zone=public --remove-service=http #設置public區域禁止HTTP服務的流量通過,永久生效
16 firewall-cmd --reload
17 firewall-cmd --zone=public --add-port=8080-8081/tcp #設置public區域當前訪問8080-8081端口的流量策略設置為允許
18 firewall-cmd --zone=public --list-ports #查看public區域當前允許通過的端口
實例2:把原本訪問本機888端口的流量轉發到22端口,要且求當前和長期均有效。
流量轉發命令格式:firewall-cmd --permanent --zone=<區域> --add-forward-port=port=<源端口號>:proto=<協議>:toport=<目標端口號>:toaddr=<目標IP地址>
1 firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
2 firewall-cmd --reload
在Windows 10系統的cmd命令行窗口中執行ssh -p 888 192.168.10.10 -l root嘗試訪問主機192.168.10.10的888端口,實際上就是訪問該主機的22端口,即ssh服務。
實例3:在firewalld服務中配置一條富規則,使其拒絕192.168.10.0/24網段的所有用戶訪問本機的ssh服務(22端口)。
firewalld中的富規則表示更細致、更詳細的防火牆策略配置,它可以針對系統服務、端口號、源地址和目標地址等諸多信息進行更有針對性的策略配置。它的優先級在所有的防火牆策略中也是最高的。
1 firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
2 firewall-cmd --reload
圖形管理工具
firewall-config是firewalld防火牆配置管理工具的GUI(圖形用戶界面)版本,幾乎可以實現所有以命令行來執行的操作。
標號對應的具體功能:
1.選擇運行時(Runtime)模式或永久(Permanent)模式的配置。
2.可選的策略集合區域列表。
3.常用的系統服務列表。
4.當前正在使用的區域。
5.管理當前被選中區域中的服務。
6.管理當前被選中區域中的端口。
7.開啟或關閉SNAT(源地址轉換協議)技術。
8.設置端口轉發策略。
9.控制請求icmp服務的流量。
10.管理防火牆的富規則。
11.管理網卡設備。
12.被選中區域的服務,若勾選了相應服務前面的復選框,則表示允許與之相關的流量。
13.firewall-config工具的運行狀態。
在使用firewall-config工具配置完防火牆策略之后,無須進行二次確認,因為只要有修改內容,它就自動進行保存。
SNAT(Source Network Address Translation,源網絡地址轉換)技術是一種為了解決IP地址匱乏而設計的技術,它可以使得多個內網中的用戶通過同一個外網IP接入Internet。
沒有使用SNAT技術的網絡:如果網關服務器沒有應用SNAT技術,則互聯網中的網站服務器在收到PC的請求數據包,並回送響應數據包時,將無法在網絡中找到這個私有網絡的IP地址,所以PC也就收不到響應數據包了。
使用了SNAT技術的網絡:由於網關服務器應用了SNAT技術,所以互聯網中的網站服務器會將響應數據包發給網關服務器,再由后者轉發給局域網中的PC。
開啟SNAT:
iptables命令:很麻煩
firewall-cmd:firewall-cmd --permanent --zone=public --add-masquerade
firewall-config:輕而易舉。在圖形界面Masquerading頁簽中勾選Masquerade zone復選框即可。
服務的訪問控制列表
TCP Wrappers是RHEL 7系統中默認啟用的一款流量監控程序,它能夠根據來訪主機的地址與本機的目標服務程序作出允許或拒絕的操作。
Linux系統中其實有兩個層面的防火牆,第一種是基於TCP/IP協議的流量過濾工具,而TCP Wrappers服務則是能允許或禁止Linux系統提供服務的防火牆,從而在更高層面保護了Linux系統的安全運行。
TCP Wrappers服務的防火牆策略由兩個控制列表文件所控制,用戶可以編輯允許控制列表文件來放行對服務的請求流量,也可以編輯拒絕控制列表文件來阻止對服務的請求流量。控制列表文件修改后會立即生效。系統將會先檢查允許控制列表文件(/etc/hosts.allow),如果匹配到相應的允許策略則放行流量;如果沒有匹配,則去進一步匹配拒絕控制列表文件(/etc/hosts.deny),若找到匹配項則拒絕該流量。如果這兩個文件全都沒有匹配到,則默認放行流量。
TCP Wrappers服務的控制列表文件中常用的參數
客戶端類型 | 示例 | 滿足示例的客戶端列表 |
---|---|---|
單一主機 | 192.168.10.10 | IP地址為192.168.10.10的主機 |
指定網段 | 192.168.10. | IP段為192.168.10.0/24的主機 |
指定網段 | 192.168.10.0/255.255.255.0 | IP段為192.168.10.0/24的主機 |
指定DNS后綴 | .linuxprobe.com | 所有DNS后綴為.linuxprobe.com的主機 |
指定主機名稱 | www.linuxprobe.com | 主機名稱為www.linuxprobe.com的主機 |
指定所有客戶端 | ALL | 所有主機全部包括在內 |
在配置TCP Wrappers服務時需要遵循兩個原則:
1.編寫拒絕策略規則時,填寫的是服務名稱,而非協議名稱;
2.建議先編寫拒絕策略規則,再編寫允許策略規則,以便直觀地看到相應的效果。
實例:先編輯/etc/host.deny文件,拒絕訪問本機sshd服務的所有流量;再編輯/etc/hosts.allow文件,允許指定網段訪問本機sshd服務。
1 vim /etc/hosts.deny #編輯/etc/hosts.deny文件
2 sshd:* #禁止所有流量訪問本機sshd服務
3 ssh 192.168.10.10 #嘗試訪問本機sshd服務,發現就算是本機自身也不能訪問本機sshd服務
4 vim /etc/hosts.allow #編輯/etc/hosts.allow文件
5 sshd:192.168.10.0/24 #允許指定網段訪問本機sshd服務
6 ssh 192.168.10.10 #嘗試訪問本機sshd服務,發現可以了
不同的防火牆規則有所沖突時,只要有一個拒絕,即使其他工具是允許,也會被拒絕。