Linux Firewalld 簡明介紹

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

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

在閱讀後,應該掌握以下的概念:linux

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

防火牆中的 Zone

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

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

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

ACCEPT 除了被明確寫好的規則,會接受全部流入的數據包。網絡

REJECT 除了被明確寫好容許的規則,會拒絕全部流入的數據包, 會給發起鏈接的機器回覆被拒絕的消息。ssh

DROP 除了被明確寫好容許的規則,會拒絕全部流入的數據包, 不會給發起鏈接的機器回覆任何消息。tcp

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

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

相關文章
相關標籤/搜索