Linux系统安全加固

159 阅读9分钟

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 区别

  1. IPTables是基于接口和四表五链,来设置规则,并进行匹配执行动作
  2. Firewalld是基于区域,来设置规则,不同的区域有不同的规则,与硬件防火墙相似
  3. 二者的配置文件不同,IPTables会存储在/etc/sysconfig/iptables下面,Firewalld的配置文件在/etc/firewalld,/usr/lib/firewalld/。/etc/下面的配置文件会被优先加载。/usr/下面的是默认配置文件,各种xml文件组成
  4. IPTables在更改现有规则时,更改后,会清除当前的旧规则,并从/etc/sysconfig/iptables读取新的规则,但是Firewalld不会,Firewalld在改变现有规则时,不会中断现行链接
  5. IPTables是静态防火墙,Firewalld是动态防火墙

1.2.3 Firewalld区域描述

  1. trusted(信任区)∶允许所有的传入流量。
  2. public(公共区)∶允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝
  3. external (外部区): 允许与 ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装, 可用于为路由器启用了伪装功能的外部网络。
  4. home (家庭区)∶允许与ssh、ipp-client、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
  5. internal (内部区)∶ 默认值时与home区域相同。
  6. work (工作区)∶允许与 ssh、ipp-client、dhcpv6-client 预定义服务匹配的传入流量,其余均拒绝。
  7. dmz (隔离区)∶允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。
  8. block(限制区)∶拒绝所有传入流量。
  9. 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)最后被应用。