Linux firewalld防火牆學習總結

授客發表於2024-08-27

實踐環境

CentOS-7-x86_64-DVD-2009

簡介

Firewalld是一種簡單的、有狀態的、基於區域(zone-based)的防火牆。策略和區域用於組織防火牆規則。網路在邏輯上被劃分為多個區域,它們之間的流量可以透過策略進行管理。

檢視防火牆狀態

# service firewalld status

或者

# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

說明:如果輸出顯示 Active: inactive (dead),則表示未開啟防火牆。 如果現實Active: active (running)則表示開啟了防火牆。

或者

# firewall-cmd --state
not running

開啟防火牆

# service firewalld start

或者

# systemctl start firewalld

重啟防火牆

# service firewalld restart

或者

# systemctl restart firewalld

設定防火牆開機自啟

# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.

禁用防火牆開機自啟

# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

檢視預定義區域

# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# #檢視每個區域的詳細資訊
# firewall-cmd --list-all-zones

區域簡介:

區域 預設規則
block 拒絕流入的流量,除非與流出的流量相關
dmz 拒絕流入的流量,除非與流出的流量相關;如果流量與ssh服務相關,則允許流量
drop 拒絕流入的流量,除非與流出的流量相關
external 拒絕流入的流量;除非與流出的流量相關;如果流量與ssh服務相關,則允許流量
home 拒絕流入的流量;除非與流出的流量相關;如果流量與ssh,mdns,ipp-client,amba-client,dhcpv6-client服務相關,則允許流量
internal 等同於home區域
public 拒絕流入的流量;除非與流出的流量相關;如果流量與ssh,dhcpv6-client服務相關,則允許流量
trusted 允許所有的資料包流入與流出
work 拒絕流入的流量;除非與流出的流量相關;如果流量與ssh,ipp-client,dhcpv6-client服務相關,則允許流量

建立自定義區域

# firewall-cmd --permanent --new-zone=testing
success

注意:--permanent選項不能少

檢視預設區域

# firewall-cmd --get-default-zone
public

檢視網路卡關聯的區域

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:12:86:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.206.102/24 brd 192.168.206.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe12:86da/64 scope link 
       valid_lft forever preferred_lft forever
# firewall-cmd --get-zone-of-interface=ens33
public

注意:一張網路卡只能關聯一個區域

修改預設區域

例子:

# #修改預設區域為`trusted`
# firewall-cmd --set-default-zone=trusted 
success
# firewall-cmd --get-default-zone 
trusted
# firewall-cmd --get-zone-of-interface=ens33
trusted
# #還原
# firewall-cmd --set-default-zone=public 
success
# firewall-cmd --get-default-zone 
public
# firewall-cmd --get-zone-of-interface=ens33
public

修改網路卡關聯的區域

方法1:先刪除現有關聯區域,再新增目標關聯區域(因為同一時間,一張網路卡只能關聯一個區域,所以要先新增再刪除)

# firewall-cmd --remove-interface=ens33 --zone=public
success
# firewall-cmd --get-zone-of-interface=ens33
no zone
## 設定ens33關聯區域為trusted
# firewall-cmd --add-interface=ens33 --zone=trusted
success
# firewall-cmd --get-zone-of-interface=ens33
trusted

方法2:

## 設定ens33關聯區域為public
# firewall-cmd --change-interface=ens33 --zone=public
success
# firewall-cmd --get-zone-of-interface=ens33
public

列印當前活動區域及繫結的介面和源

firewall-cmd --get-active-zones

列印當前活動區域以及這些區域中使用的介面和源。活動區域是與介面或源繫結的區域。輸出格式為:

zone1
  interfaces: interface1 interface2 ..
  sources: source1 ..
zone2
  interfaces: interface3 ..
zone3
  sources: source2 ..
如果沒有介面和源繫結到區域,則忽略該對應區域行

例子:

# firewall-cmd --get-active-zones
public
  interfaces: ens33

埠訪問限制

檢視已開放埠

firewall-cmd  [--permanent] [--zone=zone] --list-ports

以空格分隔的列表形式列出為區域新增的埠。埠的形式為portid[-portid]/protocol,它可以是埠和協議對,也可以是具有協議的埠範圍。如果忽略--zone選項配置,將使用預設區域。

新增開放埠

firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=timeval]     

zone(區域)新增埠。如果省略了--zone選項配置,將使用預設區域。此選項可以多次指定。如果提供了--timeout,則該規則將在指定的超時時間內處於活動狀態,超時之後將自動刪除。timeval是一個數字(秒)或數字後跟一個字元s(秒)、m(分鐘)、h(小時),例如20m或1h。
埠可以是單個埠號,也可以是埠範圍portid-portid。協議可以是tcpudpsctpdccp
--timeout選項不能與--permanent選項組合使用。

取消開放埠

firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol

從區域中刪除埠。如果省略了--zone選項配置,將使用預設區域。此選項可以多次指定。
--permanent 可用於持久設定選項。這些更改不會立即生效,只有在重新啟動/重新載入服務或系統重新啟動後才會生效。如果未使用--permanent,則更改將僅是執行時配置的一部分(所做的變更在重啟服務、重新載入服務後失效),下同,不再贅述。

例子

例子:為public區域持久開放 tcp協議埠 15672

# firewall-cmd --permanent --add-port=15672/tcp
# firewall-cmd --list-ports # 查不到埠
# #讓配置生效
# firewall-cmd --reload
success
# firewall-cmd --list-ports
15672/tcp

說明:

  1. firewall-cmd --reload

    重新載入防火牆規則並保留狀態資訊。當前的持久配置將成為新的執行時配置,也就說執行的所有僅執行時變更在重新載入規則後丟失。類似的,有以下命令

  2. firewall-cmd --complete-reload

    完全重新載入防火牆,甚至netfilter核心模組。這很可能會終止活動連線,因為狀態資訊會丟失。此選項僅用於嚴重的防火牆問題。例如,防火牆規則正確的情況下,無法建立連線的狀態資訊問題

例子:為public區域持久開放 tcp協議埠範圍 1000-2000(包括1000及2000)

# firewall-cmd --permanent --add-port=1000-2000/tcp
success
# firewall-cmd --reload
success
# firewall-cmd --list-ports
15672/tcp 1000-2000/tcp

例子:為public區域持久取消開放 tcp協議埠 15672

# firewall-cmd --permanent --remove-port=15672/tcp
success
# firewall-cmd --reload
success
# firewall-cmd --list-ports
1000-2000/tcp

例子:為public區域持久取消開放tcp協議埠範圍 1000-2000(包括1000及2000)

]# firewall-cmd --permanent --remove-port=1000-2000/tcp
success
# firewall-cmd --reload
success
# firewall-cmd --list-ports

# 

IP、網路訪問限制

新增開放源

firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask]|MAC|ipset:ipset

繫結源(source,IP、網路、MAC、IP集)到區域zone。如果省略了--zone選項配置,將使用預設區域。

取消開放源

firewall-cmd [--permanent] --remove-source=source[/mask]|MAC|ipset:ipset

從區域zone刪除之前新增繫結的源

例子

例子:允許IP 192.168.50.182持久訪問為public區域

# firewall-cmd --permanent --add-source=192.168.50.182
success
# firewall-cmd --reload
success

說明:新增IP白名單後,即使未新增開放埠,針對當前IP,也可以正常訪問。

例子:允許子網192.168.50.0/24持久訪問為public區域

# firewall-cmd --permanent --add-source=192.168.50.0/24
success
# firewall-cmd --reload
success

例子:取消IP 192.168.50.182對public區域的持久訪問許可

# firewall-cmd --permanent --remove-source=192.168.50.182
success
# firewall-cmd --reload
success

富語言規則

列出富語言規則

firewall-cmd [--permanent] [--zone=zone] --list-rich-rules

以換行符分隔的列表形式列出為區域新增的富語言規則。如果省略了--zone選項,將使用預設區域。

新增富語言規則

firewall-cmd [--permanent] [--zone=zone] --add-rich-rule='rule' [--timeout=timeval]

為區域新增富語言規則'rule'。此選項可以多次指定。如果省略了區域,將使用預設區域。如果提供了--timeout,則該規則將在指定的超時時間內處於活動狀態,超時之後將自動刪除。timeval是一個數字(秒)或數字後跟一個字元s(秒)、m(分鐘)、h(小時),例如20m或1h。

--timeout選項不能與--permanent選項組合使用。

刪除富語言規則

firewall-cmd  [--permanent] [--zone=zone] --remove-rich-rule='rule'

從區域中刪除富語言規則'rule'。此選項可以多次指定。如果省略了區域,將使用預設區域。

查詢富語言規則

firewall-cmd  [--permanent] [--zone=zone] --query-rich-rule='rule'

返回是否為區域新增了富語言規則'rule'。如果省略了--zone,將使用預設區域。如果為真,則返回0,否則返回1。

例子

例子:允許 IP 192.168.50.182 持久訪問public區域tcp協議埠15672

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.50.182" port protocol="tcp" port="15672" accept'
# firewall-cmd --reload

例子:取消 IP 192.168.50.182 持久訪問public區域tcp協議埠15672的許可

# firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.50.182" port protocol="tcp" port="15672" accept'
success
# firewall-cmd --reload

例子:禁止 IP 192.168.50.182 持久訪問public區域

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.50.182" reject'
# firewall-cmd --reload

注意:新增訪問限制前,建議先移除之前的訪問許可配置,否則可能導致當前規則不起作用。此外,這裡的reject也可以替換為drop,即直接丟棄來訪請求資料包。

例子:取消禁止 IP 192.168.50.182 持久訪問public區域限制

# firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.50.182" reject'
# firewall-cmd --reload

例子:檢視當前配置的富語言規則

# firewall-cmd --list-rich-rules
rule family="ipv4" source address="192.168.50.182" reject

列出為區域啟用或新增的所有內容

firewall-cmd[--permanent] [--zone=zone] --list-all

列出為區域新增或啟用的所有內容。如果省略了--zone選項配置,則將使用預設區域。

例子:

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 15672/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

儲存當前執行時配置為持久配置

# firewall-cmd --runtime-to-permanent

儲存活動執行時配置並用它覆蓋持久配置。

參考連結

https://firewalld.org/documentation/concepts.html

相關文章