1、操作系统加固-Firewalld/IPTables
1.1 IPTables
1.1.1 概述
IPTables是Linux系统用于定义防火墙规则的工具,他是由两部分组成的,一个是IPTables,另一个是netfilter,主要工作在网络层,针对IP数据包。
1.1.2 IPTables与NetFilter的关系
NetFilter:是内核的一部分,由数据包的过滤表组成,这些表包含内核用来控制数据包过滤处理的规则。 IPTables:是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易
1.1.3 IPTables的四表五链
规则表:容纳各种规则表 规则链:容纳各种防火墙规则 原理总结:表中包含链,链中包含规则。
1.1.3.1 四表
1、Filter表:Filter表是最常用的表,用于过滤数据包,包含 INPUT、OUTPUT 和 FORWARD 三个默认的链。
2、Nat 表:用于网络地址转换(NAT功能),它包含了 PREROUTING、POSTROUTING 和 OUTPUT 三个默认的链。用于修改数据包的IP地址和端口。
3、Mangle表:Mangle 表用于修改数据包的特定字段,如 TTL(生存时间)、TOS(服务类型)等。它包含了 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING 五个默认的链。
4、Raw表:Raw 表用于跳过一些内核处理的步骤。它包含了 PREROUTING 和 OUTPUT 两个默认的链。raw 表主要用于设置连接跟踪规则。 四表的优先级:Raw > Mangle > Nat > Filter
1.1.3.1 五链
1、INPUT 链:处理入站数据,目标IP为本机IP的数据包流量
2、OUTPUT 链:处理出站数据,从本机IP出去的数据包流量
3、FORWARD 链:处理通过本地系统进行转发的数据流量。如果 Linux 系统被配置成路由器或网关,数据包将经过 FORWARD 链。
4、PREROUTING 链:处理数据包路由之前修改数据包,来修改目的地址,用来做DNAT。
5、POSTROUTING 链:处理数据包路由之后修改数据包,来修改源地址,用来做SNAT。
1.1.4 规则链之间的匹配顺序
匹配优先级分为两种情况,一种是主机防火墙,一种是网络防火墙,主机防火墙指的是,目的都是自己,不需要流量转发,网络防火墙指的是需要防火墙进行转发的数据包,比如网关是防火墙的 主机防火墙: 入站数据:来自外部的数据包,目标地址是本机,PREROUTING --> INPUT -->本机的应用程序 出站数据:从防火墙本机出去的数据包,向外部发送的本机的应用程序–> OUTPUT --> POSTROUTING
网络防火墙: 转发数据(需要经过防火墙转发): PREROUTING --> FORWARD --> POSTROUTING
1.1.5 规则链内的匹配顺序
a、自上而下依次匹配策略,匹配到执行相应的动作(允许、拒绝),并停止向下匹配
b、如果没有匹配到策略,按照这条链的默认策略,如果没改过,默认是允许
1.1.6 IPTables语法
语法格式:
iptables -t 表名 参数 规则链 -p 匹配的对象 -j 动作
参数参考:https://www.linuxcool.com/iptables
1. 不指定表名时,默认指filter表
2. 不指定链名时,默认指表内的所有链
3. 除非设置链的默认策略,否则必须指定匹配条件
4. 控制类型使用大写字母,其余均为小写
#禁止所有的ICMP协议流量进入
[root@anolis ~]# iptables -t filter -A INPUT -p icmp -j REJECT
#禁止所有的IP访问3396端口
[root@anolis ~]# iptables -t filter -A INPUT -p tcp --dport 3396 -j DROP
#禁止源IP为192.168.1.235的访问6547端口
[root@anolis ~]# iptables -t filter -A INPUT -p tcp -s 192.168.1.235 --dport 6547 -j DROP
#禁止本机流量访问外部的33端口
[root@anolis ~]# iptables -t filter -A OUTPUT -p tcp --dport 33 -j DROP
#禁止本机流量访问192.168.54.22的33端口
[root@anolis ~]# iptables -t filter -A OUTPUT -p tcp -d 192.168.54.22 --dport 33 -j DROP
#作为网络防火墙的时候,允许源IP为10.32.13.234访问目的IP为10.32.13.233的3367端口
[root@anolis ~]# iptables -t filter -A FORWARD -p tcp -s 10.32.13.234 -d 10.32.13.233 --dport 3367 -j ACCEPT
1.2 Firewalld
1.2.1 概述
Firewalld是用于定义防火墙规则的工具,而且Firewalld是对域进行管控,可以通过不同的域制定不同的规则,需要切换规则的时候可以直接切换域即可
1.2.2 IPTables与Firewalld
1.2.2.1 分析
二者都是用来定义防火墙规则的工具,而且都是指向NetFilter网络过滤系统来实现包过滤防火墙的功能。但是Firewalld有两种工作状态,一个是运行时配置一个是永久配置。
1.2.2.2 区别
- IPTables是基于接口和四表五链,来设置规则,并进行匹配执行动作
- Firewalld是基于区域,来设置规则,不同的区域有不同的规则,与硬件防火墙相似
- 二者的配置文件不同,IPTables会存储在/etc/sysconfig/iptables下面,Firewalld的配置文件在/etc/firewalld,/usr/lib/firewalld/。/etc/下面的配置文件会被优先加载。/usr/下面的是默认配置文件,各种xml文件组成
- IPTables在更改现有规则时,更改后,会清除当前的旧规则,并从/etc/sysconfig/iptables读取新的规则,但是Firewalld不会,Firewalld在改变现有规则时,不会中断现行链接
- IPTables是静态防火墙,Firewalld是动态防火墙
1.2.3 Firewalld区域描述
- trusted(信任区)∶允许所有的传入流量。
- public(公共区)∶允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝
- external (外部区): 允许与 ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装, 可用于为路由器启用了伪装功能的外部网络。
- home (家庭区)∶允许与ssh、ipp-client、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- internal (内部区)∶ 默认值时与home区域相同。
- work (工作区)∶允许与 ssh、ipp-client、dhcpv6-client 预定义服务匹配的传入流量,其余均拒绝。
- dmz (隔离区)∶允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。
- block(限制区)∶拒绝所有传入流量。
- drop(丢弃区)∶任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接
1.2.4 Firewalld语法
1.2.4.1 域管理语法
#查看默认的域
[root@anolis ~]# firewall-cmd --get-default-zone
public
#查看所有可用的域
[root@anolis ~]# firewall-cmd --get-zones
AnolisServer block dmz drop external home internal nm-shared public trusted work
#查看当前活跃的域
#这个地方要注意,Firewalld的原理是根据不同的域来进行规则的匹配的,也就是说,你写的规则要和你网卡绑定的域一致才会生效,比如我把规则卸写在了Work域,但是网卡绑定了public域,此时规则是不生效的
[root@anolis ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
#语法格式
firewall-cmd --zone=区域 --list-内容
#查看public区域的开放port
[root@anolis ~]# firewall-cmd --zone=public --list-port
22/tcp
#查看public区域的开放service
[root@anolis ~]# firewall-cmd --zone=public --list-service
dhcpv6-client ssh
#查看public区域的所有配置
[root@anolis ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports: 22/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
#查看ens33网卡绑定的域
[root@anolis ~]# firewall-cmd --get-zone-of-interface=ens33
public
#给lo网卡绑定work域,实际工作lo换成对应网卡即可
[root@anolis ~]# firewall-cmd --zone=work --add-interface=lo
success
#查看活动域,发现work域已经绑定了lo
[root@anolis ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
work
interfaces: lo
#修改lo网卡的work域为home域
[root@anolis ~]# firewall-cmd --zone=home --change-interface=lo
success
#查看,修改成功
[root@anolis ~]# firewall-cmd --get-active-zones
home
interfaces: lo
public
interfaces: ens33
#移除home域下的lo网卡
[root@anolis ~]# firewall-cmd --zone=home --remove-interface=lo
success
#移除成功
[root@anolis ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
1.2.4.2 规则管理语法
#允许访问SSH服务
[root@anolis ~]# firewall-cmd --permanent --add-service=ssh
success
#允许访问22/tcp的端口
[root@anolis ~]# firewall-cmd --permanent --add-port=22/tcp
success
#刷新配置
[root@anolis ~]# firewall-cmd --reload
success
#列出配置
[root@anolis ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh
ports: 22/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
#允许源IP访问80端口
[root@anolis ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.32.13.110" port port="80" protocol="tcp" accept'
success
#刷新配置
[root@anolis ~]# firewall-cmd --reload
success
#查看rich-rule
[root@anolis ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="10.32.13.110" port port="80" protocol="tcp" accept
#允许源IP为10.32.13.110的,访问目的IP为10.32.100.100的7761端口
#如果是拒绝访问,accept换成reject即可,这种带目的IP参数,多用于Firewalld为中间网关,需要转发流量的情况下
[root@anolis ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.32.13.110" destination address="10.32.100.100" port port="7761" protocol="tcp" accept'
success
[root@anolis ~]# firewall-cmd --reload
success
[root@anolis ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="10.32.13.110" destination address="10.32.100.100" port port="7761" protocol="tcp" accept
rule family="ipv4" source address="10.32.13.110" port port="80" protocol="tcp" accept
1.2.5 Firewalld优先级说明
按照从大到小的优先级 1、直接规则(direct):由于直接规则直接操作iptables,它们拥有最高的优先级,语法示例:
[root@anolis ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 162.12.12.0/24 -j blacklist
success
#--direct: 表示直接操作 iptables 规则,而不是通过 firewalld 的抽象层。
#--permanent: 表示将规则永久保存,即使在防火墙重启后也会生效。
#--add-rule ipv4 raw PREROUTING 0 -s 162.12.12.0/24 -j blacklist: 添加一条针对IPv4 的规则。
#raw PREROUTING: 在 PREROUTING 链中添加规则,raw 表用于配置不进行连接跟踪的数据包。
#0: 规则的优先级,数值越小优先级越高。在这里设置为 0,表示最高优先级。
#-s 162.12.12.0/24: 匹配源 IP 地址为 162.12.12.0/24 的数据包。
#-j blacklist: 将匹配到的数据包跳转到名为 blacklist 的自定义链进行处理。
2、预定义服务和端口规则: 在区域中定义的服务(即预定义端口)和额外端口规则。语法示例:
#允许访问SSH服务
[root@anolis ~]# firewall-cmd --permanent --add-service=ssh
success
#允许访问22/tcp的端口
[root@anolis ~]# firewall-cmd --permanent --add-port=22/tcp
success
3、丰富规则: 使用firewall-cmd --add-rich-rule添加的规则,提供更细致控制。语法示例:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.32.13.110" destination address="10.32.100.100" port port="7761" protocol="tcp" accept'
4、区域默认策略: 如果没有规则匹配,区域中的默认策略(通常是accept或reject)最后被应用。