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立马就可以访问了


但是如果将默认区域换为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

像这种情况优先级高,但是顺序在下面,还是根据优先级来执行规则
端口转发
端口转发可以将指定地址访问指定端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定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 目录下
文章评论