管理網絡安全
linux內核中包含netfilter,它是網絡流量操作(數據包過濾、網絡地址轉換和端口轉換)的框架。它是RHEL防火牆的主要組件。
Linux內核中還包含nftables,這是一個心得過濾器和數據包分裂子系統,它增強了netfilter的部分代碼,但保留了netfilter的架構。
firewalld 是RHEL7 和RHEL8推薦使用的防火牆前端。它是一個動態防火牆管理器,是nftables框架的前端(使用NFT命令)。使用nft來管理防火牆規則集。
firewalld會檢查進入系統的每個數據包的源地址。
Firewalld區域默認配置
區域名稱 | 默認配置 |
---|---|
trusted | 允許所有傳入流量 |
home | 除非與傳出流量相關,或與ssh、mdns、ipp-client、samba-client或dhcpv6-client預定義服務匹配,否則拒絕傳入流量。 |
內部 | 除非與傳出流量相關,或與ssh、mdns、ipp-client、samba-client或dhcpv6-client預定義服務匹配,否則拒絕傳入流量。 (一開始與/home區域相同)。 |
work | 除非與傳出流量相關,或與ssh、ipp-client或dhcpv6-client預定義服務匹配,否則拒絕傳入流量。 |
公共 | 除非與傳出流量相關,或與ssh或dhcpv6-client預定義服務匹配,否則拒絕傳入流量。新添加的網絡接口的默認區域。 |
external | 除非與傳出流量相關,或與ssh預定義服務匹配。否則拒絕傳入流量。通過此區域轉發的IPIV傳出流量將進行僞裝使其看起來像是來自傳出網絡接口的IPv4地址。 |
dmz | 除非與傳出流量相關,或與ssh預定義服務匹配,否則拒絕傳入流量。 |
block | 除非與傳出流量相關。否則拒絕所有傳入流量。 |
drop | 除非與傳出流量相關,否則丟棄所有傳入流量(甚至不產生包含ICMP錯誤的響應)。 |
Firewalld上有一些預定義服務。這些服務可以幫助我們識別需要配置的特定網絡服務。
預定義Firewalld服務節選
服務名稱 | 配置 |
SSH | 本地SSH服務器。到22/tcp的流量 |
dhcpv6-client |
本地DHCPv6客戶端。到fe80::/64 IPv6網絡中546/udp的流量 |
ipp-client | 本地IPP打印。到631/udp的流量。 |
samba-client | 本地windows文件和打印共享客戶端。到137/udp和138/udp的流量。 |
MDNS | 多播DNS(mDNS)本地鏈路名稱解析。到5353/udp指向224.0.0.251(IPv4)或ff02::fb(IPv6)多播地址的流量。 |
firewalld-cmd --get-services 列出這些預定義服務
從命令行配置防火牆
常用firewall-cmd命令及其說明
FIREWALL-CMD命令 | 說明 |
--get-default-zone | 查詢當前默認區域 |
--set-default-zone=ZONE | 設置默認區域。此命令會同時更改運行時配置和永久配置。 |
--get-zones | 列出所有可用區域 |
--get-active-zones | 列出當前正在使用的所有區域(具有關聯的接口或源)及其接口和源信息。 |
--add-source=CIDR[--zone=ZONE] | 將來自IP地址或網絡/子網掩碼的所有流量路由到指定區域。如果未提供--zone=選項,則使用默認區域。 |
--remove-source=CIDR[--zone=ZONE] | 從區域中刪除用於路由來自IP地址或網絡/子網掩碼的所有流量的規則。如果未提供--zone=選項,則使用默認的區域。 |
--add-interface=INTERFACE [--zone=ZONE] | 將來自INTERFACE的所有流量路由到指定區域。如果未提供--zone=選項,則使用默認區域。 |
--change-interface=INTERFACE [--zone=ZONE] | 列出ZONE的所有已配置接口、源、服務和端口。如果未提供--zone=選項,則使用默認區域。 |
--list-all [--zone=ZONE] | 列出ZONE的所有已配置接口、源、服務和端口。如果未提供--zone=選項,則使用默認區域。 |
--list-all-zones | 檢索所有區域的所有信息(接口、源、端口、服務)。 |
--add-service=SERVICE [--zone=ZONE] | 允許到SERVICE的流量。如果未提供--zone=選項,則使用默認區域。 |
--add-port=PORt/PROTOCOL [--zone=ZONE] | 允許到PORT/PROTOCOL端口的流量。如果未提供--zone=選項,則使用默認區域。 |
--remove-service=SERVICE [--zone=ZONE] | 從區域的運行列表中刪除SERVICE。如果未提供--zone=選項,則使用默認區域。 |
--remove-port=PORT/PROTOCOL[--zone=ZONE] | 從區域的允許列表中刪除PORT/PROTOCOL端口。如果未提供--zone=選項,則使用默認區域。 |
--reload | 丟棄運行時配置並應用持久配置。 |
示例: 將默認區域設置爲dmz,將來自192.168.0.0/24網絡的所有流量都分配給internal區域,並在internal區域上打開用於mysql服務的網絡端口。
root權限運行一下命令:
- firewall-cmd --set-default-zone=dmz
- firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
- firewall-cmd --permanent --zone=internal --add-service=mysql
- firewall-cmd --reload
控制selinux端口標記
selinux不僅是進行文件和進程標記。selinu策略還嚴格控制網絡流量量。
SElinux用來控制網絡流量的其中一種方法是標記網絡端口,例如:端口22/TCP具有標籤ssh_port_t與其相關聯。默認HTTP端口80/TCP和443/TCP具有標籤http_port_t與其相關聯。
semanage port -l 命令獲取所有當前端口標籤分配的概述。示例:
優化搜索,請使用grep命令:
一個端口標籤可能會出現兩次,一次針對TCP,一次針對UDP。
semanage命令可以分配新端口標籤、刪除端口標籤或修改現有端口標籤。向現有端口標籤中添加端口,使用-a 添加新端口標籤,-t表示類型,-p表示協議。
示例: semanage port -a port_label -p tcp|udp PORTNUMBER
運行gopher服務偵聽端口71/TCP: semanage port -a -t gopher_port_t -p tcp 71
查看對默認策略的本地更改: semanage port -l -c
刪除端口標籤,與添加端口標籤的語法相同,使用-d選項。示例:
刪除端口71/TCP 與gopher_port_t的綁定:
semanage port -d -t gopher_port_t -p tcp 71
修改端口綁定,使用-m選項,示例:
semanage port -m -t http_port_t -p tcp 71
上面的命令將端口71/TCP從gopher_port_t修改爲http_port_t,需root權限。