Linux防火墙之Firewalld

目录

Firewalld基础应用

一、Firewalld的基本使用

IPTables的功能总结

二、区域

三、配置firewalld-cmd

运行一下命令理解firewalld规则用法:

常见使用场景

Firewalld进阶用法

常见使用场景

富规则

端口转发

扩展内容

第一部分

第二部分


Firewalld基础应用

Linux 防火墙是通过 netfilter 来处理的,它是内核级别的框架,iptables 被作为 netfilter 的用户态抽象层,iptables 将包通过一系列的规则进行检查,如果包与特定的 IP/端口/协议 的组合匹配,规则就会被应用到这个包上,以决定包是被通过、拒绝或丢弃。firewalld 是最新的 netiter 用户态抽象层。firewald 可以通过定义的源IP 和/网络接口将入站流量分考到不同区zone每个区基于指定的准则按自己配置去通过或拒绝包,另外的改进是基于 iptables 进行语法简化。firewalld 通过使用服务名而不是它的端口和协议去指定服务,使它更易于使用,例如,是使用 samba 而不是使用 UDP 端口 137和138 和TCP 端口 139 和 445、它进一步简化语法,消除了 iptables中对语句顺序的依赖。

一、Firewalld的基本使用

 启动:systemctl start firewalld
 查看状态:systemctl status firewalld
 停止:systemctl disable firewalld
 禁用:systemctl stop firewalld
 重启:systemctl restart firewalld 

IPTables的功能总结

 1.常用的两张表:filter,nat。filter用于过滤数据包,nat用于路由转发功能
 2.常用的两条链INPUT,OUTPUT
 3.常见的三个行为:ACCEPT,DROP,REJECT
 4.限制流量的三个特征:端口,协议,IP,对应的五元组: -d   -s   --dport    --sport    -p
 5.端口转发:本机端口,远程端口
 ​
 而firewalld中,没有表,没有链,没有行为,默认拒绝所有流量

二、区域

 drop:丢弃
 任何传入的网络数据包都被丢弃,没有回复,只进行传出网络连接
 ​
 block:阻止
 任何传入的网络连接都被拒绝,其中用于包含IPv4的 icmp-host-prohibited 消息和用于IPv6的icmp6-adm-prohibited。只能从系统内启动网络连接
 ​
 public:公共(默认)
 用于公共场所。您不相信网络上的其他计算机不会损害您的计算机。仅接受选定的传入链接。
 ​
 external:外部网络
 用于特别为路由器启用伪装的外部网络。您不相信网络上的其他计算机不会损害您的计算机。仅接受选定的传入链接。
 ​
 dmz:管制区
 适用于非军事区中的计算机,这些计算机可公开访问,并且对内部网络的访问权限有限。仅接受选定的传入连接
 ​
 work;工作
 用于工作区域。您最常信任网络上的其他计算机,以免损害您的计算机。进接受选定的传入连接
 ​
 home:家庭
 适用于家庭区域。您最常信任网络上的其他计算机,以免损害您的计算机。进接受选定的传入连接
 ​
 internal:内部
 用于内部网络。您最常信任网络上的其他计算机,以免损害您的计算机。进接受选定的传入连接
 ​
 trusted:受信任
 接受所有网络连接。
 可以将这些区域中的一个指定为默认区域。将接口连接添加到NetworkManager时,会将他们分配给默认区域。安装时,firewalld中的默认区域想设置为公共区域

三、配置firewalld-cmd

 firewall-cmd --list-all  #列出目前表中信息
 ​
 firewall-cmd --set-default-zone=trusted  #更改默认区域为trusted区
 ​

在更换默认区为trusted之前,我们的xampp是访问不了的,但是区域改为trusted之后xampp立马就可以访问了

image-20230925171633530

image-20230925171707597

但是如果将默认区域换为drop之后,更访问不了了,因为数据包都直接被丢弃。当然block(reject)区域(这个是带有回复的)是差不多的

 public (default,active) :  示 public 区域是默认区域(当接口启动时会自动默认),并且它是活动的。
 interfaces:ens33 列出了这个区域上关联的接口。
 sources:列出了这个区域的源。现在这里什么都没有,但是,如果这里有内容,它们该是这样的格式 xxx.xxx.xxx.xxx/xx。services: dhcpv6-cient ssh 列出了允许通过这个防火墙的服务。可以通过运行 firewal1-cmd --get-services得到一个防火定义服务的详细列表。
 ports:列出了一个允许通过这个防火墙的目标端口。它是用于你需要去允许一个没有在 firewa11d 中定义的服务的情况下
 masquerade: no 表示这个区域是否允许 IP 装。如果允许,它将允许 IP 转发,它可以让你的计算机作为一个路由器。
 forward-ports: 列出转发的端口。
 icmp-blocks: 阻赛的 icmp 流量的黑名单。
 rich rules: 在一个区域中优先处理的高级配置。
 default:是目标区域,它决定了与该区域匹配而没有由上面设置中显式处理的包的动作。

运行一下命令理解firewalld规则用法:

 查看多有打开的端口:firewall-cmd --zone==public --list-port
 更新防火墙规则:firewall-cmd --reload
 列出所有区域:firewall-cmd --get-zones
 查看区域信息:firewall-cmd --get-active-zones
 设定默认区域,立即生效:firewall-cmd --set-default-zone=public
 查看指定接口所属区域:firewall-cmd --get-zone-of-interface=ens32
 查看所有规则:firewal-cmd --list-all
 通过以下两种手段可以进行永久修改:
 firewall-cmd --permanent <some modification>
 firewall-cmd --reload
 ​

常见使用场景

 firewall-cmd --get-services  #获取firewalld找那个事先定义了那些服务,防止后面添加服务的时候出错
 ​
 firewall-cmd --add-port=80/tcp
 firewall-cmd --add-service=http
 #但是上面这些配置一旦systemctl restart firewalld就都会消失,所以为了能够是我们的配置能一直生效,我们应该用下面的方法
 firewall-cmd -add-service=http --permanent  #这条命令是将我们的配置信息写入配置文件,此时我们需要重新加载这个firewalld,不然写进去的信息没有被加载到服务中去
 firewall-cmd --reload

Firewalld进阶用法

常见使用场景

 拒绝所有包:firewall-cmd --panic-on
 取消拒绝状态:firewall-cmd --panic-off
 查看是否拒绝:firewall-cmd --query-panic
 ​
 暂时开放 ftp 服务:firewall-cmd --add-service=ftp
 永久开放 ftp 服务:firewall-cmd --add-service=ftp --permanent
 查询服务的启用状态:firewall-cmd --query-service ftp
 开放MySQL端口:firewall-cmd --add-service=mysql
 阻止http端口:firewall-cmd --remove-service=http
 查看开放的服务:firewall-cmd --list-services
 查看对应的规则库文件:cd /usr/lib/firewalld/services
 ​
 开放通过tcp访问3306:firewall-cmd --add-port=3306/tcp
 阻止通过tcp访问3306:firewall-cmd --remove-port=80/tcp
 永久开放80端口:firewall-cmd --zone=public --add-port=80/tcp --permanent
 查看80端口:firewall-cmd --zone=public --query-port=80/tcp
 查看所有开放端口:firewall-cmd --zone=public --list-ports
 删除80端口:firewall-cmd --zone=public --remove-port=80/tcp --permanent
 开放postgresql服务:firewall-cmd --add-service=postgresql --permanent
                 
 允许http服务通过1分钟:firewall-cmd --zone=public --add-service=http --timeout=1m,这个 timeout 选项是一个以秒(s),分(m)或小时(h)为单位的时间值
 ​
 重置防火墙:firewall-cmd --reload
 检查防火墙状态:firewall-cmd --state
 让设定生效:systemctl restart firewalld
 检查设定是否生效:iptables -L -n | grep 21    
                firewall-cmd --list-all       

富规则

 #在firewalld中accept和drop都是小写,但IPTables中都是大写
 #firewalld中单次都是全拼,IPTables都是简写
 ​
 ​
 添加指定ip访问特定端口规则:
 firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.1.178 port protocol=tcp port=80 accept'
 #family=ipv4  表示基于ipv4的数据包执行
 ​
 删除指定某个ip访问特定端口规则:
 firewall-cmd --permanent --remove-rich-rule 'rule family=ipv4 source address=192.168.1.178 port protocol=tcp poer=80 accept'
 ​
 禁止某个ip访问
 iptables -I INPUT -s 192.168.1.178 -j DROP
 firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.178 drop'
 ​
 允许ping:
 firewal-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp source address=192.168.1.178 accept'
 ​
 端口转发:
 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
 ​
 接受192.168.1.0网段所有ip访问ssh服务:
 firewall-cmd --add-rich-rule 'rule family=ipve source address=192.168.1.0/24 service name=ssh accept'
 ​
 直接模式:
 firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 192.168.1.178 -j ACCEPT
 #这里的数字1表示匹配时的优先级,数字越小优先级越高,建议优先级从1开始
 注意:firewall-cmd --direct --get-all-rules

image-20230926143902268

像这种情况优先级高,但是顺序在下面,还是根据优先级来执行规则

端口转发

端口转发可以将指定地址访问指定端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定ip的话就默认为本机,如果指定了ip却没有端口,则默认使用来源端口。

如果配置号端口转发之后不能用,可以去检查下面两个问题:

  • 比如我将80端口转发至8080端口,首先检查本地的80端口和目标的8080 端口是否开放监听了

  • 其次是检查是否允许伪装ip,没允许的话要开启伪装

 #将8888端口的ll转发至80端口
 firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=80
 ​
 firewall-cmd --remove-forward-port=port=8888:proto=tcp:port=80
 ​
 ​
 #开启伪装IP
 firewall-cmd --query-masquerade  #检查是否允许伪装IP
 firewall-cmd --add-masquerade  #允许防火墙伪装IP
 firewall-cmd --remove-masquerade  #禁止防火墙伪装IP
 ​
 #将8888端口的流量转发至101.37.65.91的80端口
 firewall-cmd --add-forward-port=port=8888:proto=tcp:toaddr=101.37.65.91:toport=80
  • 当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去

  • 端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。

扩展内容

第一部分

在firewalld中,--timeout参数是用于设置规则的超时时间,而富规则(rich rule)是用于定义更复杂的防火墙规则。虽然--timeout可以和普通规则一起使用,但并不能与富规则搭配使用。

富规则使用的是XML格式的规则文件,其中包含了多个规则元素和条件元素,可以定义更复杂的匹配和操作。然而,--timeout参数是针对单个规则的超时设置,无法直接应用于富规则中。

如果你想要在富规则中设置超时时间,需要在富规则中定义一个普通的规则,并使用--timeout参数进行设置。例如,你可以创建一个富规则,然后在其中定义一个规则元素,使用--timeout参数来设置超时时间。

以下是一个示例的富规则文件(假设名为rich-rule.xml):

xml

 <规则>
   <来源>
     <地址>192.168.0.0/24</地址>
   </来源>
   <目的>
     <地址>10.0.0.0/24</地址>
   </目的>
   <服务>
     <协议>tcp</协议>
     <端口>8080</端口>
   </服务>
   <规则>
     <来源>
       <地址>192.168.0.1</地址>
     </来源>
     <目的>
       <地址>10.0.0.1</地址>
     </目的>
     <协议>tcp</协议>
     <端口>8080</端口>
     <行动>允许</行动>
     <超时>300</超时> <!-- 这里设置了超时时间 -->
   </规则>
 </规则>

然后,使用firewall-cmd命令加载和应用该富规则文件:

css

 firewall-cmd --permanent --direct --add-rule rich-rule.xml
 firewall-cmd --reloadfirewall-cmd --permanent --direct --add-rule rich-rule.xml
 firewall-cmd --reload

这样,在富规则中定义的规则将会生效,并具有指定的超时时间。

请注意,上述示例仅为了演示如何在富规则中设置超时时间,并非一个完整的富规则示例。你需要根据自己的需求和环境来编写适合的富规则文件。

第二部分

了解一下firewalld 运行后台的各类配置文件、日志文件等信息,为后续课程学习做准备。在Linux中,通常配置文件是在/etc/目录下,所以可以使用 find /etc/ -name"firewal",另外,Linux下的很多日志信息都保存在 var/log 目录下

在网络安全领域,各类应用系统或操作平台的 配置信息和 日志信息,是进行安全分析非常重要的参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值