1. 程式人生 > 實用技巧 >Firewalld防火牆

Firewalld防火牆

Firewalld防火牆

防火牆安全概述

在CentOS7系統中集成了多款防火牆管理工具,預設啟用的是firewalld(動態防火牆管理器)防火牆管理工具,Firewalld支援CLI(命令列)以及GUI(圖形)的兩種管理方式。

對於接觸Linux較早的人員對Iptables比較熟悉,但由於Iptables的規則比較的麻煩,並且對網路有一定要求,所以學習成本較高。但firewalld的學習對網路並沒有那麼高的要求,相對iptables來說要簡單不少,所以建議剛接觸CentOS7系統的人員直接學習Firewalld。
需要注意的是:如果開啟防火牆工具,並且沒有配置任何允許的規則,那麼從外部訪問防火牆裝置預設會被阻止,但是如果直接從防火牆內部往外部流出的流量預設會被允許。

firewalld 只能做和IP/Port相關的限制,web相關的限制無法實現。

二、防火牆使用區域管理

1.防火牆區域

區域選項 預設規則策略
trusted 允許所有的資料包流入流出
home 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、mdns、ipp-client、amba-client與dhcpv6-client服務相關,則允許流量
internal 等同於home區域
work 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、ipp-client、dhcpv6-client服務相關,則允許流量
public 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、dhcpv6-client服務相關,則允許流量
external 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量
dmz 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量
block 拒絕流入的流量,除非與流出的流量相關
drop 拒絕流入的流量,除非與流出的流量相關
trusted: 白名單
public:預設
drop:黑名單

2.防火牆引數

引數 作用
zone區域相關指令
--get-default-zone 獲取預設的區域名稱
--set-default-zone=<區域名稱> 設定預設的區域,使其永久生效
--get-active-zones 顯示當前正在使用的區域與網絡卡名稱
--get-zones 顯示總共可用的區域
services服務相關命令
--get-services 列出服務列表中所有可管理的服務
--add-service= 設定預設區域允許該填加服務的流量
--remove-service= 設定預設區域不允許該刪除服務的流量
Port埠相關指令
--add-port=<埠號/協議> 設定預設區域允許該填加埠的流量
--remove-port=<埠號/協議> 置預設區域不允許該刪除埠的流量
Interface網站相關指令
--add-interface=<網絡卡名稱> 將源自該網絡卡的所有流量都導向某個指定區域
--change-interface=<網絡卡名稱> 將某個網絡卡與區域進行關聯
其他相關指令
--list-all 顯示當前區域的網絡卡配置引數、資源、埠以及服務等資訊
--reload 讓“永久生效”的配置規則立即生效,並覆蓋當前的配置規則

三、防火牆配置策略

為了能正常使用firewalld服務和相關工具去管理防火牆,必須啟動firewalld服務,同時關閉以前舊的防火牆相關服務,需要注意firewalld的規則分為兩種狀態:

runtime執行時: 修改規則馬上生效,但如果重啟服務則馬上失效,測試建議。
permanent持久配置: 修改規則後需要reload過載服務才會生效,生產建議。

#永久生效使用:
[root@web01 services]# firewall-cmd --add-port=80/udp
success
	
[root@web01 services]# firewall-cmd --add-port=80/udp --permanent
success

1.禁用防火牆

#1. 禁用舊版防火牆服務或保證沒啟動
[root@web01 ~]# systemctl mask iptables
Created symlink from /etc/systemd/system/iptables.service to /dev/null.
[root@web01 ~]# systemctl mask ip6tables
Created symlink from /etc/systemd/system/ip6tables.service to /dev/null.

#2. 啟動firewalld防火牆,並加入開機自啟動服務
[root@m01 ~]# systemctl start firewalld
[root@m01 ~]# systemctl enable firewalld

#3.取消禁用防火牆
[root@web01 ~]# systemctl unmask iptables

2.啟動防火牆

[root@web01 services]# systemctl start firewalld
[root@web01 services]# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.

3.firewalld 常用命令

#1.檢視預設使用的區域
[root@web01 services]# firewall-cmd --get-default-zone
public

#2.檢視預設區域的規則
[root@web01 services]# firewall-cmd --list-all
public (active)						#區域名字(活躍的在使用的)
  target: default					#狀態:預設
  icmp-block-inversion: no			#ICMP
  interfaces: eth0 eth1				#區域繫結的網絡卡
  sources: 							#允許的源IP
  services: ssh dhcpv6-client		#允許的服務
  ports: 							#允許的埠
  protocols: 						#允許的協議
  masquerade: no					#IP偽裝
  forward-ports: 					#埠轉發
  source-ports: 					#來源埠
  icmp-blocks: 						#icmp塊
  rich rules: 						#富規則

#3.檢視指定區域的規則
[root@web01 services]# firewall-cmd --list-all --zone=drop
drop
  target: DROP
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:
  
#4.查詢某區域是否允許某服務
[root@web01 services]# firewall-cmd --zone=public --query-service=ssh
yes

#5.重啟防火牆
[root@web01 services]# firewall-cmd --reload
success

#6.同時配置多個服務
[root@web01 services]# firewall-cmd --add-service={ssh,httpd}
success

4.配置測試

配置要求:調整防火牆,預設區域拒絕所有的流量,如果來源IP是10.0.0.0/24則允許

#移除public區域所有操作
[root@web01 services]# firewall-cmd --remove-service=ssh
success
[root@web01 services]# firewall-cmd --remove-service=dhcpv6-client
success

#配置允許的網段到trusted區域
[root@web01 services]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted 
success

四、防火牆配置放行策略

1.firewalld放行服務

#放行mysql服務(firewalld已存在的服務)
[root@web01 ~]# firewall-cmd --add-service=mysql
success

#放行nginx服務(firewalld中不存在的服務)
[root@web01 ~]# cd /usr/lib/firewalld/services
[root@web01 services]# cp mysql.xml nginx.xml
[root@web01 services]# vim nginx.xml 
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Nginx</short>
  <description>Nginx Server</description>
  <port protocol="tcp" port="80"/>
</service>
[root@web01 services]# firewall-cmd --reload
success
[root@web01 services]# firewall-cmd --add-service=nginx
success
[root@web01 services]#

2.firewalld放行埠

[root@web01 services]# firewall-cmd --add-port=80/tcp

[root@web01 services]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources: 
  services: ssh dhcpv6-client
  ports: 80/tcp 80/udp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

3.firewalld放行網段

[root@web01 services]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted

五、防火牆埠轉發策略

埠轉發是指傳統的目標地址對映,實現外網訪問內網資源,firewalld轉發命令格式為:
firewalld-cmd --permanent --zone=<區域> --add-forward-port=port=<源埠號>:proto=<協議>:toport=<目標埠號>:toaddr=<目標IP地址>

如果需要將本地的10.0.0.7:5555埠轉發至後端172.16.1.8:22埠

#1.配置埠轉發
[root@web01 ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=5555:proto=tcp:toport=22:toaddr=172.16.1.8
success
[root@web01 ~]# firewall-cmd --reload

#2.開啟IP偽裝
[root@web01 ~]# firewall-cmd --add-masquerade 
success
[root@web01 ~]# firewall-cmd --add-masquerade --permanent 
success

#3.測試訪問
[root@m01 ~]# ssh 10.0.0.7 -p5555
[email protected]'s password: 
Last login: Tue Jul  7 01:06:01 2020 from 172.16.1.7
[root@web02 ~]# 

六、防火牆富規則

firewalld中的富語言規則表示更細緻,更詳細的防火牆策略配置,他可以針對系統服務、埠號、原地址和目標地址等諸多資訊進行更有針對性的策略配置,優先順序在所有的防火牆策略中也是最高的,下面為firewalld富語言規則幫助手冊

1.富規則語法

[root@web01 ~]# man firewalld.richlanguage
           rule
             [source]
             [destination]
             service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
             [log]
             [audit]
             [accept|reject|drop|mark]
             
rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol value"
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
accept | reject [type="reject type"] | drop

2.富規則常用命令

--add-rich-rule='<RULE>'        #在指定的區域新增一條富語言規則
--remove-rich-rule='<RULE>'     #在指定的區刪除一條富語言規則
--query-rich-rule='<RULE>'      #找到規則返回yes,找不到返回no
--list-rich-rules               #列出指定區裡的所有富語言規則

3.例項一:

要求:比如允許10.0.0.1主機能夠訪問http服務,允許172.16.1.0/24能訪問22埠

#允許10.0.0.1主機能夠訪問http服務
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 service name=http accept'
success

#允許172.16.1.0/24能訪問22埠
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port port=22 protocol=tcp accept'
success

4.例項二:預設public區域對外開放所有人能通過ssh服務連線,但拒絕172.16.1.0/24網段通過ssh連線伺服器

[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh drop'
success

[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh reject'
success

#拒絕連線:drop  reject
drop直接丟棄,不返回任何內容
reject拒絕,返回拒絕的結果

5.例項三:使用firewalld,允許所有人能訪問http,https服務,但只有10.0.0.1主機可以訪問ssh服務

#允許所有人能訪問http,https服務
[root@web01 ~]# firewall-cmd --add-service={http,https}
success

#但只有10.0.0.1主機可以訪問ssh服務
[root@web01 ~]# firewall-cmd --remove-service=ssh
success
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.61 service name=ssh accept'
success

6.當用戶來源IP地址是10.0.0.1主機,則將使用者請求的5555埠轉發至後端172.16.1.8的22埠

[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 forward-port port=5555 protocol=tcp to-port=22  to-addr=172.16.1.8'
success

七、防火牆規則備份

我們所有針對public區域編寫的永久新增的規則都會寫入備份檔案(--permanent) /etc/firewalld/zones/public.xml

#我們防火牆的配置,永久生效後會儲存在 /etc/firewalld/zones/目錄下,所以,以後進行伺服器擴充套件,或者配置相同防火牆時,只需要拷貝該目錄下的檔案即可

備份也備份以上目錄下的檔案即可

八、防火牆內部共享上網

1.開啟防火牆IP偽裝

[root@web01 ~]# firewall-cmd --add-masquerade --permanent 
success
[root@web01 ~]# firewall-cmd --add-masquerade
success

2.防火牆開啟核心轉發(如果是Centos6,需要配置)

[root@web01 ~]# sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1

#配置核心轉發
[root@m01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

#在CentOS6中開啟之後生效命令
[root@m01 ~]# sysctl -p

#檢視核心轉發是否開啟
[root@m01 ~]# sysctl -a|grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1

3.配置沒有外網的機器閘道器地址

[root@web01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
#新增配置
GATEWAY=172.16.1.7    #防火牆內網地址
DNS1=223.5.5.5

#重啟網絡卡
[root@web01 ~]# ifdown eth1
[root@web01 ~]# ifup eth1