天天看點

Linux 中的 15 個強大的 firewall-cmd 指令

企業中,因為業務的重要性,通常會對網絡安全十分重視,那麼一個好的防火牆系統就是強有力的利器!

本文,将帶大家了解 CentOS 7新的防火牆服務firewalld的基本原理,它有個非常強大的過濾系統,稱為 Netfilter,它内置于核心子產品中,用于檢查穿過系統的每個資料包。

這意味着它可以在到達目的地之前以程式設計方式檢查、修改、拒絕或丢棄任何網絡資料包,如傳入、傳出或轉發,從 Centos-7 開始,firewalld 成為管理基于主機的防火牆服務的預設工具,firewalld 的守護程序是從 firewalld 包安裝的,它将在作業系統的所有基本安裝上可用,但在最小安裝上不可用。

使用 FirewallD 優于“iptables”的優點:

  • 在運作時所做的任何配置更改都不需要重新加載或重新啟動 firewalld 服務
  • 通過将整個網絡流量安排到區域中來簡化防火牆管理
  • 每個系統可以設定多個防火牆配置以更改網絡環境
  • 使用 D-Bus 消息系統來互動/維護防火牆設定

在 CentOS 7 或更高版本中,我們仍然可以使用經典的 iptables,如果要使用 iptables,需要停止并禁用 firewalld 服務。同時使用firewalld 和 iptables會使系統混亂,因為它們彼此不相容。

建議使用 firewalld 來管理防火牆服務,除非我們有一些特定的理由繼續使用經典的 iptables。

Firewalld 設計了強大的過濾系統,并且在處理防火牆管理方面也更加靈活。為了利用這種設計,firewalld 将傳入流量分類到源位址定義的接口上的區域中。

每個區域都旨在根據指定的标準管理流量。如果沒有進行任何修改,預設區域将設定為 public,并且關聯的網絡接口将附加到 public。

所有預定義的區域規則都存儲在兩個位置:系統指定的區域規則在“​

​/usr/lib/firewalld/zones/​

​​”下,使用者指定的區域規則在​

​/etc/firewalld/zones/​

​​ 下。如果在系統區域配置檔案中進行了任何修改,它将自動複制到 ​

​/etc/firewalld/zones/​

​。

本文将詳細介紹firewalld 服務基礎知識,了解如何在 RHEL/CentOS 7 中使用 firewall-cmd 指令。

本文目錄如下:

文章目錄

  • ​​使用 FirewallD 優于“iptables”的優點:​​
  • ​​本文目錄如下: @[toc]​​
  • ​​安裝并啟用firewallD服務​​
  • ​​區域​​
  • ​​1.如何檢視firewalld中的所有可用區域?​​
  • ​​2. 如何找出哪個是預設區域?​​
  • ​​3. 如何查找活動區域和相關網絡接口的清單?​​
  • ​​4. 如何檢視活動公共區域是否有任何規則列出?​​
  • ​​5. 如何檢視所有可用區域的清單?​​
  • ​​6. 如何将預設區域更改為特定區域?​​
  • ​​7. 如何将網絡接口從一個區域更改為另一個區域?​​
  • ​​8. 如何建立自定義的firewalld zone?​​
  • ​​服務​​
  • ​​dhcpv6-client​​
  • ​​ssh​​
  • ​​Samba-client​​
  • ​​lpp-client​​
  • ​​mdns​​
  • ​​1.如何列出firewalld中所有可用的服務?​​
  • ​​2. 如何列出特定區域内的所有可用服務?​​
  • ​​3. 如何将現有服務添加到預設區域?​​
  • ​​firewalld兩種模式​​
  • ​​1. 如何永久添加服務?​​
  • ​​2. 如何将我的運作時設定遷移到永久設定?​​
  • ​​端口​​
  • ​​1. 如何在公共區域為samba服務開放端口?​​
  • ​​逾時​​

前置條件:

  • 作業系統:CentOS 7 或更高版本
  • 軟體包:firewalld
  • 使用者帳戶:root 使用者或具有 sudo 權限的使用者帳戶
  • 建議使用 sudo 權限而不是 root 來運作所有管理指令

有三種方式配置防火牆:

  • 在“​

    ​/etc/firewalld​

    ​”配置檔案中直接編輯
  • 圖形界面“firewall-config”工具
  • 終端中的指令行“firewall-cmd”
注意:本文我們将隻關注“firewall-cmd”指令。

安裝并啟用firewallD服務

首先,更新包的最新目前版本。

sudo yum update -y      
Firewalld在 CentOS 7 的所有基本安裝上可用,但在最小安裝上不可用,在這種情況下,我們可以使用以下指令進行安裝:
$ sudo yum install firewalld -y      

使用以下指令啟動和啟用服務

$ sudo systemctl start firewalld.service

$ sudo systemctl 啟用 firewalld.service      

使用以下指令驗證防火牆服務的狀态:

$ sudo firewall-cmd --state      
Output:

running      
$ sudo systemctl status firewalld      

詳細輸出:

firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Sat 2020-04-18 22:39:56 IST; 2h 52min ago
Main PID: 759 (firewalld)
CGroup: /system.slice/firewalld.service
└─759 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Apr 18 22:39:56 localhost.localdomain systemd[1]: Started firewalld - dynamic...      
提示:有些行被省略,使用 -l 顯示完整。

區域

Firewalld 為不同的目的引入了幾個預定義的區域和服務,主要目的之一是更輕松地處理 firewalld 管理。

基于這些區域和服務,我們可以阻止任何形式的系統傳入流量,除非它明确允許在區域中使用一些特殊規則。

1.如何檢視firewalld中的所有可用區域?

$ sudo firewall-cmd --get-zones      
Linux 中的 15 個強大的 firewall-cmd 指令
這是 firewalld 中的預設預定義區域

2. 如何找出哪個是預設區域?

$ firewall-cmd --get-default-zone      
Output:

public      
根據上面的輸出,可以看到公共區域被标記為預設區域,我們可以根據我們的要求更改它,我們将在接下來的例子中進一步讨論。

3. 如何查找活動區域和相關網絡接口的清單?

$ firewall-cmd --get-active-zones      
Output:

public
interfaces: enp1s0      
在上面的輸出中,您可以看到公共區域處于活動狀态并與“enp1s0”網絡接口相關聯,如果沒有任何接口未指定給特定區域,它将自動附加到預設區域。

4. 如何檢視活動公共區域是否有任何規則列出?

$ sudo firewall-cmd --list-all --zone="public"      
Linux 中的 15 個強大的 firewall-cmd 指令
上面的輸出顯示公共區域處于活動狀态并設定為預設值,網絡接口“enp1so”與活動區域相關聯,在此區域中,dhcpv6-client 和 ssh 被允許通過防火牆服務。

5. 如何檢視所有可用區域的清單?

$ sudo firewall-cmd --list-all-zones      
與前面的例子類似,這裡也會分别列出每個可用區域的詳細配置頁面,請自行檢查,因為輸出清單會很長。

6. 如何将預設區域更改為特定區域?

在更改到新區域之前,讓我們檢查現有的可用區域。

$ sudo firewall-cmd --get-default-zone      
Output:

public      
在輸出中,可以看到公共區域設定為預設區域,現在讓我們嘗試将區域從公共更改為工作。
$ sudo firewall-cmd --set-default-zone=work      
Output:

success      
如您所見,上述指令的輸出是成功的,讓我們驗證一下。
$ sudo firewall-cmd --get-default-zone      
Output:

work      <==      

7. 如何将網絡接口從一個區域更改為另一個區域?

如果系統有兩個網絡接口,比如“enp1s0 和 enp1s1”,預設情況下,所有接口都将被配置設定到預設區域,通過使用以下指令可以将接口更改為另一個區域。
$ sudo firewall-cmd --zone=internal --change-interface=enp1s1      

可以使用以下指令進行驗證:

$ sudo firewall-cmd --get-active-zones      

8. 如何建立自定義的firewalld zone?

我們知道,所有系統指定的配置檔案都位于“​

​/usr/lib/firewalld/zones​

​​”,使用者指定的檔案位于“​

​/etc/firewalld/zones​

​”。

使用以下指令建立自定義區域檔案允許使用端口号 80 和 22 的 ssh 和 apache 服務。

確定新檔案應以 .xml 格式儲存在使用者定義的位置,目前,名稱區域檔案的長度僅限于 17 個字元。

$ sudo vi /etc/firewalld/zones/ linuxtecksecure .xml      
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>linuxtecksecure</short>
<description>用于企業領域。</description>
<service name="apache"/>
<service name="ssh"/>
<port protocol="tcp" port="80"/>
<port protocol="tcp" port="22"/>
</zone>      

儲存并退出。

重新加載防火牆服務:

$ sudo firewall-cmd --reload      
Output:


success      

現在,重新檢查 firewalld 中的可用區域

$ sudo firewall-cmd --get-zones      
Output:

block dmz drop external home internal "linuxtecksecure" public trusted work      

使用上面的指令,我們可以建立一個新的 (linuxtecksecure) zone 來預設僅啟用 apache 和 ssh 服務,建立檔案後,我們需要“重新加載”firewalld 服務,以便将區域激活到firewalld

請記住:在對現有區域檔案進行任何更改/更新後,請務必重新加載您的firewalld 服務激活,否則防火牆中的更改不會受到影響。

服務

firewalld 有另一個名為“服務”的元件,這些服務可以在區域檔案中用于管理防火牆設定中的流量規則,每個預定義的“服務”在區域檔案的預設配置中使用.

dhcpv6-client

管理DHCP v6用戶端的本地流量,使用udp端口546。

ssh

管理ssh伺服器服務的本地通信量,并使用tcp端口22。

Samba-client

管理Windows FLES/列印機共享服務的本地通信量,并使用137(UDP)和138(UDP)端口

lpp-client

管理用于列印伺服器服務的本地通信量,并使用udp端口631。

mdns

管理多點傳播本地鍊路服務,并使用udp端口5353。

1.如何列出firewalld中所有可用的服務?

$ sudo firewall-cmd --get-services      
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc 
ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch 
etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre 
high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop 
kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql 
murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis 
pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client 
samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui 
synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans 
xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server      

2. 如何列出特定區域内的所有可用服務?

$ sudo firewall-cmd --zone=work --list-services      
Output:

dhcpv6-client ssh      

輸出顯示在“工作”區域中僅啟用了兩個服務。

3. 如何将現有服務添加到預設區域?

$ sudo firewall-cmd --add-service=samba      
Output:

success      

在此示例中,我已将名為 samba 的現有服務添加到預設區域,您可以使用以下指令進行驗證:

$ sudo firewall-cmd --zone=public --list-services      
Output:

dhcpv6-client samba ssh      

同樣,我們可以将服務添加到預設區域以外的其他區域。使用以下指令:

$ sudo firewall-cmd --zone=internal --add-service=ftp      

firewalld兩種模式

預設情況下,firewalld 支援兩種獨立的模式,永久和運作時(立即)。

當我們啟動防火牆時,它會将所有永久配置檔案加載到運作時中。

您進行添加或更新的任何機會都将應用于運作時配置,并且不會自動啟用到永久配置。

為了使其成為永久規則,我們需要使用“​

​--permanent​

​”參數,為了在 firewalld 中啟用這些更改,我們需要重新加載或重新啟動防火牆服務。

1. 如何永久添加服務?

$ sudo firewall-cmd --permanent --add-service=ftp      
Output:

success      
$ sudo firewall-cmd --reload      
Output:

success      
請記住,無論何時使用“–permanent”标志,都不要忘記重新加載防火牆服務。

2. 如何将我的運作時設定遷移到永久設定?

$ sudo firewall-cmd --runtime-to-permanent      
Output:

success      

通常,我們在運作時環境中測試所有規則,一旦規則成功運作,然後我們使用“–permanent”選項使它們永久化,使用上述指令一次性将所有運作時設定遷移到永久模式,如果防火牆設定無效,則隻需重新加載/重新啟動防火牆服務即可使這些規則在永久配置中工作。

端口

firewalld 允許我們直接處理網絡端口,美妙之處在于,甚至無需在系統中安裝特定服務,我們就可以在防火牆中打開和關閉相關端口。

1. 如何在公共區域為samba服務開放端口?

$ sudo firewall-cmd --zone=public --add-port=137/udp

$ sudo firewall-cmd --zone=public --add-port=138/udp

$ sudo firewall-cmd --zone=public --add-port=139/tcp

$ sudo firewall-cmd --zone=public --add-port=445/tcp      
Output:

success      

使用上面的指令,我們已經成功打開了samba服務的端口

驗證一下:

$ sudo firewall-cmd --list-ports      
Output:

137/udp 138/udp 139/tcp 445/tcp      

成功測試後,如果您希望将這些規則作為防火牆的永久規則繼續使用,則将“–permanent”标志與上述指令一起使用或使用運作時作為永久指令,不要忘記重新加載服務。

逾時

Firewalld 還有一個有趣的功能叫做逾時。此功能将幫助許多系統管理者在其運作時設定中添加臨時規則,例如,如果使用者想通過 FTP 服務從伺服器下載下傳檔案。

由于這隻是一次性操作,是以不需要永久規則。

下載下傳檔案可能隻需要 2-5 分鐘(可能會因檔案大小而異)。

在我們的例子中,我們可以允許 FTP 服務 5 分鐘,它會在給定的時間後自動斷開連接配接。

$ sudo firewall-cmd --zone=public --add-service=ftp --timeout=5m      
我們可以以秒 (s)、分鐘 (m) 或小時 (h) 為機關指定逾時。

繼續閱讀