firewalld介紹和原理
firewalld是一個服務,這個服務提供了防火墻配置的工具
只要開啟了firewalld服務,那么就可以通過firewall服務提供的工具來配置防火墻
Linux本身不具備防火墻功能,而是通過內(nèi)核的net_filter模塊來實現(xiàn)軟防火墻功能,而且你必須通過iptables才能和net_filter進行交互
默認在rhel7和fedora20,centos7以上的版本默認安裝了firewalld服務,默認是開啟的
## 開啟防火墻
[root@client ~]# systemctl start firewalld
## 查看firewalld狀態(tài)
[root@client ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
Active: active (running) since Wed 2024-03-20 15:47:15 CST; 1min 23s ago
Docs: man:firewalld(1)
Main PID: 4076 (firewalld)
Tasks: 2 (limit: 10803)
Memory: 25.7M
CPU: 375ms
CGroup: /system.slice/firewalld.service
└─4076 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid
Mar 20 15:47:14 client systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 20 15:47:15 client systemd[1]: Started firewalld - dynamic firewall daemon.
## 查看iptables規(guī)則
firewalld的服務提供了一個更加簡單的方式來配置防火墻,原理就是firewalld服務將你的防火墻配置命令轉(zhuǎn)換成iptables規(guī)則
firewalld提供了兩中管理工具,一種圖形化管理工具firewall-offline-cmd
,另一種命令行管理工具firewall-cmd
。
firewall-cmd原理
firewalld提供了zone的概念,zone是區(qū)域的意思,firewalld將我們的系統(tǒng)劃分成了一個個zone。
znoe的邊界取決于網(wǎng)卡
firewalld提供了zone,一個網(wǎng)卡只能屬于一個zone,那zone的邊界就是屬于該zone的網(wǎng)卡。
firewalld的zone里面有網(wǎng)卡,有規(guī)則(rule)。如果一個網(wǎng)卡屬于firewalld的某個zone,那么這個zone里面的所有規(guī)則都會應用到該zone內(nèi)的網(wǎng)卡
-
網(wǎng)卡,zone和規(guī)則
zone包含網(wǎng)卡和規(guī)則,網(wǎng)卡在zone里面就應用這個zone里面的規(guī)則
我們把firewalld學明白,就搞定這三個感念
zone的概念比較簡單,將網(wǎng)卡劃分入zone也很簡單,復雜的就只有規(guī)則(rule)。
firewalld的操作
zone
列出所有的zone
[root@server ~]# firewall-cmd --list-all-zones
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
...
?只要不是特別復雜的網(wǎng)絡場景,一個zone可以解決我們所有的問題
列出"缺省的zone"的規(guī)則
[root@server ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160 ens224
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
firewall-cmd添加規(guī)則正常來說必須指定zone,因為規(guī)則實在zone里面,那你肯定添加規(guī)則的時候要指定這個規(guī)則在哪個zone里面。
有些時候如果每一次添加規(guī)則都指定zone會顯得比較復雜,因為大多數(shù)情況下一個zone就能滿足我的需求,所以firewalld給我們提供一個缺省的zone,沒有指定zone的操作,都相當于操作缺省的zone。
列出指定zone的規(guī)則
## 列出home zone的規(guī)則
[root@server ~]# firewall-cmd --list-all --zone=home
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
查看缺省的zone
[root@server ~]# firewall-cmd --get-default-zone
public
可以看到缺省的zone的名字為public
-
將缺省的zone更改為其他zone
## 將缺省的zone更改為home zone
[root@server ~]# firewall-cmd --set-default-zone=home
success
[root@server ~]# firewall-cmd --get-default-zone
home
可以看到現(xiàn)在缺省的zone變成了home zone
## 將默認的zone改回來
[root@server ~]# firewall-cmd --set-default-zone=public
success
[root@server ~]# firewall-cmd --get-default-zone
public
網(wǎng)卡(interface)
默認Linux的所有網(wǎng)卡都在默認的zone里面
注意:像我們講的這種防火墻,無論iptables還是firewalld,都只能應用于內(nèi)核管理的網(wǎng)卡,有些網(wǎng)卡如果不受內(nèi)核管理,那防火墻的規(guī)則也無法應用,應用管理防火墻的工具(DBDK)
列出當前zone中的網(wǎng)卡
[root@server ~]# firewall-cmd --list-interfaces --zone=public
ens224 ens160
不加--zone=public
,列出的是缺省的zone的網(wǎng)卡
移除一個zone中的網(wǎng)卡
[root@server ~]# firewall-cmd --remove-interface=ens160
success
[root@server ~]# firewall-cmd --list-interfaces
ens224
給一個zone添加網(wǎng)卡
[root@server ~]# firewall-cmd --add-interface=ens160 --zone=public
success
[root@server ~]# firewall-cmd --list-interfaces
ens160 ens224
規(guī)則(rule)
查看指定zone的規(guī)則
[root@server ~]# firewall-cmd --list-all --zone=home
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@server ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160 ens224
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
如果一個zone里面沒有網(wǎng)卡,那么這個zone就是非active狀態(tài) 一個zone里面必須要有網(wǎng)卡,這個zone才有實際意義
三種規(guī)則
第一種:service規(guī)則
第二種:port規(guī)則
第三種:rich rule(富規(guī)則)
service規(guī)則
查看指定zone的service規(guī)則
## 查看home和缺省的zone的service規(guī)則
[root@server ~]# firewall-cmd --list-services --zone=home
cockpit dhcpv6-client mdns samba-client ssh
[root@server ~]# firewall-cmd --list-services
cockpit dhcpv6-client ssh
添加service規(guī)則
## 給home和缺省的zone添加ftp規(guī)則
[root@server ~]# firewall-cmd --add-service=ftp
success
[root@server ~]# firewall-cmd --add-service=ftp --zone=home
success
[root@server ~]# firewall-cmd --list-services --zone=public
cockpit dhcpv6-client ftp ssh
[root@server ~]# firewall-cmd --list-services --zone=home
cockpit dhcpv6-client ftp mdns samba-client ssh
可以看到,在兩個中有了ftp的規(guī)則
現(xiàn)在ftp的流量就可以過來,但不是所有的流量都能進來
刪除service規(guī)則
## 刪除剛才定義的ftp的規(guī)則
[root@server ~]# firewall-cmd --remove-service=ftp
success
[root@server ~]# firewall-cmd --remove-service=ftp --zone=home
success
[root@server ~]# firewall-cmd --list-services --zone=home
cockpit dhcpv6-client mdns samba-client ssh
[root@server ~]# firewall-cmd --list-services
cockpit dhcpv6-client ssh
測試
可以搭建一個web服務器進行測試
1、在server搭建http服務
[root@server ~]# yum install -y httpd
[root@server ~]# echo firewalld-test >> /var/www/html/index.html
[root@server ~]# systemctl restart httpd
2、訪問
[root@server ~]# curl 192.168.200.128
firewalld-test
[root@client ~]# curl 192.168.200.128
curl: (7) Failed to connect to 192.168.200.128 port 80: No route to host
3、寫入規(guī)則
[root@server ~]# firewall-cmd --add-service=http
success
4、再次訪問
[root@client ~]# curl 192.168.200.128
firewalld-test
把規(guī)則寫入之后就可以對http進行訪問了
service的原理
在/usr/lib/firewalld/services/
目錄下有許多xml
文件,這些文件就定義一些常用service的的端口號
## 查看https.xml
[root@client ~]# cat /usr/lib/firewalld/services/https.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Secure WWW (HTTPS)</short>
<description>HTTPS is a modified HTTP used to serve Web pages when security is important. Examples are sites that require logins like stores or web mail. This option is not required for viewing pages locally or developing Web pages. You need the httpd package installed for this option to be useful.</description>
<port protocol="tcp" port="443"/>
</service>
在添加service的規(guī)則的時候,實際上就是firewalld將443端口開放,讓外面的服務可以通過這個端口號進行訪問
這個service規(guī)則只是一個名字,至于service到底放行的是什么,就要看這個service代表的端口號是多少,這個service也可以自己來編寫
如果你要放行的端口并沒有在service規(guī)則的xml文件里面定義,那么你就不能用service規(guī)則滿足你的條件
如果是復雜的流量的話,你需要通過port規(guī)則放行流量,也可以自己編寫service規(guī)則
port規(guī)則
添加port規(guī)則
[root@server ~]# firewall-cmd --add-port=3333/tcp
success
[root@server ~]# firewall-cmd --add-port=5555/udp
success
查看port規(guī)則
[root@server ~]# firewall-cmd --list-ports --zone=public
3333/tcp 5555/udp
[root@server ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160 ens224
sources:
services: cockpit dhcpv6-client ssh
ports: 3333/tcp 5555/udp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
刪除port規(guī)則
[root@server ~]# firewall-cmd --remove-port=3333/tcp
success
[root@server ~]# firewall-cmd --remove-port=5555/udp
success
[root@server ~]# firewall-cmd --list-ports --zone=public
[root@server ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160 ens224
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rich rule
有點像iptables
添加rich rule
[root@server ~]# firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.200.0/24 port port=8080 protocol=tcp reject"
success
使添加的規(guī)則永久生效
上面做的規(guī)則都是臨時的
方式一
如果讓上面做的臨時規(guī)則變成永久的,可以使用一下命令
[root@server ~]# firewall-cmd --runtime-to-permanent
success
如果使用firewall-cmd --reload
命令之后規(guī)則還會存在,就是永久的規(guī)則
firewall-cmd --reload
:表示重新加載防火墻規(guī)則
[root@server ~]# firewall-cmd --reload
success
[root@server ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160 ens224
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.200.0/24" port port="8080" protocol="tcp" reject
方式二
使用--permanent
,在規(guī)則后面添加這一條命令,就可以直接創(chuàng)建永久規(guī)則
但是不會立即生效,在list中不會顯示,如果要立即生效,就需要使用--reload
[root@server ~]# firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.200.0/24 port port=443 protocol=tcp accept" --permanent
success
## 進行查看
[root@server ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160 ens224
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.200.0/24" port port="8080" protocol="tcp" reject
## 可以看到定義的規(guī)則并沒有立即生效
## 使用--reload
[root@server ~]# firewall-cmd --reload
success
[root@server ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160 ens224
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.200.0/24" port port="8080" protocol="tcp" reject
rule family="ipv4" source address="192.168.200.0/24" port port="443" protocol="tcp" accept
可以看到在使用--permanent
之后并沒有立即生效,在執(zhí)行--reload
之后,配置就會重新加載
建議
建議先寫一遍有--permanent
,在寫一遍沒有--permanent
的
[root@server ~]# firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.200.0/24 port port=443 protocol=tcp accept" --permanent
[root@server ~]# firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.200.0/24 port port=443 protocol=tcp accept"
一條命令執(zhí)行兩邊文章來源:http://www.zghlxwxcb.cn/news/detail-846761.html
刪除rich rule
[root@server ~]# firewall-cmd --remove-rich-rule="rule family=ipv4 source address=192.168.200.0/24 port port=443 protocol=tcp accept" --permanent
success
[root@server ~]# firewall-cmd --remove-rich-rule="rule family=ipv4 source address=192.168.200.0/24 port port=443 protocol=tcp accept"
刪除和添加一樣,永久添加不會立即執(zhí)行,臨時添加重啟之后就會消失,所以還是建議使用這種方式進行刪除文章來源地址http://www.zghlxwxcb.cn/news/detail-846761.html
到了這里,關于Linux中的防火墻————Firewalld的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!