Linux上新用的防火牆軟件,跟iptables差不多的工具
補充說明
firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性,最大的好處有兩個:支持動態更新,不用重啟服務;第二個就是加入了防火牆的“zone”概念。
firewalld跟iptables比起來至少有兩大好處:
- firewalld可以動態修改單條規則,而不需要像iptables那樣,在修改了規則后必須得全部刷新才可以生效。
- firewalld在使用上要比iptables人性化很多,即使不明白“五張表五條鏈”而且對TCP/IP協議也不理解也可以實現大部分功能。
firewalld自身並不具備防火牆的功能,而是和iptables一樣需要通過內核的netfilter來實現,也就是說firewalld和 iptables一樣,他們的作用都是用於維護規則,而真正使用規則干活的是內核的netfilter,只不過firewalld和iptables的結 構以及使用方法不一樣罷了。
命令格式
firewall-cmd [選項 ... ]
選項
通用選項
-h, --help # 顯示幫助信息; -V, --version # 顯示版本信息. (這個選項不能與其他選項組合); -q, --quiet # 不打印狀態消息;
狀態選項
--state # 顯示firewalld的狀態; --reload # 不中斷服務的重新加載; --complete-reload # 中斷所有連接的重新加載; --runtime-to-permanent # 將當前防火牆的規則永久保存; --check-config # 檢查配置正確性;
日志選項
--get-log-denied # 獲取記錄被拒絕的日志; --set-log-denied=<value> # 設置記錄被拒絕的日志,只能為 'all','unicast','broadcast','multicast','off' 其中的一個;
實例
# 安裝firewalld yum install firewalld firewall-config systemctl start firewalld # 啟動 systemctl stop firewalld # 停止 systemctl enable firewalld # 啟用自動啟動 systemctl disable firewalld # 禁用自動啟動 systemctl status firewalld # 或者 firewall-cmd --state 查看狀態 # 關閉服務的方法 # 你也可以關閉目前還不熟悉的FirewallD防火牆,而使用iptables,命令如下: systemctl stop firewalld systemctl disable firewalld yum install iptables-services systemctl start iptables systemctl enable iptables
配置firewalld
firewall-cmd --version # 查看版本 firewall-cmd --help # 查看幫助 # 查看設置: firewall-cmd --state # 顯示狀態 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 # 更新防火牆規則 firewall-cmd --complete-reload # 兩者的區別就是第一個無需斷開連接,就是firewalld特性之一動態添加規則,第二個需要斷開連接,類似重啟服務 # 將接口添加到區域,默認接口都在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 # 若要永久生效方法同上 # 打開一個服務,類似於將端口可視化,服務需要在配置文件中添加,/etc/firewalld 目錄下有services文件夾,這個不詳細說了,詳情參考文檔 firewall-cmd --zone=work --add-service=smtp # 移除服務 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
服務管理
# 顯示服務列表 Amanda, FTP, Samba和TFTP等最重要的服務已經被FirewallD提供相應的服務,可以使用如下命令查看: firewall-cmd --get-services # 允許SSH服務通過 firewall-cmd --new-service=ssh # 禁止SSH服務通過 firewall-cmd --delete-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 # 在不改變狀態的條件下重新加載防火牆
端口管理
# 打開443/TCP端口 firewall-cmd --add-port=443/tcp # 永久打開3690/TCP端口 firewall-cmd --permanent --add-port=3690/tcp # 永久打開端口好像需要reload一下,臨時打開好像不用,如果用了reload臨時打開的端口就失效了 # 其它服務也可能是這樣的,這個沒有測試 firewall-cmd --reload # 查看防火牆,添加的端口也可以看到 firewall-cmd --list-all
直接模式
# FirewallD包括一種直接模式,使用它可以完成一些工作,例如打開TCP協議的9999端口 firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT firewall-cmd --reload
自定義服務管理
選項
(末尾帶有 [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>[/<mask>] Set destination for ipv to address in service [P only] --service=<服務名> --remove-destination=