Linux Firewalld 簡明介紹


防火牆作為保護服務器不受外部網絡流量影響的一種方式。可以讓用戶定義一系列規則來控制外部網絡中流入的流量,從而達到允許或阻塞的效果。firewalld 是防火牆服務的一個守護程序,實現了動態修改擁有 D-Bus 接口基於主機的防火牆,也就是說在不需要重啟防火牆程序的基礎上,就可以實現對防火牆規則,增、刪、改的操作。

firewalld 提供了域(Zone)和服務(Services)的概念,來簡化流量的管理操作。在本篇文章中,會依次介紹這些概念,並記錄一些常見防火牆的操作方法。

在閱讀后,應該掌握如下的概念:

  • 理解 Zone 概念,熟悉 Zone 中不同的 target 行為
  • 理解 services 概念,明白和直接操作端口之間的區別
  • 常見操作防火牆的方法

防火牆中的 Zone

其實 Zone 就是為了方便預先定義好的一組規則,讓用戶根據當前服務器所在網絡中的位置(內網,公網)的受信任程度來選取不同 Zone 默認規則。但需要注意的是,一個網絡連接只能被一個 zone 處理,但一個 zone 可以用於多個網絡連接。

預先定義的 zone 規則被放在 /usr/lib/firewalld/zones/ 目錄下。當修改 zone 的規則時,這些 zone 會被拷貝到 /etc/firewalld/zones/ 目錄下,實際生效的防火牆會在該目錄下的文件。

對於每一個 zone 都有一個默認的行為(target),來處理流入的流量。每個 target 會有四個選項:default, ACCEPT, REJECTDROP.

ACCEPT 除了被明確寫好的規則,會接受所有流入的數據包。

REJECT 除了被明確寫好允許的規則,會拒絕所有流入的數據包, 會給發起連接的機器回復被拒絕的消息。

DROP 除了被明確寫好允許的規則,會拒絕所有流入的數據包, 不會給發起連接的機器回復任何消息。

下面是對常見 Zone 的一些描述:

Zone 名稱 Zone 描述
block 所有進入的網絡連接都會被拒絕。對於 IPV4,回復 icmp-host-prohibited 消息。對於 IPV6,回復 icmp6-adm-prohibited 消息。只有由內部發起的網絡連接可以通行。
dmz 對於在非軍事區域的服務器,外部網絡可以在受限制的情況下進入內網,只有特定的網絡連接請求被接受。
drop 所有的進入的網絡包都會被丟掉,並且沒有任何的回應。只有向發起的連接請求可以被放行。
external 用於開始偽裝的外部網絡,特別是作為路由器。任務外部的網絡會損壞你的計算機,只有特定的網絡連接請求被接受。
home 在家使用,信任網絡上的大多數計算機。只有特定的網絡連接請求被接受。
internal 在內部網絡使用,信任當前網絡下其他的計算機。只有特定的網絡連接請求被接受。
public 在公共網絡使用,不信任網絡上的其他計算機。只有特定的網絡連接請求被接受。
trusted 所有的網絡連接都會被接受。
work 在工作網絡中使用,信任網絡上的其他計算機。只有特定的網絡連接請求被接受。

簡單看一下配置的具體內容,把上面 target 和 zone 的概念聯在一起:

target 表示當發來的數據包,沒有匹配到任何的規則(比如端口號,服務等),采取的默認行為。

short 表示對 zone 的一個簡短描述名字。

description 表示對 zone 的一段詳細描述。

有關 zone 的操作

# 獲取默認域
(base) [root@localhost zones]# firewall-cmd --get-default-zone
public

# 查詢存在的所有域
(base) [root@localhost zones]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

# 設置默認域
(base) [root@localhost zones]# firewall-cmd --set-default-zone=public 

# 查詢某個域下的配置
(base) [root@localhost zones]# firewall-cmd --zone=public --list-all

# 查詢指定網卡的域
(base) [root@localhost zones]# firewall-cmd --get-zone-of-interface=ens192
public

# 為某個網卡指定域
(base) [root@localhost zones]# firewall-cmd --zone=public --add-interface=ens33

# 修改網卡的域
(base) [root@localhost zones]# firewall-cmd --zone=block --change-interface=ens37

# 刪除指定網卡的域
(base) [root@localhost zones]# firewall-cmd --zone=block --remove-interface=ens37

# 查詢系統中正在使用的域
firewall-cmd --get-active-zones

關於預定義 Services 的概念

Services 在網絡通信時,需要使用一個或者多個端口,地址。防火牆會基於端口來對通信的內容進行過濾。如果一個服務想要允許網絡的流量進入,必須打開端口。firewalld 會默認的阻斷所有未被顯式打開的端口。換成自己的理解來說,在服務器提供的一些服務,常常需要打開很多端口,並且會限制一些源和目的 IP 甚至一些協議的訪問,如果把這些同時都定義在 zone 中,會造成最后的 zone 配置文件很大,提取成 services 相當於是解耦的概念,有利於后期的維護。

和 zone 類似,在 /usr/lib/firewalld/services/ 目錄中存放着一些默認的 services 配置,在 services 被修改或者添加時,這里的文件會被作為參考。目前正被使用的 services 配置會在 /etc/firewalld/services/ 目錄。

# 查看正在使用的服務:
(base) [root@localhost firewalld]# firewall-cmd --list-services
ssh dhcpv6-client http https

# 查看服務的被使用情況,可以看到 zone 文件中引入了 services:
(base) [root@localhost firewalld]# cat zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <service name="http"/>
  <service name="https"/>
  <port protocol="tcp" port="8080"/>
  <port protocol="tcp" port="3306"/>
</zone>

# 使用 service:
firewall-cmd --add-service=http --permanent

# 查看預先定義的 services:
firewall-cmd --get-services

# 增加一個空 services:
firewall-cmd  --permanent --new-service=service-name.xml

# 增加和某個 services 相同的配置:
firewall-cmd --permanent  --new-service-from-file=/etc/firewalld/services/service-name.xml --name service-name1.xml

# 修改 services 配置:
firewall-cmd --permanent --service=myservice --set-description=description
firewall-cmd --permanent --service=myservice --set-short=description
firewall-cmd --permanent --service=myservice --add-port=portid[-portid]/protocol
firewall-cmd --permanent --service=myservice --add-protocol=protocol
firewall-cmd --permanent --service=myservice --add-source-port=portid[-portid]/protocol
firewall-cmd --permanent --service=myservice --add-module=module
firewall-cmd --permanent --service=myservice --set-destination=ipv:address[/mask]

打開端口的方式,除了使用上面的 services ,也可以使用 port 直接添加:

# 端口操作,直接在 zone 的級別進行更改
# 查看並沒有 http 端口
sudo firewall-cmd --list-ports

# 增加 80 端口
sudo firewall-cmd --add-port=80/tcp

# 永久增加 80 端口
firewall-cmd  --add-port=80/tcp --permanent

# 刪除端口
firewall-cmd --zone=public --remove-port=8080/tcp

# 將修改后的某些配置持久化保存:
firewall-cmd --runtime-to-permanent

# 其他查詢端口的一些方式
netstat -ap | grep 8080
lsof -i:6800

# centos 7
ss -ant

# centos 7 before
netstat -ant

常見防火牆的操作

防火牆的運行相關操作:

# 查詢防火牆狀態
systemctl status firewalld

# 打開防火牆
systemctl start firewalld

# 在修改配置后,重載防火牆
firewall-cmd --reload

# 添加直接規則,例如 Keepalived。這里需要注意的是,當使用 zone 和 services 都無法滿足要求時,再采用直接添加的方案。
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface ens192 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens192 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

# 查詢配置的規則
firewall-cmd --direct --get-all-chains
firewall-cmd --direct --get-all-rules

遇到緊急情況的操作:

# 在遇到服務器正在被攻擊時,切斷所有網絡連接
firewall-cmd --panic-on

# 恢復至正常的防火牆設置
firewall-cmd --panic-off

# 查詢  panic mode 是否開啟
firewall-cmd --query-panic

參考

redhat-add-service

firewalld-zone

FirewallD-概述

firewalld-add-service


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM