上一篇文章學(xué)習(xí)了用戶及文件相關(guān)權(quán)限,本篇繼續(xù)學(xué)習(xí)防火墻技術(shù)。
防火墻作為公網(wǎng)與內(nèi)網(wǎng)之間的保護(hù)屏障,對系統(tǒng)至關(guān)重要。防火墻又分為硬件防火墻和軟件防火墻,主要功能都是依據(jù)設(shè)置的策略對穿越防火墻的流量進(jìn)行過濾。本篇主要講解Centos7系統(tǒng)自帶的軟件防火墻。
由于在初學(xué)階段為了避免干擾很多時候我們都是直接關(guān)閉防火墻,但在生產(chǎn)環(huán)境這樣做是很不安全的,因此我們需要掌握防火墻的相關(guān)配置方法。
一、Linux防火墻概述
Linux系統(tǒng)包含兩個層面的防火墻,一種是基于TCP/IP的流量過濾工具,另外一種是TCP Wrappers服務(wù)。前者包括iptables、firewalld等防火墻,后者是能允許或禁止Linux系統(tǒng)提供服務(wù)的防火墻,在更高層面保護(hù)系統(tǒng)的安全。
在RHEL7系統(tǒng)中,firewalld取代了之前版本的iptables防火墻,成為默認(rèn)的防火墻。二者有很大區(qū)別,iptables的防火墻策略是交由內(nèi)核層面的netfilter網(wǎng)絡(luò)過濾器來處理的,而firewalld則是交由內(nèi)核層面的nftables包過濾框架來處理。
嚴(yán)格意義上說,iptables和firewalld都不是真正的防火墻,只是用來定義防火墻策略的防火墻管理工具而已,他們都是一種服務(wù)。
防火墻管理工具主要是為了方便運(yùn)維管理人員對防火墻策略進(jìn)行配置和管理,這類工具思路大同小異,只要掌握一個即可,本文主要講解firewalld這款防火墻管理工具。
二、firewalld防火墻管理工具
Centos7中集成了多款防火墻工具,其中默認(rèn)的是firewalld,全稱為:Dynamic Firewall Manager of Linux systems,Linux系統(tǒng)的動態(tài)防火墻管理器。它用于命令行界面CLI或圖形用戶界面GUI兩種管理方式,下文將分別進(jìn)行介紹。
firewalld相比之前傳統(tǒng)的防火墻管理配置工具,它支持動態(tài)更新技術(shù)并加入了區(qū)域(zone)的概念。簡單說就是事先定義幾套防火墻策略模板,用戶根據(jù)實(shí)際場景進(jìn)行選擇,從而實(shí)現(xiàn)策略之間的快速切換。比如設(shè)置好home和work區(qū)域的策略后,在家就選擇home區(qū)域,在公司就選擇work策略,極大提升了防火墻策略的應(yīng)用效率。
firewalld中蟬蛹的區(qū)域名稱和策略規(guī)則如下:
| 區(qū)域 | 默認(rèn)策略規(guī)則 |
|---|---|
| trusted | 運(yùn)行所有的數(shù)據(jù)包 |
| home | 拒絕流入的流量,除非與流出的流量相關(guān)。如果流量與ssh、mdns、ipp-client、amba-client、dhcpv6-client服務(wù)相關(guān)則允許流量 |
| internal | 同home |
| work | 拒絕流入的流量,除非與流出的流量數(shù)相關(guān)。如果流量與 ssh、ipp-client 與 dhcpv6-client 服務(wù)相關(guān),則允許流量 |
| public | 拒絕流入的流量,除非與流出的流量相關(guān)。如果流量與 ssh、dhcpv6-client 服務(wù) 相關(guān),則允許流量 |
| external | 拒絕流入的流量,除非與流出的流量相關(guān);而如果流量與 ssh 服務(wù)相關(guān),則允許流量 |
| dmz | 拒絕流入的流量,除非與流出的流量相關(guān);而如果流量與 ssh 服務(wù)相關(guān),則允許流量 |
| block | 拒絕流入的流量,除非與流出的流量相關(guān) |
| drop | 同block |
2.1 firewall-cmd
firewall-cmd是 firewalld 防火墻配置管理工具的 CLI(命令行界面)版本。它的參數(shù)一般都是以“長格式”來提供的。它的參數(shù)較多,但是由于centos7已經(jīng)支持此命令的參數(shù)補(bǔ)齊了,所以要多用tab鍵。下表列出常用的參數(shù)及作用,更多參數(shù)自行通過man命令進(jìn)行查看。
| 參數(shù) | 作用 |
|---|---|
| --get-default-zone | 查詢默認(rèn)的區(qū)域名稱 |
| --set-default-zone=<區(qū)域名稱> | 設(shè)置默認(rèn)的區(qū)域,使其永久生效 |
| --get-zones | 顯示可用的區(qū)域 |
| --get-active-zones | 顯示當(dāng)前正在使用的區(qū)域與網(wǎng)卡名稱 |
| --get-services | 顯示預(yù)先定義的服務(wù) |
| --add-source= | 將源自此 IP 或子網(wǎng)的流量導(dǎo)向指定的區(qū)域 |
| --remove-source= | 不再將源自此 IP 或子網(wǎng)的流量導(dǎo)向某個指定區(qū)域 |
| --add-interface=<網(wǎng)卡名稱> | 將源自該網(wǎng)卡的所有流量都導(dǎo)向某個指定區(qū)域 |
| --change-interface=<網(wǎng)卡名稱> | 將某個網(wǎng)卡與區(qū)域進(jìn)行關(guān)聯(lián) |
| --list-all | 顯示當(dāng)前區(qū)域的網(wǎng)卡配置參數(shù)、資源、端口以及服務(wù)等信息 |
| --list-all-zones | 顯示所有區(qū)域的網(wǎng)卡配置參數(shù)、資源、端口以及服務(wù)等信息 |
| --add-service=<服務(wù)名> | 設(shè)置默認(rèn)區(qū)域允許該服務(wù)的流量 |
| --add-port=<端口號/協(xié)議> | 設(shè)置默認(rèn)區(qū)域允許該端口的流量 |
| --remove-service=<服務(wù)名> | 設(shè)置默認(rèn)區(qū)域不再允許該服務(wù)的流量 |
| --remove-port=<端口號/協(xié)議> | 設(shè)置默認(rèn)區(qū)域不再允許該端口的流量 |
| --reload | 讓“永久生效”的配置規(guī)則立即生效,并覆蓋當(dāng)前的配置規(guī)則 |
| --panic-on | 開啟應(yīng)急狀況模式 |
| --panic-off | 關(guān)閉應(yīng)急狀況模式 |
使用firewall配置策略有兩種模式:運(yùn)行時模式(runtime)、永久模式(permanent)。運(yùn)行時模式又稱為當(dāng)前生效模式,而且隨著系統(tǒng)的重啟會失效,它是默認(rèn)的模式。而如果需要配置永久生效,就需要添加--permanent 參數(shù)。
主要注意的是永久模式配置的策略只有重啟之后才能自動生效,如果想讓配置的策略立即生效,需要手動執(zhí)行firewall-cmd --reload 命令。
2.1.1 防火墻狀態(tài)管理
如果安裝本系列教程逐步操作的話,系統(tǒng)以及是默認(rèn)安裝了firewalld服務(wù),如果你用的是其他系統(tǒng)或未安裝firewalld服務(wù),可以通過命令自行安裝即可。安裝命令:yum install firewalld firewall-config
- 查看防火墻狀態(tài)
[root@heimatengyun ~]# firewall-cmd --state
running
[root@heimatengyun ~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Sat 2019-12-21 21:26:53 CST; 1h 31min ago
Main PID: 915 (firewalld)
CGroup: /system.slice/firewalld.service
└─915 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Dec 21 21:26:53 heimatengyun systemd[1]: Started firewalld - dynamic firewal....
Hint: Some lines were ellipsized, use -l to show in full.
可以使用firewall-cmd --state 或systemctl status firewalld查看防火墻狀態(tài)。
- 重啟防火墻服務(wù)
[root@heimatengyun ~]# systemctl restart firewalld.service
注意等同于systemctl restart firewalld,可以省略服務(wù)后綴名。
- 停止防火墻服務(wù)
[root@heimatengyun ~]# systemctl stop firewalld
[root@heimatengyun ~]# firewall-cmd --state
not running
- 啟動防火墻服務(wù)
[root@heimatengyun ~]# systemctl start firewalld
[root@heimatengyun ~]# firewall-cmd --state
running
2.1.2 防火墻配置文件
配置文件說明:firewalld 存放配置文件有兩個目錄,/usr/lib/firewalld/和/etc/firewalld/。前者存放了一些默認(rèn)的文件,后者主要是存放用戶自定義的數(shù)據(jù),所以我們添加的service或者rule都在后者下面進(jìn)行。
[root@heimatengyun ~]# ls /usr/lib/firewalld/
icmptypes services zones
[root@heimatengyun ~]# ls /etc/firewalld/
firewalld.conf icmptypes lockdown-whitelist.xml services zones
server:存儲服務(wù)數(shù)據(jù),就是一組定義好的規(guī)則。
zones:存儲區(qū)域規(guī)則。
firewalld.conf:默認(rèn)配置文件,可以設(shè)置默認(rèn)使用的區(qū)域,默認(rèn)區(qū)域為 public,對應(yīng) zones目錄下的public.xml。
2.1.3 常用配置命令及案例
- 查看當(dāng)前使用的區(qū)域
[root@heimatengyun ~]# firewall-cmd --get-default-zone
public
- 查看當(dāng)前使用的區(qū)域是否允許請求ssh和https協(xié)議的流量
[root@heimatengyun ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@heimatengyun ~]# firewall-cmd --zone=public --query-service=https
no
- 設(shè)置https協(xié)議流量為永久允許并立即生效
[root@heimatengyun ~]# firewall-cmd --zone=public --add-service=https
success
[root@heimatengyun ~]# firewall-cmd --zone=public --query-service=https
yes
[root@heimatengyun ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@heimatengyun ~]# firewall-cmd --reload
success
- 允許8080和8081端口流量,僅限當(dāng)前生效
[root@heimatengyun ~]# firewall-cmd --zone=public --list-ports
[root@heimatengyun ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@heimatengyun ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
2.2 firewall-config
firewall-config是 firewalld 防火墻配置管理工具的 GUI(圖形用戶界面)版本,幾 乎可以實(shí)現(xiàn)所有以命令行來執(zhí)行的操作。即使沒有扎實(shí)的 Linux 命令基 礎(chǔ),也完全可以通過它來妥善配置 RHEL 7 中的防火墻策略。
2.2.1 主界面
輸入命令后,將打開主界面
[root@heimatengyun ~]# firewall-config

頂部的Configuration對應(yīng)選擇是運(yùn)行模式還是永久模式。
左邊Zones選項卡對應(yīng)的是不同的區(qū)域。
2.2.2 配置案例
在使用 firewall-config 工具配置完防火墻策略之后,無須進(jìn)行二次確認(rèn),因為只要有修改內(nèi)容,它就自動進(jìn)行保存。
- 配置允許當(dāng)前區(qū)域中http服務(wù)流量且僅限當(dāng)前有效

- 試添加一條防火墻策略規(guī)則,使其放行訪問 8080~8088 端口(TCP 協(xié)議)的流量, 并將其設(shè)置為永久生效

添加規(guī)則后,還需要reload讓配置的策略立即生效。

三、TCP Wrappers服務(wù)
TCP Wrappers是RHEL7系統(tǒng)中默認(rèn)啟用的一款流量監(jiān)控程序,它能夠根據(jù)來訪主機(jī)的地址與本機(jī)的目標(biāo)服務(wù)程序作出允許或拒絕的操作。
前文已提到firewalld是基于TCP/IP 協(xié)議的流量過濾工具,而 TCP Wrappers 服務(wù)則是能允許或 禁止 Linux 系統(tǒng)提供服務(wù)的防火墻,從而在更高層面保護(hù)了 Linux 系統(tǒng)的安全運(yùn)行。
TCP Wrappers 服務(wù)的防火墻策略由兩個控制列表文件所控制,用戶可以編輯允許控制列表文 件來放行對服務(wù)的請求流量,也可以編輯拒絕控制列表文件來阻止對服務(wù)的請求流量。
控制列表 文件修改后會立即生效,系統(tǒng)將會先檢查允許控制列表文件(/etc/hosts.allow),如果匹配到相應(yīng) 的允許策略則放行流量;如果沒有匹配,則去進(jìn)一步匹配拒絕控制列表文件(/etc/hosts.deny),若 找到匹配項則拒絕該流量。如果這兩個文件全都沒有匹配到,則默認(rèn)放行流量。
3.1 配置原則
編寫拒絕策略規(guī)則時,填寫的是服務(wù)名稱,而非協(xié)議名稱;
建議先編寫拒絕策略規(guī)則,再編寫允許策略規(guī)則。
3.2 常用配置參數(shù)
TCP Wrappers服務(wù)的控制列表文件中常用的參數(shù)如下表:
| 客戶端類型 | 示例 | 滿足條件的客戶端列表 |
|---|---|---|
| 單一主機(jī) | 192.168.1.1 | ip地址為192.168.1.1的主機(jī) |
| 指定網(wǎng)段 | 192.168.1. | ip段為192.168.1.0/24的主機(jī) |
| 指定網(wǎng)段 | 192.168.10.0/255.255.255.0 | IP 段為 192.168.10.0/24 的主機(jī) |
| 指定 DNS 后綴 | .heimatengyun.com | 所有后綴為.heimatengyun.com的主機(jī) |
| 指定主機(jī)名稱 | www.heimatengyun.com | 主機(jī)名稱為www.heimatengyun.com的主機(jī) |
| 指定所有客戶端 | ALL或* | 所有主機(jī)全部包括在內(nèi) |
3.3 案例
- 配置指定ip能遠(yuǎn)程登錄到服務(wù)器
編輯hosts.deny文件
[root@heimatengyun ~]# vi /etc/hosts.deny
添加:sshd:* 保存并退出。
此時退出遠(yuǎn)程連接工具,再次遠(yuǎn)程連接,將無法連接進(jìn)去。
直接登錄虛擬機(jī),并編輯/etc/hosts.allow文件,允許本地電腦的ip能遠(yuǎn)程連接服務(wù)器。
[root@heimatengyun ~]# vi /etc/hosts.allow
添加:sshd:192.168.78. 保存并退出
注意此處的192.168.78. 為你將訪問linux的ip地址,根據(jù)實(shí)際情況進(jìn)行設(shè)置。本文演示的環(huán)境中取的是VMnet8的ip地址,而不是宿主機(jī)的ip。
然后再次用遠(yuǎn)程連接工具,發(fā)現(xiàn)可以連接上了。