如何在 CentOS 8 上使用 FirewallD 設(shè)置防火墻?
我是一個(gè) CentOS Enterprise Linux 8 系統(tǒng)管理員。如何在 CentOS8 上使用 FirwallD 設(shè)置防火墻?
簡介
一個(gè) Linux 防火墻可用于保護(hù)您的工作站或服務(wù)器免受不需要的流量干擾。您可以設(shè)置規(guī)則來阻止或允許流量通過。CentOS 8 帶有一個(gè)動(dòng)態(tài)的、可定制的基于主機(jī)的防火墻和一個(gè) D-Bus 接口。您可以添加、刪除或更新防火墻的規(guī)則,而無需重新啟動(dòng)防火墻守護(hù)程序或服務(wù)。??firewall-cmd?
? 充當(dāng)著 ??nftables?
? 的前端。在 CentOS 8 中,??nftables?
? 取代了 ??iptables?
? 作為默認(rèn)的 Linux 網(wǎng)絡(luò)包過濾框架。本頁展示了如何為您的 CentOS 8 設(shè)置防火墻,和如何在 ??firewall-cmd?
? 工具的幫助下進(jìn)行管理。
FirewallD 的基本概念
??firewalld?
? 簡化了網(wǎng)絡(luò)流量管理的概念。當(dāng)談到 CentOS 8 上的 ??firewalld?
? 時(shí),我們有以下兩個(gè)主要的概念。
1. 區(qū)域
Firewalld 區(qū)域(Zone)只不過是預(yù)定義的規(guī)則集。您可以通過運(yùn)行以下 ls 命令查看所有區(qū)域:
$ ls -l /usr/lib/firewalld/zones/
使用 ??cat?
? 命令查看 ??public?
? 區(qū)域:
$ cat /usr/lib/firewalld/zones/public.xml
了解預(yù)定義區(qū)域
block
:所有傳入的網(wǎng)絡(luò)連接都被拒絕。只可以從系統(tǒng)內(nèi)部發(fā)起網(wǎng)絡(luò)連接。dmz
:經(jīng)典的非軍事區(qū) (DMZ) 區(qū)域,提供對(duì) LAN 的有限訪問,并且只允許指定的傳入端口。drop
:丟棄所有傳入的網(wǎng)絡(luò)連接,只允許傳出的網(wǎng)絡(luò)連接。external
:對(duì)于路由器類型的連接很有用。您還需要 LAN 和 WAN 接口才能使偽裝 NAT 正常工作。home
:適用于您信任其他計(jì)算機(jī)的 LAN 中的家用計(jì)算機(jī),例如筆記本電腦和臺(tái)式機(jī)。僅允許指定的 TCP/IP 端口。internal
:用于內(nèi)部網(wǎng)絡(luò),當(dāng)您非常信任 LAN 上的其他服務(wù)器或計(jì)算機(jī)時(shí)適用。public
:您不信任網(wǎng)絡(luò)上的任何其他計(jì)算機(jī)和服務(wù)器。您只允許所需的端口和服務(wù)。對(duì)于托管在您所在地的云服務(wù)器或服務(wù)器,請始終使用公共區(qū)域。trusted
:接受所有網(wǎng)絡(luò)連接。我不建議將此區(qū)域用于連接到 WAN 的專用服務(wù)器或虛擬機(jī)。work
:用于您比較信任的同事和其他服務(wù)器的工作場所。
運(yùn)行以下命令以查看 CentOS 8 上的所有區(qū)域:
$ firewall-cmd --get-zones
如何找出您的默認(rèn)區(qū)域
可以將網(wǎng)絡(luò)接口和源分配給區(qū)域。這些區(qū)域中的一員可被設(shè)置為默認(rèn)區(qū)域。以下命令可以讓您的默認(rèn)區(qū)域運(yùn)行:
$ firewall-cmd --get-default-zone
要查看您的網(wǎng)絡(luò)接口名稱,請運(yùn)行 ??ip?
? 命令或 ??nmcli?
? 命令:
$ ip link show
$ nmcli device status
當(dāng)向 NetworkManager 添加新的接口連接(例如 ??eth0?
? 或 ??ens3?
?)時(shí),它們將被附加到默認(rèn)區(qū)域。通過運(yùn)行以下命令進(jìn)行驗(yàn)證:
$ firewall-cmd --get-active-zones
服務(wù)
服務(wù)不過是本地端口、協(xié)議、源端口、目標(biāo)端口和防火墻幫助模塊的列表。舉些例子:
- 端口:443、25 或 110
- 服務(wù):SSH、HTTP
- 協(xié)議:ICMP
如何查看與公共(public)區(qū)域相關(guān)的防火墻規(guī)則或服務(wù)
運(yùn)行
$ sudo firewall-cmd --list-all
或者
$ sudo firewall-cmd --list-all --zone=public
上面的命令表明我的默認(rèn)區(qū)域是 ??public?
?,并且我允許傳入 SSH 連接(端口 22)、??dhcpv6-client?
? 和 CentOS 8/RHEL 8 上的 ??cockpit?
? 服務(wù)端口。所有其他流量默認(rèn)被丟棄。如果我在 CentOS 8 上配置 Apache 或 Nginx,則我需要使用 ??firewall-cmd?
? 打開 80/443 端口。假設(shè)您不想要 ??cockpit?
? 或 ??dhcpv6-client?
? 等不必要的服務(wù),您可以通過修改規(guī)則來刪除它們。例如,刪除服務(wù) ??dhcpv6-client?
? 和 ??cockpit?
?:
$ sudo firewall-cmd --remove-service=cockpit --permanent
$ sudo firewall-cmd --remove-service=dhcpv6-client --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-services
如何查看當(dāng)前區(qū)域允許的服務(wù)
$ sudo firewall-cmd --list-services
或者
$ sudo firewall-cmd --list-services --zone=public
$ sudo firewall-cmd --list-services --zone=home
或使用 ??bash?
? 的 ??for?
? 循環(huán),如下所示:
## or just use 'sudo firewall-cmd --list-all-zones' ##
for z in $(firewall-cmd --get-zones)
do
echo "Services allowed in $z zone: $(sudo firewall-cmd --list-services --zone=$z)"
done
如何在 CentOS 8 上啟動(dòng)、停止、重啟 firewalld 服務(wù)
到目前為止,您已經(jīng)了解了 ??firewalld?
? 區(qū)域、服務(wù)以及如何查看默認(rèn)值。是時(shí)候在 CentOS 8 Linux 機(jī)器上激活和配置我們的防火墻了。
啟動(dòng)并啟用 ??firewalld?
?
$ sudo systemctl start firewalld
$ sudo systemctl enable firewalld
停止并禁用 ??firewalld?
?
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
檢查 ??firewalld?
? 狀態(tài)
$ sudo firewall-cmd --state
更改規(guī)則時(shí)重新加載 ??firewalld?
? 配置的命令
$ sudo firewall-cmd --reload
獲取 ??firewalld?
? 服務(wù)的狀態(tài)
$ sudo systemctl status firewalld
了解運(yùn)行時(shí)和永久性防火墻規(guī)則集
運(yùn)行時(shí)更改 ??firewalld?
? 的配置是臨時(shí)的。當(dāng)您重新啟動(dòng) CetnOS 8 服務(wù)器時(shí),這些配置就消失了。例如,以下命令將臨時(shí)為 Nginx/Apache Web 服務(wù)器打開 80/443(https)TCP 端口 :
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https
當(dāng)您重新啟動(dòng) Linux 機(jī)器或重新啟動(dòng)防火墻服務(wù)本身時(shí),上述規(guī)則不會(huì)保留。
如何將規(guī)則添加到永久的規(guī)則集中,并重新加載 ??firewalld?
?
讓我們永久添加規(guī)則(HTTPS/443 和 HTTP/80)并重新加載 firewalld:
$ sudo firewall-cmd --zone=public --add-service=http --permanent
$ sudo firewall-cmd --zone=public --add-service=https --permanent
$ sudo firewall-cmd --reload
驗(yàn)證
$ sudo firewall-cmd --list-services
$ sudo firewall-cmd --list-services --permanent
Firewalld 的運(yùn)行時(shí)與永久性規(guī)則集示例
如何查找 firewalld 支持的服務(wù)列表
在您的系統(tǒng)上,語法如下:
$ sudo firewall-cmd --get-services
$ sudo firewall-cmd --get-services | grep mysql
$ ls -l /usr/lib/firewalld/services/
$ cat /usr/lib/firewalld/services/ssh.xml
用 firewalld 獲取可從規(guī)則集中添加或刪除的服務(wù)列表
Firewalld 規(guī)則集示例
讓我們看看默認(rèn)區(qū)域的一些常見的 ??firewalld?
? 示例。
如何將服務(wù)添加到您的區(qū)域
添加 dns 服務(wù)(TCP/UDP 53 端口):
sudo firewall-cmd --zone=public --add-service=dns --permanent
如何從您的區(qū)域中移除(刪除)服務(wù)
刪除 vnc 服務(wù)器服務(wù)(TCP 端口范圍 5900-5903):
sudo firewall-cmd --zone=public --remove-service=vnc-server --permanent
如何允許/打開 TCP/UDP 端口/協(xié)議
打開 TCP 端口 # 9009 :
sudo firewall-cmd --zone=public --add-port=9009/tcp --permanent
要查看添加的端口,請運(yùn)行:
$ sudo firewall-cmd --zone=internal --list-ports
如何拒絕/阻止 TCP/UDP 端口/協(xié)議
打開 TCP 端口 # 23:
sudo firewall-cmd --zone=public --remove-port=23/tcp --permanent
如何編寫端口轉(zhuǎn)發(fā) ??firewalld?
? 規(guī)則
在同一臺(tái)服務(wù)器上將 443 TCP 端口轉(zhuǎn)發(fā)到 8080:
$ sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
要?jiǎng)h除上述的端口轉(zhuǎn)發(fā),請運(yùn)行
$ sudo firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
如果您需要將流量(端口 443)轉(zhuǎn)發(fā)到托管在 192.168.2.42 的 lxd 服務(wù)器/容器的 443 端口,請開啟偽裝:
$ sudo firewall-cmd --zone=public --add-masquerade
$ sudo firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.2.42 --permanent
要?jiǎng)h除上述偽裝規(guī)則,請運(yùn)行
$ sudo firewall-cmd --zone=public --remove-masquerade
$ firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.2.42 --permanent
像往常一樣使用以下命令列出規(guī)則:
$ firewall-cmd --zone=public --list-all --permanent
Rich 規(guī)則示例
假設(shè)您只想允許從 10.8.0.8 IP 地址訪問 SSH 端口 22,請運(yùn)行:
sudo firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="10.8.0.8" port port=22 protocol=tcp accept'
要驗(yàn)證新規(guī)則,請運(yùn)行:
$ sudo firewall-cmd --list-rich-rules --permanent
在以下示例中,允許 192.168.1.0/24 子網(wǎng)訪問 tcp 端口 11211:
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.1.0/24"
port protocol="tcp" port="11211" accept'
再次驗(yàn)證它:
$ sudo firewall-cmd --list-rich-rules --permanent
輸出示例:
rule family="ipv4" source address="10.8.0.8" port port="22" protocol="tcp" accept
rule family="ipv4" source address="192.168.1.0/24" port port="11211" protocol="tcp" accept
您可以按照如下所示刪除 rich 規(guī)則:
$ sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="10.8.0.8" port port=22 protocol=tcp accept' --permanent
$ sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" port port="11211" protocol="tcp" accept' --permanent
結(jié)論
您已經(jīng)了解了 firewalld 的基本概念和 CentOS 8 服務(wù)器的一些常見示例。有關(guān)更多信息,請參閱的官方(https://firewalld.org/documentation/)??firewalld?
? 文檔。