目录
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 目录下
在网络安全领域,各类应用系统或操作平台的 配置信息和 日志信息,是进行安全分析非常重要的参考。