linux系統中firewalld防火牆擁有基於CLI(命令行界面)和基於GUI(圖形用戶界面)兩種管理方式。
相較於傳統的防火牆管理配置工具,firewalld支持動態更新技術並加入了區域(zone)的概念。簡單來說,區域就是firewalld預先准備了幾套防火牆策略集合(策略模板)
用戶可以根據生產場景的不同而選擇合適的策略集合,從而實現防火牆策略之間的快速切換。
firewalld中常見的區域名稱(默認為public)以及相應的策略規划如下圖:(linux就該這么學p160)

終端管理工具CLI(命令行界面)
firewall-cmd是firewalld防火牆配置管理工具的CLI(命令行界面)版本。firewall-cmd命令的參數一般都是長格式的。
firewall-cmd命令中使用的參數以及作用

與linux系統中其他的防火牆策略配置工具一樣,使用firewalld配置的防火牆策略默認為運行時模式,又稱為當前生效模式,而且隨着系統的重啟會失效。如果想讓配置策略一致存在,就需要使用永久模式了。
方法就是在用firewall-cmd命令正常設置防火牆策略是添加 --permanent參數,這樣配置的防火牆策略就可以永久生效了。但是,永久生效模式有一個不近人情的特點,就是使用它設置的策略只有在系統重啟
之后才能自動生效。如果想讓配置的策略立即生效,需要手動執行firewall-cmd --reload命令。
1、查看firewalld服務當前所使用的區域:
[linuxprobe@linuxprobe Desktop]$ firewall-cmd --get-default-zone public
2、查詢eno16777728網卡在firewalld服務中的區域:
[linuxprobe@linuxprobe Desktop]$ ifconfig | head -n 3 ## 查看網卡名稱 eno16777728: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.13 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::20c:29ff:feab:7b00 prefixlen 64 scopeid 0x20<link> [linuxprobe@linuxprobe Desktop]$ firewall-cmd --get-zone-of-interface=eno16777728 ## 查看網卡在firewalld服務中的區域 public
3、把firewalld服務中eno16777728網卡的默認區域修改為external,並在系統重啟后生效
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728 ## 查看網卡在firewalld服務中的區域 public [root@linuxprobe ~]# firewall-cmd --permanent --zone=external --change-interface=eno16777728 ##將網卡的默認區域永久修改為external,但是不能立即生效(需要重啟系統生效,或者firewall-cmd --reload) success [root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728 ## 查看網卡在firewalld服務中的區域,仍然為public public [root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728 --permanent ## 加--permanent,變為external(或者重啟) external
4、修改firewalld服務的默認區域
[root@linuxprobe ~]# firewall-cmd --get-default-zone ## 查看當前firewalld服務所在的區域 public [root@linuxprobe ~]# firewall-cmd --set-default-zone=external ## 設為external success [root@linuxprobe ~]# firewall-cmd --get-default-zone ## 查看 external [root@linuxprobe ~]# firewall-cmd --set-default-zone=home ## 設為home success [root@linuxprobe ~]# firewall-cmd --get-default-zone ## 查看 home [root@linuxprobe ~]# firewall-cmd --set-default-zone=trusted success [root@linuxprobe ~]# firewall-cmd --get-default-zone trusted [root@linuxprobe ~]# firewall-cmd --set-default-zone=drop success [root@linuxprobe ~]# firewall-cmd --get-default-zone drop [root@linuxprobe ~]# firewall-cmd --set-default-zone=public success [root@linuxprobe ~]# firewall-cmd --get-default-zone public
5、啟動/關閉firewalld防火牆服務的應急狀況模式,阻斷一切網絡連接(當遠程控制服務時慎用):
[root@linuxprobe ~]# firewall-cmd --panic-on ## 開啟 success [root@linuxprobe ~]# firewall-cmd --panic-off ## 關閉 success
6、查詢public區域是否允許請求SSH和HTTPS協議的流量:
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=ssh ## 允許 yes [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https ## 拒絕 no [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=dhcpv6-client ## 允許 yes [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=ipp-client ## 拒絕 no
7、把firewalld服務中請求HTTPS協議的流量設置為永久允許,並立即生效
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https ## 查看當前是否允許 no [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=https ## 加--permanent設置為永久允許 success [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https ## 查看,未立即生效 no [root@linuxprobe ~]# firewall-cmd --reload ## 執行reload success [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https ## 立即生效 yes
8、把firewalld服務中請求HTTP協議的流量設置為永久拒絕,並立即生效:
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=http ## 查看當前http在firewalld服務中的狀態,為拒絕 no [root@linuxprobe ~]# firewall-cmd --zone=public --add-service=http --permanent ## 設置為永久允許 success [root@linuxprobe ~]# firewall-cmd --reload ## 使其立即生效 success [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=http ## 查看是否生效,是 yes [root@linuxprobe ~]# firewall-cmd --zone=public --remove-service=http --permanent ## 設置為永久拒絕 success [root@linuxprobe ~]# firewall-cmd --reload ## 使其立即生效 success [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=http ## 查看是否生效,是 no
9、把在firewalld服務中訪問8080和8081端口的流量策略設置為允許,但僅限當前生效:
[root@linuxprobe ~]# firewall-cmd --zone=public --list-ports ## 列出當前的端口 [root@linuxprobe ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp ## 增加端口 success [root@linuxprobe ~]# firewall-cmd --zone=public --list-ports ## 列出端口 8080-8081/tcp
10、把原本訪問本機888端口的流量轉發到22端口,且要求當前和長期均有效:
測試修改前的情況:
[root@linuxprobe ~]# ifconfig | head -n 5 ## 查看當前主機的IP eno16777728: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.13 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::20c:29ff:feab:7b00 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ab:7b:00 txqueuelen 1000 (Ethernet) RX packets 319 bytes 31578 (30.8 KiB) [root@linuxprobe ~]# ifconfig | head -n 5 ## 登錄另一台主機,並查看IP ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.14 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::d7fe:9dfc:42ec:c255 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ef:86:f2 txqueuelen 1000 (Ethernet) RX packets 562 bytes 68551 (66.9 KiB) [root@linuxprobe ~]# ssh -p 888 192.168.3.13 ## 測試端口為888的遠程控制情形,無法連接 ssh: connect to host 192.168.3.13 port 888: No route to host
執行修改:
[root@linuxprobe ~]# firewall-cmd --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.3.13 --permanent ## 執行端口轉移 success [root@linuxprobe ~]# firewall-cmd --reload ## 重新加載,立即生效 success
測試修改效果:
[root@linuxprobe ~]# ifconfig | head -n 5 ## 登錄另一台主機,並查看IP ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.14 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::d7fe:9dfc:42ec:c255 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ef:86:f2 txqueuelen 1000 (Ethernet) RX packets 650 bytes 76761 (74.9 KiB) [root@linuxprobe ~]# ssh -p 888 192.168.3.13 ## 測試端口流量轉移后遠程控制,通過 root@192.168.3.13's password:
Last login: Fri Oct 30 22:01:12 2020
11、firewalld中的富規則表示更細致、更詳細的防火牆策略配置,優先級在所有的防火牆策略中是最高的,比如我們可以在firewalld服務中配置一條富規則,使其拒絕192.168.3.0/24網段的所有用戶訪問本機的ssh服務(22端口):
測試修改前的ssh服務:
[root@linuxprobe ~]# ifconfig | head -n 5 ## 查看當前主機IP eno16777728: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.13 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::20c:29ff:feab:7b00 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ab:7b:00 txqueuelen 1000 (Ethernet) RX packets 360 bytes 37008 (36.1 KiB) [root@linuxprobe ~]# ifconfig | head -n 5 ## 登錄另一台主機,查看IP ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.14 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::d7fe:9dfc:42ec:c255 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ef:86:f2 txqueuelen 1000 (Ethernet) RX packets 963 bytes 110176 (107.5 KiB) [root@linuxprobe ~]# ssh 192.168.3.13 ## 測試ssh遠程控制服務,通過 root@192.168.3.13's password:
Last login: Fri Oct 30 22:51:22 2020 from 192.168.3.13 [root@linuxprobe ~]# ifconfig | head -n 5 ## 登錄另一台主機,並查看IP ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.8 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::54f8:bbf7:7760:3745 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:8d:79:f8 txqueuelen 1000 (Ethernet) RX packets 226 bytes 211739 (206.7 KiB) [root@linuxprobe ~]# ssh 192.168.3.13 ## 測試ssh遠程控制服務,通過 root@192.168.3.13's password:
Last login: Fri Oct 30 22:52:04 2020 from 192.168.3.14
執行修改,測試192.168.10.0/24網段:
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject" ## 執行修改 success [root@linuxprobe ~]# firewall-cmd --reload ## 立即生效 success [root@linuxprobe ~]# ifconfig | head -n 5 ## 登錄另一主機,查看IP ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.14 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::d7fe:9dfc:42ec:c255 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ef:86:f2 txqueuelen 1000 (Ethernet) RX packets 1109 bytes 127776 (124.7 KiB) [root@linuxprobe ~]# ssh 192.168.3.13 ## 測試遠程服務,通過 root@192.168.3.13's password:
Last login: Fri Oct 30 22:53:55 2020 from 192.168.3.8 [root@linuxprobe ~]# ifconfig | head -n 5 ## 登錄另一主機,查看IP ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.8 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::54f8:bbf7:7760:3745 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:8d:79:f8 txqueuelen 1000 (Ethernet) RX packets 1875 bytes 2376094 (2.2 MiB) [root@linuxprobe ~]# ssh 192.168.3.13 ## 測試遠程服務,通過 root@192.168.3.13's password:
Last login: Fri Oct 30 23:00:27 2020 from 192.168.3.14
執行修改,測試192.168.3.0/24網段:
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.3.0/24" service name="ssh" reject" ## 執行修改 success [root@linuxprobe ~]# firewall-cmd --reload ## 立即生效 success [root@linuxprobe ~]# ifconfig | head -n 5 ## 登錄另一主機,查看IP ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.14 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::d7fe:9dfc:42ec:c255 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ef:86:f2 txqueuelen 1000 (Ethernet) RX packets 1300 bytes 152392 (148.8 KiB) [root@linuxprobe ~]# ssh 192.168.3.13 ## 測試ssh遠程服務,拒絕 ssh: connect to host 192.168.3.13 port 22: Connection refused [root@linuxprobe ~]# ifconfig | head -n 5 ## 登錄另一主機,查看IP ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.8 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::54f8:bbf7:7760:3745 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:8d:79:f8 txqueuelen 1000 (Ethernet) RX packets 1990 bytes 2390926 (2.2 MiB) [root@linuxprobe ~]# ssh 192.168.3.13 ## 測試ssh遠程服務,拒絕 ssh: connect to host 192.168.3.13 port 22: Connection refused
