一、簡介:
1、firewalld簡介:
firewalld是firewall daemon,CentOS 7上預設的防火牆管理工具,擁有運作時配置和永久配置選項,也支援允許服務或應用程式直接添加防火牆規則的接口。firewalld使用zones和services的概念,而iptables使用chains和rules。與iptables相比,firewalld提供了更靈活的方式來管理防火牆。firewalld自身并不具備防火牆功能,而是和iptables一樣需要通過核心的netfilter來實作。
2、firewalld中區域zone的概念:
相較于傳統的防火牆管理配置工具,firewalld支援動态更新技術并加入了區域(zone)的概念。簡單來說,區域就是firewalld預先準備了幾套防火牆通路控制政策集合(模闆),使用者可以根據生産場景的不同而選擇合适的政策集合,進而實作政策之間的快速切換。基于使用者對網絡中裝置和通信所給與的信任程度,firewalld可用于将網絡劃分成不同的區域,為每個區域提供不同級别的安全性,區域類型如下:
- block:限制,任何接收的網絡連接配接都被IPv4的icmp-host-prohibited資訊和IPv6的icmp6-adm-prohibited資訊所拒絕。
- dmz:非軍事區,外部受限地通路内部網絡,僅接收經過標明的網絡連接配接。
- drop:丢棄,任何接收的網絡資料包都被丢棄,且沒有任何回複,僅能有發送的網絡連接配接。
- external:外部,為路由器啟用了僞裝功能的外部網絡,不信任網絡内的其它計算機,僅接收經過標明的網絡連接配接。
- home:家庭,網絡内的其它計算機通常是可信任的,僅接收經過標明的網絡連接配接。
- internal:内部,網絡内的其它計算機通常是可信任的,僅接收經過標明的網絡連接配接。
- public:公共,也是初始預設區域,不信任網絡内的其它計算機,僅接收經過標明的網絡連接配接。當網絡接口連接配接加入了NetworkManager,它們就被綁定至預設區域。
- trusted:信任,接受所有網絡連接配接。
- work:工作,網絡内的其它計算機通常是可信任的,僅接收經過標明的網絡連接配接。
3、firewalld中預先定義服務service的概念:
firewalld的service配置是預定義的服務,如果啟用了服務,則會自動加載。使用預定義服務可以使使用者更輕松地啟用和禁用對服務的通路。
4、安裝firewalld:
CentOS 7中firewalld預設已安裝,如未安裝,可使用指令yum -y install firewalld進行安裝。
5、firewalld的三種主要配置方式:
- 圖形化工具:firewall-config
- 指令行工具:firewall-cmd
- 直接編輯XML相關配置檔案
6、firewalld的兩類配置檔案儲存路徑:
- 系統配置檔案(不能編輯修改,為預設設定準備):/usr/lib/firewalld/{services, zones, ...}
- 使用者自定義配置檔案:/etc/firewalld/{services, zones, ...}
備注:
- 預設情況下,在/etc/firewalld/zones目錄下隻有一個xml配置檔案,如果其它zone做了改動并永久儲存,會自動生成對應的XML配置檔案
- 以“ZONE=區域名稱”的形式儲存在/etc/sysconfig/network-scripts/ifcfg-ensXX網絡接口配置檔案中,重新開機網絡生效
- 以“DefaultZone=區域名稱”的形式儲存在/etc/firewalld/firewalld.conf配置檔案中,reload防火牆生效
- 預定義服務XML配置檔案位于/usr/lib/firewalld/services目錄,每個服務配置檔案都記錄了該服務使用的tcp或udp端口。當預設提供的服務不夠用或需要自定義某服務端口時,需要将/usr/lib/firewalld/services/XML服務配置檔案複制至/etc/firewalld/services目錄中(預設為空)進行編輯修改。/etc/firewalld目錄下的自定義配置檔案讀取優先級高于/usr/lib/firewalld目錄下的系統配置檔案。
二、firewalld相關指令:
啟動:
# systemctl start firewalld
關閉:
# systemctl stop firewalld
重新開機:
# systemctl restart firewalld
在儲存狀态資訊的情況下重載防火牆規則:
# systemctl reload firewalld
檢視狀态:
# systemctl status firewalld
開機自啟:
# systemctl enable firewalld
開機禁用:
# systemctl disable firewalld
檢視是否開機自啟:
# systemctl is-enabled firewalld
檢視所有開機自啟服務:
# systemctl list-unit-files | grep enabled
三、指令行工具firewall-cmd常用指令:
1、基礎指令:
檢視幫助:
# firewall-cmd -h
檢視版本:
# firewall-cmd -V
# firewall-cmd --state
# firewall-cmd --reload
啟用緊急模式(拒絕所有資料包,強制關閉所有網絡連接配接):
# firewall-cmd --panic-on
禁用緊急模式:
# firewall-cmd --panic-off
檢視是否啟用緊急模式:
# firewall-cmd --query-panic
2、區域相關指令:
檢視所有可用區域:
# firewall-cmd --get-zones
檢視目前預設區域:
# firewall-cmd --get-default-zone
檢視預設區域所有配置:
# firewall-cmd --list-all
檢視特定區域所有配置:
# firewall-cmd --zone=home --list-all
檢視所有可用區域所有配置:
# firewall-cmd --list-all-zones
設定預設區域:
# firewall-cmd --set-default-zone=home
建立新區域:
# firewall-cmd --new-zone=test --permanent
删除存在特定區域:
# firewall-cmd --delete-zone=test --permanent
檢視目前所有活動區域和對應綁定網絡接口:
# firewall-cmd --get-active-zones
3、網絡接口相關指令:
檢視特定網絡接口綁定區域:
# firewall-cmd --get-zone-of-interface=ens33
修改特定網絡接口綁定區域:
# firewall-cmd --zone=home --change-interface=ens33 --permanent
将特定網絡接口綁定至特定區域:
# firewall-cmd --zone=home --add-interface=ens33 --permanent
将特定網絡接口從預設區域中删除:
# firewall-cmd --remove-interface=ens33 --permanent
檢視特定網絡接口是否綁定至預設區域:
# firewall-cmd --query-interface=ens33
檢視預設區域綁定網絡接口:
# firewall-cmd --list-interfaces
備注:一個區域能被多個網絡接口綁定,但一個網絡接口隻能綁定一個區域
4、端口基礎指令:
檢視預設區域已開放端口:
# firewall-cmd --list-ports
開放預設區域特定單個端口:
# firewall-cmd --add-port=80/tcp --permanent
開放預設區域特定多個端口:
# firewall-cmd --add-port=5000-5010/udp --permanent
關閉預設區域特定端口:
# firewall-cmd --remove-port=80/tcp --permanent
檢視預設區域特定端口是否開放:
# firewall-cmd --query-port=80/tcp
5、IP僞裝相關指令:
啟用預設區域IP僞裝:
# firewall-cmd --add-masquerade --permanent
禁用預設區域IP僞裝:
# firewall-cmd --remove-masquerade --permanent
檢視預設區域IP僞裝是否啟用:
# firewall-cmd --query-masquerade
6、端口轉發相關指令:
将本機預設區域80端口流量轉發至本機8080端口:
# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
将本機預設區域80端口流量轉發至伺服器192.168.0.120的80端口:
# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.120 --permanent
将本機預設區域80端口流量轉發至伺服器192.168.0.120的8080端口:
# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.0.120 --permanent
禁用預設區域IPv4端口轉發:
# firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=8080 --permanent
檢視預設區域IPv4端口轉發是否啟用:
# firewall-cmd --query-forward-port=port=80:proto=tcp:toport=8080
檢視預設區域IPv4端口轉發:
# firewall-cmd --list-forward-ports
- 端口轉發是一種将接收的網絡資料包從一個端口轉發至另一個端口的方法
- 啟用端口轉發必須先啟用IP僞裝
- 端口轉發可以轉發至同一台伺服器的不同端口,也可以轉發至不同伺服器的任意端口
- 源端口和目标端口可以是一個單獨的端口,也可以是端口範圍
- 轉發的目标IP如果不指定,預設為本機,如果指定了IP卻沒指定端口,則預設使用源端口
- 協定可以是tcp或udp
- 受核心限制,端口轉發僅可用于IPv4
7、服務相關指令:
檢視預設區域所有支援服務:
# firewall-cmd --get-services
啟用預設區域特定單個服務:
# firewall-cmd --add-service=samba --permanent
啟用預設區域特定多個服務:
# firewall-cmd --add-service={http,https} --permanent
臨時啟用預設區域特定單個服務:
# firewall-cmd --add-service=samba --timeout=60s
禁用預設區域特定服務:
# firewall-cmd --remove-service=samba --permanent
檢視預設區域是否啟用特定服務:
# firewall-cmd --query-service=samba
檢視預設區域已啟用服務:
# firewall-cmd --list-services
檢視特定服務所有資訊:
# firewall-cmd --info-service=samba
備注:--timeout選項可用時間機關s、m、h
8、ICMP過濾相關指令:
檢視預設區域所有支援ICMP類型:
# firewall-cmd --get-icmptypes
啟用預設區域ICMP:
# firewall-cmd --add-icmp-block=echo-reply --permanent
禁用預設區域ICMP:
# firewall-cmd --remove-icmp-block=echo-reply --permanent
查詢預設區域是否啟用ICMP:
# firewall-cmd --query-icmp-block=echo-reply
檢視預設區域已啟用ICMP類型:
# firewall-cmd --list-icmp-blocks
9、富語言規則相關指令:
禁ping(丢棄所有ICMP包):
# firewall-cmd --add-rich-rule='rule protocol value=icmp drop' --permanent
删除禁ping:
# firewall-cmd --remove-rich-rule='rule protocol value=icmp drop' --permanent
檢視禁ping:
# firewall-cmd --query-rich-rule='rule protocol value=icmp drop'
允許來自192.168.0.0/24所有網絡連接配接:
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 accept' --permanent
允許來自192.168.0.0/24網絡連接配接通路ssh服務:
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 service name=ssh accept' --permanent
拒絕來自192.168.0.0/24網絡連接配接通路ssh服務:
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 service name=ssh reject' --permanent
允許來自192.168.0.120網絡連接配接通路3306端口:
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.120 port port=3306 protocol=tcp accept' --permanent
拒絕來自192.168.0.120網絡連接配接通路3306端口:
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.120 port port=3306 protocol=tcp reject' --permanent
允許來自192.168.0.120網絡連接配接通路3306-3310端口:
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.120 port port=3306-3310 protocol=tcp accept' --permanent
檢視預設區域已啟用富語言規則:
# firewall-cmd --list-rich-rules
- 富語言規則允許使用易于了解的指令建立更複雜的防火牆規則
- accept:所有新的連接配接請求都會被允許
- reject:連接配接将被拒絕,連接配接來源将接收到一個拒絕資訊,拒絕的類型可以被設定為另一種值
- drop:所有資料包都會被丢棄,且不會向來源位址發送任何資訊
10、重要說明:
- 如果上述指令中沒有加入“--permanent”選項,執行後立即生效,但不會寫入配置檔案,一旦reload防火牆或重新開機服務或重新開機系統都會失效
- 如果上述指令中加入了“--permanent”選項,需要手動reload防火牆或重新開機服務或重新開機系統才會永久生效,同時配合“--zone=區域名稱”選項決定應用于哪個區域,未指定區域名則表示預設區域
11、幫助文檔:
firewalld指令行選項說明:
# man firewalld
firewalld指令行用戶端選項說明:
# man firewall-cmd
firewalld.conf配置檔案參數說明:
# man firewalld.conf
zone.xml配置檔案參數說明:
# man firewalld.zone
service.xml配置檔案參數說明:
# man firewalld.service
icmptype.xml配置檔案參數說明:
# man firewalld.icmptype
富語言規則參數說明:
# man firewalld.richlanguage
direct.xml配置檔案參數說明:
# man firewalld.direct
官方文檔:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/security_guide/sec-using_firewalls#sec-Introduction_to_firewalld
四、firewalld使用示例:
1、伺服器192.168.0.122禁ping:
配置規則之前:
伺服器192.168.0.122執行如下操作:
# firewall-cmd --add-rich-rule='rule protocol value=icmp drop' --permanent
# firewall-cmd --reload
# firewall-cmd --query-rich-rule='rule protocol value=icmp drop'
# firewall-cmd --list-rich-rules
配置規則之後:
2、将伺服器192.168.0.122預設區域80端口流量轉發至伺服器192.168.0.120的8080端口:
伺服器192.168.0.120執行如下操作:
# yum -y install epel-release
# yum -y install nginx
# vim /etc/nginx/nginx.conf --> listen 8080;
# systemctl start nginx
# ss -tunlp | grep -w 8080
# systemctl stop firewalld
# firewall-cmd --state
浏覽器通路192.168.0.120:8080
# systemctl start firewalld
# firewall-cmd --state
# firewall-cmd --add-masquerade --permanent
# firewall-cmd --reload
# firewall-cmd --query-masquerade
# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.0.120 --permanent
# firewall-cmd --reload
# firewall-cmd --query-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.0.120
# firewall-cmd --list-forward-ports
浏覽器通路192.168.0.122
# echo "<h3>port forwarding succeeded</h3>" > /usr/share/nginx/html/test.html
浏覽器通路192.168.0.120:8080/test.html
浏覽器通路192.168.0.122/test.html
備注:伺服器192.168.0.122不必事先監聽自身80端口
# systemctl stop firewalld
# systemctl disable firewalld
# yum -y install iptables-services
# systemctl start iptables
# systemctl enable iptables