企業中,因為業務的重要性,通常會對網絡安全十分重視,那麼一個好的防火牆系統就是強有力的利器!
本文,将帶大家了解 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
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNwgzMyIDOmBzN3YzM4MGOyYzX3ADNwUTM0IzLcVDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
這是 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"
上面的輸出顯示公共區域處于活動狀态并設定為預設值,網絡接口“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) 為機關指定逾時。