Firewalld防火牆
阿新 • • 發佈:2020-08-18
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