linux系統中firewalld防火牆管理工具firewall-cmd(CLI命令行)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM