跳至內容

Linux防火牆之Firewalld

更新時間
快连VPN:速度和安全性最佳的VPN服务
快连VPN:速度和安全性最佳的VPN服务

firewall 防火牆

firewalld服務有cli和gui兩種工作模式。相較於iptables,firewall支持動態更新,並引入了區域(zone)的概念。

簡而言之,區域是指防火牆預先定義的一組防火牆策略,使得防火牆之間可以快速切換這些策略,從而顯著提高了防火牆的切換效率和應用速度。

區域 默認策略規則
trusted 允許所有數據包
home 拒絕流入流量,但是與ssh,mdns,ipp-client,dhcpv6-client服務則允許通過
internal 等同於home區域
work 拒絕流入流量,但是與ssh,ipp-client,dhcpv6-client服務則允許通過
public 拒絕流入流量,但是與ssh,ipp-client,dhcpv6-client服務則允許通過
external 拒絕流入流量,但是與ssh服務相關則允許通過
dmz 拒絕流入流量,但是與ssh服務相關則允許通過
block 拒絕流入流量,除非與流出的流量相關
drop 拒絕流入流量,除非與流出的流量相關

firewalld是Linux系統上的一種動態防火牆管理工具。它是Centos7系統默認的防火牆管理工具,取代了之前的iptables防火牆。

Firewalld主要在網絡層工作,是一種包過濾防火牆。與傳統的iptables相比,firewalld更加靈活易用,能實現更細緻的網絡訪問控制。

firewalld防火牆主要由區域(zone)和服務(Service)兩個方面組成。區域定義了不同部分的網絡,併爲每個區域設定了一組規則集合。例如,public區域適用於公共互聯網環境下的主機,而internal區域適用於內部網絡環境下的主機。另一方面,服務(Service)是一組預定義規則,用於控制對特定端口的訪問權限。通過配置區域和服務規則,可以有效管理防火牆,確保網絡安全。

firewalld是一個動態防火牆管理工具,支持網絡區域、安全等級定義的網絡連接和接口。它可配置IPv4、IPv6防火牆設置,以及以太網橋。提供運行時配置和永久配置兩種模式。

防火牆狀態查詢命令:一些常用的防火牆狀態查詢命令,僅需指定完整參數即可獲取當前防火牆狀態。

[root@localhost ~]# firewall-cmd --state #顯示運行狀態[root@localhost ~]# firewall-cmd --get-zones #顯示所有zone區域[root@localhost ~]# firewall-cmd --get-active-zones#顯示當前使用的區域[root@localhost ~]# firewall-cmd --get-default-zone#顯示默認使用的區域[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32 #查看ens32網口的區域[root@localhost ~]# firewall-cmd --zone=public --list-ports#顯示public區域所有開放的端口
登錄後複製

防火牆服務放行命令: 首先我們通過參數--panic-on拒絕所有,並通過--add-service放行NFS服務所對應的端口號.

[root@localhost ~]# firewall-cmd --get-services #顯示服務列表[root@localhost ~]# firewall-cmd --list-service #查詢當前放行服務[root@localhost ~]# firewall-cmd --panic-on #拒絕所有包[root@localhost ~]# firewall-cmd --panic-off#取消拒絕狀態[root@localhost ~]# firewall-cmd --query-panic#查看是否拒絕[root@localhost ~]# firewall-cmd --reload #重新加載防火牆[root@localhost ~]# firewall-cmd --add-service=nfs#臨時允許nfs服務通過[root@localhost ~]# firewall-cmd --add-service=nfs --permanent#永久允許nfs服務通過#放行https服務數據包通過[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 service name=httpd accept'[root@localhost ~]# firewall-cmd --list-rich-rulerule family="ipv4" source address="192.168.1.0/24" service name="https" accept
登錄後複製

防火牆端口放行命令: 我們可使用--add-port命令增加開啓某端口,也可使用--remove-port阻止某端口,使用端口號與服務名均可.

[root@localhost ~]# firewall-cmd --list-all #顯示所有端口列表[root@localhost ~]# firewall-cmd --list-services#查看開放的服務[root@localhost ~]# firewall-cmd --list-ports #查看開放的端口[root@localhost ~]# firewall-cmd --add-port=443/tcp #臨時開啓443端口[root@localhost ~]# firewall-cmd --remove-port=443/tcp#刪除443端口[root@localhost ~]# firewall-cmd --add-service=mysql#開放mysql端口[root@localhost ~]# firewall-cmd --remove-service=http#阻止http端口[root@localhost ~]# firewall-cmd --add-port=3306/tcp#開放通過tcp訪問3306[root@localhost ~]# firewall-cmd --remove-port=80/tcp #阻止通過tcp訪問3306[root@localhost ~]# firewall-cmd --add-port=233/udp #開放通過udp訪問233#臨時放行8080端口,和8081端口[root@localhost ~]# firewall-cmd --zone=public --add-port=8080-8081/tcpsuccess[root@localhost ~]# firewall-cmd --zone=public --list-ports8080-8081/tcp#放行本地的3260端口[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 port port=3260 protocol=tcp accept'
登錄後複製

防火牆配置端口轉發: 端口轉發功能當用戶訪問本機80端口是自動轉發到本機或目標主機的某個端口上.

#將80端口的流量轉發至8080[root@localhost ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080#將80端口的流量轉發至192.168.1.1[root@localhost ~]# firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1.1#將80端口的流量轉發至192.168.1.1的8080端口上[root@localhost ~]# firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1:toport=8080
登錄後複製

查詢與設置默認區域: 查詢firewall服務當前所使用的區域,同時設置服務新的默認區域爲external區域.

#查詢firewall服務當前所使用的區域[root@localhost ~]# firewall-cmd --get-default-zonepublic#查看ens32網卡的所在區域信息[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32public#設置默認區域爲external[root@localhost ~]# firewall-cmd --set-default-zone=externalsuccess[root@localhost ~]# firewall-cmd --get-default-zoneexternal
登錄後複製

修改默認區域到新區域: 修改ens32網口的public區域到external區域,並永久生效.

[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32public[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32 --permanentsuccess[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32external
登錄後複製

設置某區域服務狀態: 設置某個區域是否允許請求SSH和HTTPS協議的流量

#查詢public區域內是否放行了ssh,https服務[root@localhost ~]# firewall-cmd --zone=public --query-service=sshyes[root@localhost ~]# firewall-cmd --zone=public --query-service=httpsno#把public區域的https請求,永久允許通過[root@localhost ~]# firewall-cmd --zone=public --add-service=httpssuccess[root@localhost ~]# firewall-cmd --zone=public --add-service=https --permanentsuccess#把public區域的https請求,設置爲永久拒絕.[root@localhost ~]# firewall-cmd --zone=public --remove-service=httpssuccess[root@localhost ~]# firewall-cmd --zone=public --remove-service=https --permanentsuccess
登錄後複製

設置端口轉發策略: 在192.168.1.0/24網絡中的系統,訪問本地端口5423將被轉發到本地的80端口.

[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 forward-port port=5423 protocol=tcp to-port=80' --permanent
登錄後複製

允許/移除訪問端口: 批量允許或移除某個區域內某個主機的端口策略.

# 允許/移除 192.168.1.10 所有訪問所有端口firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanentfirewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanentfirewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" drop' --permanent# 允許192.168.2.0/24所有訪問所有端口firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" accept' --permanent# 允許192.168.10訪問22端口firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent# 移除192.168.10訪問22端口firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent# 允許192.168.1.0/24訪問22端口firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" port port=22 protocol=tcp accept'
登錄後複製

防火牆技術種類:

(1)包過濾防火牆(packet filtering)

(2)應用代理防火牆 (application proxy)

(3)狀態檢測防火牆(stateful inspection)

(firewalld是包過濾防火牆,所以這裏只講包過濾防火牆)

包過濾防火牆概述:

(1)netfilter:位於Linux內核中的包過濾功能體系,成爲Linux防火牆的“內核態”。

(2)firewalld:CentOS7默認的管理防火牆規則的工具,成爲Linux防火牆的“用戶態”。

————上面的兩種稱呼都可以表示爲Linux防火牆。

包過濾的工作層次:

(1)主要是網絡層,針對IP數據包、檢查源IP。

(2)體現在對包內的IP地址、端口等信息的處理上。

網絡區域:

Firewalld預定義的九種網絡區域:

①trusted②public③work④home⑤internal⑥external⑦dmz⑧block⑨drop

————默認情況就有一些有效的區域,由firewalld提供的區域按照從不信任到信任的順序排序。

(1)丟棄區域(Drop Zone):如果使用丟棄區域,任何進入的數據包將被丟棄,這個類似於Centos6上的 iptables -j drop ,使用丟棄規則意味着將不存在相應。

(2)阻塞區域(Block Zone):阻塞區域會拒絕進入的網絡連接,返回icmp-host-prohibited,只有服務器已經建立的連接會被通過,即只允許由該系統初始化的網絡連接。

(3)公共區域(Public Zone):只接受那些被選中的連接,默認只允許ssh和dhcpv6-client,這個zone是缺省zone(缺省就是默認的意思,所以公共區域也是默認區域,在沒有任何配置的情況下走的是公共區域)。

(4)外部區域(External Zone):這個區域相當於路由器的啓動僞裝(masquerading)選項,只有指定的連接會被接受,即ssh,而其他的連接將被丟棄或者不被接受。

(5)隔離區域(DMZ Zone):如果想要只允許給部分服務能被外部訪問,可以在DMZ區域中定義,它也擁有隻通過被選中連接的特性,即ssh, 這個區域又叫做非軍事化區域。

(6)工作區域(Work Zone):在這個區域中,我們只能定義內部網絡,比如私有網絡通信才被允許, 只允許ssh、ipp-client和dhcpv6-client。

(7)家庭區域(Home Zone):這個區域專門用於家庭環境,它同樣只允許被選中的連接, 即ssh、ipp-client、mdns、samba-client和dhcpv6-client。

(8)內部區域(Internal Zone):這個區域和 工作區域(Work Zone) 類似,只允許通過被選中的連接,與 家庭區域(Home Zone) 相同。

(9)信任區域(Trusted Zone):信任區域允許所有網絡通信通過,因爲 信任區域(Trusted Zone)是最被信任的,即使沒有設置任何的服務,那麼也是被允許的,因爲 信任區域(Trusted Zone)是允許所有連接的。

————以上是系統定義的所有的區域(Zone),但是,不是所有的區域(Zone)都在使用,只有活躍的區域(Zone)纔有實際操作意義。

注意:因爲默認區域只允許ssh和dhcp,所以在沒有任何配置的情況下默認是拒絕ping包的。

常用命令

# 查看所有放行端口firewall-cmd --zone=public --list-ports # 禁止IP訪問機器firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.0.1" drop' # 禁止一個IP段,比如禁止192.168.*.*firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.0.1/16" drop' # 禁止一個IP段,比如禁止192.168.0.*firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.0.1/24" drop' # 禁止機器IP從防火牆中刪除firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address="192.168.0.1" drop' # 允許http服務(對應服務策略目錄:/usr/lib/firewalld/services/)firewall-cmd --permanent --add-service=http # 關閉http服務(對應服務策略目錄:/usr/lib/firewalld/services/)firewall-cmd --permanent --remove-service=http # 允許端口:3306firewall-cmd --permanent --add-port=3306/tcp # 允許端口:1-3306firewall-cmd --permanent --add-port=1-3306/tcp # 關閉放行中端口:3306firewall-cmd --permanent --remove-port=3306/tcp # 查看firewall的狀態firewall-cmd --state # 查看防火牆規則(只顯示/etc/firewalld/zones/public.xml中防火牆策略)firewall-cmd --list-all # 查看所有的防火牆策略(即顯示/etc/firewalld/zones/下的所有策略)firewall-cmd --list-all-zones # 重新加載配置文件firewall-cmd --reload # 更改配置後一定要重新加載配置文件firewall-cmd --reload# Postgresql端口設置。允許192.168.142.166訪問5432端口firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port port="5432" protocol="tcp" accept"# redis端口設置。允許192.168.142.166訪問6379端口firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port port="6379" protocol="tcp" accept"# beanstalkd端口設置。允許192.168.142.166訪問11300端口firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port port="11300" protocol="tcp" accept"# 查看防火牆端口列表firewall-cmd --list-ports# 添加指定端口tcpfirewall-cmd --zone=public --add-port=8080/tcp --permanent# 開放8080/tcp端口 firewall-cmd --zone=public --add-port=10002-10010/tcp --permanent# 開放10002-10010/tcp端口範圍# 添加指定端口udpfirewall-cmd --zone=public --add-port=9200/udp --permanent # 開放9200/udp端口firewall-cmd --zone=public --add-port=20015-20020/udp --permanent# 開放20015-20020/udp端口範圍# 刪除指定端口firewall-cmd --zone= public --remove-port=19800/tcp --permanent # 刪除已開放的19880/tcp端口firewall-cmd --zone= public --remove-port=9200-9300/udp --permanent# 刪除已開放的9200-9300/udp 端口範圍# 熱加載防火牆,使之生效firewall-cmd --reload# 指定某IP訪問某端口firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.107" port protocol="tcp" port="3306" accept"# 刪除策略firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.0.107" port protocol="tcp" port="3306" accept"# 指定某個網段訪問某個端口範圍firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="11.76.168.0/24" port protocol="udp" port="1-65535" accept"# 刪除策略firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="11.76.168.0/24" port protocol="tcp" port="1-65535" accept"# 禁止指定ip 訪問某個端口firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.200" port protocol="tcp" port="80" reject" # 禁止某個段的ip 訪問某個端口firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="80" reject" # 允許指定ip 訪問所有端口firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" accept"# 允許指定ip段 訪問所有端口firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" accept"# 允許192.168.1.10所有訪問所有端口firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent# 移除192.168.1.10所有訪問所有端口firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent# 允許192.168.2.0/24(0-255)所有訪問所有端口firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" accept' --permanent# 允許192.168.1.10所有訪問TCP協議的22端口firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent# 移除192.168.1.10所有訪問TCP協議的22端口firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent# 防火牆重新載入(必須重新載入後才能生效)firewall-cmd --reload# 查看rich-rules(富規則)firewall-cmd --list-rich-rules# 查看防火牆服務規則firewall-cmd --list-services# 查看防火牆所有規則firewall-cmd --list-all# 查看防火牆所有區域的配置規則firewall-cmd --list-all-zones# 查看默認區域firewall-cmd --get-default-zone# 查看網絡接口使用區域firewall-cmd --get-active-zones# 查看默認的可用服務firewall-cmd --get-services# 要啓用或禁用HTTP服務firewall-cmd --zone=public --add-service=http --permanentfirewall-cmd --zone=public --remove-service=http --permanent# 移除現有規則(此步驟相當重要,很多文章和博客都沒提及到)firewall-cmd --permanent --zone=public --remove-port=80/tcpfirewall-cmd --reload # 在192.168.100.100102上測試訪問curl192.168.100.101發現均無法再訪問101的80端口# 設置規則firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.102" port protocol="tcp" port="80" accept"firewall-cmd --reload# 測試訪問curl 192.168.100.101# 100無法訪問102可以訪問至此實現了通過防火牆firewalld設置規則,指定ip訪問指定端口
登錄後複製

以上就是Linux防火牆之Firewalld的詳細內容,更多請關注本站其它相關文章!

更新時間

發表留言

請注意,留言須先通過審核才能發佈。