firewall-cmd使用方法
1.firewall-cmd的含義
firewall-cmd 是 firewalld的字元介面管理工具,firewalld是centos7之後版本的一大特性, 最大的好處有兩個:支援動態更新,不用重啟服務;加入了防火牆的“zone”概念。
2.firewall-cmd的用法
命令格式:firewall-cmd [選項 ... ]
(1)通用選項
-h 顯示幫助資訊
-V 顯示版本資訊(這個選項不能與其他選項組合)
-q 不列印狀態訊息
(2)狀態選項
--state 顯示防火牆的狀態
--reload 不中斷服務的重新載入(重啟)
--complete-reload 中斷所有連線的重新載入
--runtime-to-permanent 將當前防火牆的規則永久儲存
--check-config 檢查配置正確性
(3)日誌選項
--get-log-denied 獲取記錄被拒絕的日誌
--set-log-denied=<value> 設定記錄被拒絕的日誌
3.例項用法
(1) 安裝防火牆
yum install firewalld firewall-configf 下載防火牆
systemctl start firewalld 啟動防火牆
systemctl status firewalld 檢視狀態
systemctl disable firewalld 停止
systemctl stop firewalld 禁用
(2) 檢視設定
firewall-cmd --get-active-zones 檢視區域資訊
firewall-cmd --get-zone-of-interface=eth0 檢視指定介面所屬區域
firewall-cmd --panic-on 拒絕所有包
firewall-cmd --panic-off 取消拒絕狀態
firewall-cmd --query-panic 檢視是否拒絕
firewall-cmd --reload 更新防火牆規則
(3) 新增介面
# 將介面新增到區域,預設介面都在public
firewall-cmd --zone=public --add-interface=eth0
# 永久生效再加上 --permanent 然後reload防火牆
# 設定預設介面區域,立即生效無需重啟
firewall-cmd --set-default-zone=public
# 檢視所有開啟的埠:
firewall-cmd --zone=dmz --list-ports
# 加入一個埠到區域:
firewall-cmd --zone=dmz --add-port=8080/tcp
# 永久生效再加上 --permanent 然後reload防火牆
# 移除服務
firewall-cmd --zone=work --remove-service=smtp
# 顯示支援的區域列表
firewall-cmd --get-zones
# 設定為家庭區域
firewall-cmd --set-default-zone=home
# 檢視當前區域
firewall-cmd --get-active-zones
# 設定當前區域的介面
firewall-cmd --get-zone-of-interface=enp03s
# 顯示所有公共區域(public)
firewall-cmd --zone=public --list-all
# 臨時修改網路介面(enp0s3)為內部區域(internal)
firewall-cmd --zone=internal --change-interface=enp03s
# 永久修改網路介面enp03s為內部區域(internal)
firewall-cmd --permanent --zone=internal --change-interface=enp03s
(4) 服務管理
# 顯示服務列表
Amanda, ftp, Samba和tftp等最重要的服務已經被FirewallD提供相應的服務,可以使用如下命令檢視:
firewall-cmd --get-services
# 允許ssh服務通過
firewall-cmd --enable service=ssh
# 禁止SSH服務通過
firewall-cmd --disable service=ssh
# 開啟TCP的8080埠
firewall-cmd --enable ports=8080/tcp
# 臨時允許Samba服務通過600秒
firewall-cmd --enable service=samba --timeout=600
# 顯示當前服務
firewall-cmd --list-services
# 新增HTTP服務到內部區域(internal)
firewall-cmd --permanent --zone=internal --add-service=http
firewall-cmd --reload # 在不改變狀態的條件下重新載入防火牆
(5) 埠管理
# 開啟443/TCP埠
firewall-cmd --add-port=443/tcp
# 永久開啟3690/TCP埠
firewall-cmd --permanent --add-port=3690/tcp
永久開啟埠firewall-cmd --reload
# 檢視防火牆,新增的埠也可以看到
firewall-cmd --list-all
(6) 直接模式
# FirewallD包括一種直接模式,使用它可以完成一些工作,例如開啟TCP協議的9999埠
firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j accept
firewall-cmd --reload
(7) 自定義服務管理
選項
(末尾帶有 [P only] 的話表示該選項除了與(--permanent)之外,不能與其他選項一同使用!)
--new-service=<服務名> 新建一個自定義服務 [P only]
--new-service-from-file=<檔名> [--name=<服務名>]
從檔案中讀取配置用以新建一個自定義服務 [P only]
--delete-service=<服務名>
刪除一個已存在的服務 [P only]
--load-service-defaults=<服務名>
Load icmptype default settings [P only]
--info-service=<服務名>
顯示該服務的相關資訊
--path-service=<服務名>
顯示該服務的檔案的相關路徑 [P only]
--service=<服務名> --set-description=<描述>
給該服務設定描述資訊 [P only]
--service=<服務名> --get-description
顯示該服務的描述資訊 [P only]
--service=<服務名> --set-short=<描述>
給該服務設定一個簡短的描述 [P only]
--service=<服務名> --get-short
顯示該服務的簡短描述 [P only]
--service=<服務名> --add-port=<埠號>[-<埠號>]/<protocol>
給該服務新增一個新的埠(埠段) [P only]
--service=<服務名> --remove-port=<埠號>[-<埠號>]/<protocol>
從該服務上移除一個埠(埠段) [P only]
--service=<服務名> --query-port=<埠號>[-<埠號>]/<protocol>
查詢該服務是否新增了某個埠(埠段) [P only]
--service=<服務名> --get-ports
顯示該服務新增的所有埠 [P only]
--service=<服務名> --add-protocol=<protocol>
為該服務新增一個協議 [P only]
--service=<服務名> --remove-protocol=<protocol>
從該服務上移除一個協議 [P only]
--service=<服務名> --query-protocol=<protocol>
查詢該服務是否新增了某個協議 [P only]
--service=<服務名> --get-protocols
顯示該服務新增的所有協議 [P only]
--service=<服務名> --add-source-port=<埠號>[-<埠號>]/<protocol>
新增新的源埠(埠段)到該服務 [P only]
--service=<服務名> --remove-source-port=<埠號>[-<埠號>]/<protocol>
從該服務中刪除源埠(埠段) [P only]
--service=<服務名> --query-source-port=<埠號>[-<埠號>]/<protocol>
查詢該服務是否新增了某個源埠(埠段) [P only]
--service=<服務名> --get-source-ports
顯示該服務所有源埠 [P only]
--service=<服務名> --add-module=<module>
為該服務新增一個模組 [P only]
--service=<服務名> --remove-module=<module>
為該服務移除一個模組 [P only]
--service=<服務名> --query-module=<module>
查詢該服務是否新增了某個模組 [P only]
--service=<服務名> --get-modules
顯示該服務新增的所有模組 [P only]
--service=<服務名> --set-destination=<ipv>:<address>[/]
Set destination for ipv to address in service [P only]
--service=<服務名> --remove-destination=<ipv>
Disable destination for ipv i service [P only]
--service=<服務名> --query-destination=<ipv>:<address>[/]
Return whether destination ipv is set for service [P only]
--service=<服務名> --get-destinations
List destinations in service [P only]
(8) 控制埠 / 服務
可以通過兩種方式控制埠的開放,一種是指定埠號另一種是指定服務名。雖然開放 http 服務就是開放了 80 埠,但是還是不能通過埠號來關閉,也就是說通過指定服務名開放的就要通過指定服務名關閉;通過指定埠號開放的就要通過指定埠號關閉。還有一個要注意的就是指定埠的時候一定要指定是什麼協議,tcp 還是 udp。知道這個之後以後就不用每次先關防火牆了,可以讓防火牆真正的生效。
firewall-cmd --add-service=mysql # 開放mysql埠
firewall-cmd --remove-service=http # 阻止http埠
firewall-cmd --list-services # 檢視開放的服務
firewall-cmd --add-port=3306/tcp # 開放通過tcp訪問3306
firewall-cmd --remove-port=80tcp # 阻止通過tcp訪問3306
firewall-cmd --add-port=233/udp # 開放通過udp訪問233
firewall-cmd --list-ports # 檢視開放的埠
(9) 偽裝 IP
firewall-cmd --query-masquerade # 檢查是否允許偽裝IP
firewall-cmd --add-masquerade # 允許防火牆偽裝IP
firewall-cmd --remove-masquerade # 禁止防火牆偽裝IP
(10) 埠轉發
埠轉發可以將指定地址訪問指定的埠時,將流量轉發至指定地址的指定埠。轉發的目的如果不指定 ip 的話就預設為本機,如果指定了 ip 卻沒指定埠,則預設使用來源埠。 如果配置好埠轉發之後不能用,可以檢查下面兩個問題:
比如我將 80 埠轉發至 8080 埠,首先檢查本地的 80 埠和目標的 8080 埠是否開放監聽了
其次檢查是否允許偽裝 IP,沒允許的話要開啟偽裝 IP
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 將80埠的流量轉發至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 將80埠的流量轉發至192.168.0.1
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 將80埠的流量轉發至192.168.0.1的8080埠