kaixin
Published on 2023-08-23 / 11 Visits
1

防火墙

防火墙介绍

是什么:

  1. 防火墙好比一堵真的墙,能够隔绝些什么,保护些什么。
  2. 防火墙的本义是指古代构筑和使用木制结构房屋的时候,为防止火灾的发生和蔓延,人们将坚固的石块堆砌在房屋周围作为屏障,这种防护构筑物就被称之为“防火墙”。其实与防火墙一起起作用的就是“门”。
  3. 如果没有门,各房间的人如何沟通呢,这些房间的人又如何进去呢?当火灾发生时,这些人又如何逃离现场呢?这个门就相当于我们这里所讲的防火墙的“安全策略”,所以在此我们所说的防火墙实际并不是一堵实心墙,而是带有一些小孔的墙。
  4. 这些小孔就是用来留给那些允许进行的通信,在这些小孔中安装了过滤机制,就是防火墙的过滤策略了。

场景功能:

  1. 防火墙具有很好的保护作用。入侵者必须首先穿越防火墙的安全防线,才能接触目标计算机。
  2. 防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。

概念:

  1. 防火墙一般有硬件防火墙和软件防火墙。
  2. 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
  3. 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。

1.软件防火墙

netfilter框架介绍:

  • 操作的核心是netfilter框架,这个框架主要作用就是处理网络数据包与过滤网络数据包,修改网络数据包,它是软件级别的防火墙的核心,它与iptables,ufw,firewall紧密关联。

netfilter框架实功能:

  1. 钩子(hooks):提供了钩子,可以在数据包声明周期的不同点被调用,允许数据包在进入,离开,转发与本地套接字通信的特定操作。
  2. 表(tables):使用表来组织起来,filter,nat,manle,raw和security等,每个表的目的不同,filter用来过滤,nat负责网络地址转换。
  3. 链(chains):表中的规则被视为链,当数据包通过钩子点时。它们会按照顺序在链的规则中进行匹配。如果数据包匹配到某个链,就会执行链的动作(accept,drop,reject,return)。
  4. 规则(rules):规则定义了数据包条件和动作,规则包含 源地址,目标地址,端口号,协议,等条件,动作就是当数据包匹配到了后是允许还是拒绝,还是转发等操作。
  5. 目标(targets):目标定义了当前规则匹配后的动作。除了基本的accept和drop之外,还可以自定义链作为目标,允许更为复杂的动作。
  6. 网络地址转换(nat):提供网络地址转换,源地址转换,目标地址转换,对于路由和防火墙都很有用。
  7. 状态跟踪(connection tracking):能够根据网络状态,区分新链接,已建立链接和相关链接,对于状态相关的规则处理非常重要。
  8. 模块化(modularity):可以加载不同的模块进行扩展,支持新的协议和操作。

Linux提供的软件防火墙管理工具:

  • iptables:iptables 是一个命令行工具,用于配置 Linux 内核中的 netfilter 框架,该框架负责处理网络数据包的过滤和修改。iptables 提供了用户界面来定义和维护 netfilter 的规则集。它不是一个独立的防火墙,而是管理 netfilter 框架的客户端代理
  • firewall:firewalldiptables 的一个前端管理工具,提供了动态管理防火墙规则的能力。firewalld 的底层实际上使用 iptables 规则来实现具体的数据包过滤功能
  • UFW:是Ubuntu和许多其他Linux发行版上的默认防火墙解决方案,它基于Linux内核的Netfilter框架来管理网络流量。UFW旨在简化iptables防火墙的复杂性,使其更易于用户友好地管理防火墙规则。

2.硬件防火墙

是什么:

  • 属于将软件防火墙嵌入硬件中,属于一个独立硬件设备,介于服务于网络之间,就是在流量数据包进入服务器前的一道关卡,由这道关卡拦截攻击非法数据(需要自行配置)。使用了硬件防火墙,那么就会减轻服务本身的压力(硬件防火墙可以独立处理网络流量,将健康的流量给服务器,服务器无需关心是否有问题。),能减少CPU的负担,使路由更稳定。硬件防火墙通常具有专门的硬件加速器,可以快速处理大量数据包,这有助于提高网络的整体吞吐量,尤其是在高流量环境下。
  • 由于硬件防火墙是专门设计的,它比服务器内软件防火墙更为可靠,可以持续运行,不会受到服务器内任务的影响。
  • 硬件防火墙可以提供更高级的安全功能,如入侵防御系统(IPS)、Web过滤和VPN,这些功能如果依赖于服务器处理,可能会增加服务器的负担。
  • 集中网络安全策略的能力,管理人员只需要在一个地方管理整个网络安全,而不用在每一台服务器上设置防火墙规则。

产品:

  • 华为 深信服 思科 H3C Juniper 天融信 飞塔 网康 绿盟科技 金盾 奇安信

3.硬件与软件的区别

软件防火墙:

  1. 安装在服务器内部,一个软件或者程序,可以根据某些规则实现对数据包转发与过滤等功能。
  2. 由于安装在服务器内部,根据服务器的配置高低,间接影响服务器的性能。
  3. 软件防火墙与服务器共享相同的资源,可能会受到漏洞或者恶意软件的影响。
  4. 流量数据包会直接到达网络直达服务器内部,由软件防火墙决定是否通过还是拒绝。

总结软件防火墙:

  • 软件防火墙,最终流量还是会到达服务器内部,由软件防火墙的规则匹配是放行还是拒绝 这个操作本质上就会消耗cpu资源。

硬件防火墙:

  1. 硬件防火墙是一种物理设备,通常是一个独立的网络设备。
  2. 硬件防火墙通常被安装在网络的边界处,如路由器或交换机之前,作为网络的第一道防线。
  3. 硬件防火墙通常具有专用的硬件和优化的处理能力,因此在处理大量流量时具有较高的性能和吞吐量。
  4. 硬件防火墙独立于主机系统,运行在专用的硬件环境中,因此对于网络攻击有一定的隔离和安全保护。

硬件防火墙总结:

  • 它是与服务器分开的,独立之外的,根本不会消耗服务器的资源,而是将处理过的安全的数据包在发送给服务器进行处理,等同于解放了服务器的资源,服务器只处理业务,硬件防火墙处理网络请求。减轻了服务器的压力,同时具有比软件防火墙更多的功能。

iptables

是什么:

  • iptables 是 Linux 内核中 Netfilter 框架的一部分,它提供了一个接口来配置Netfilter的规则,用于配置和管理 Linux 系统的网络流量。

使用场景:

  1. 主机防火墙(filter表的INPUT链)。
  2. 局域网共享上网(nat表的POSTROUTING链)。半个路由器,NAT功能。
  3. 端口及IP映射(nat表的PREROUTING链),硬防的NAT功能。
  4. IP一对一映射。

关于数据包是什么:

image-20241223222135151

防火墙流程:

image-20241223221621933

1.iptables的大致流程

流程介绍:

  • iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
  • 防火墙是层层过滤的,实际按照配置的从上到下的进行过滤。
  • 如果匹配到了规则,那么就会根据动作实现,拒绝,接受,转发等。
  • 如果没有匹配到规则,就会乡下一直匹配,直到匹配到默认规则为止,默认规则显示的是通过还是拒绝动作。
  • 规则是顺序进行的,匹配到规则后,会立即执行,不会将全部规则匹配,如果没有匹配到任何规则,就会使用默认规则。

image-20241223223506407

常用:

  1. filter表
  2. nat表

2.表链的执行顺序

顺序:

  1. prerouting链(nat表):当数据经过nat表prerouting链,在这里可以对目标地址转换。
  2. input链(filter表):数据的目标地址如果是本机,就会经过当前链,在这里可以选择接受/丢弃/拒绝数据包。
  3. 路由决策:如果数据包目标地址不是本机,内核将进行路由决策,决定数据包是否应该被转发。
  4. forward链(filter表或mangle表):如果路由决策转发,数据包会经过filter表的forward链(设置了规则)。mangle表forward链可以修改转发数据包的内容。
  5. postrouting链(nat表和mangle表):在数据包离开网卡之前,会经过nat表postrouting链,可以对源地址进行nat转换。mangle表的postrouting也可以修改数据包的内容。
  6. output链(mangle表和filter表):本机产生的数据,会经过mangle表的output链,然后是filter表的output链,最后通过nat表的postrouting链。
  7. 用户空间:如果数据包并没有被拒绝或者丢弃,就会到达用户空间的应用程序。

数据包处理的5个阶段:

  1. prerouting链:路由决策前,数据包刚刚到达本机,还没有决定是否交给本机还是转发。
  2. input链:路由决策后,如果数据包是本机,那么就会交于input链处理。
  3. output链:处理本机发送的数据,在数据离开本机前,检查或者修改。
  4. forward链:路由决策后,如果数据包目标地址不是本机,决策后进行转发。
  5. postrouting链:路由决策后,数据包即将离开本机,可以用于修改数据包的内容(如SNAT,源地址转换),以便进行网络地址转换或伪装。

image-20241226230244475

表权重:

  1. raw
  2. mangle
  3. nat
  4. filter

3.iptables四表五链

3-1.四表

  1. filter表:默认表,用于控制数据包的访问控制,即决定哪些数据包可以进入、离开或穿过系统。
  2. nat表:用于网络地址转换(Network Address Translation),包括源地址转换(SNAT)和目标地址转换(DNAT)。
  3. mangle表:用于修改经过的数据包,比如调整TTL值、设置QoS(服务质量)等。
  4. raw表:用于配置数据包是否被状态跟踪系统跟踪,通常用于配置Untracked的数据包。

3-2.五链

  1. INPUT链:处理进入本机的数据包。
  2. FORWARD链:处理经过本机但目的地不是本机的数据包,即转发的数据包。
  3. OUTPUT链:处理从本机出去的数据包。
  4. PREROUTING链:在路由决策之前处理进入的数据包,常用于DNAT。
  5. POSTROUTING链:在路由决策之后处理出去的数据包,常用于SNAT。

链的作用:

  • 它是iptables的每个表中规则的集合,根据顺序进行执行的,通过了某个规则那么就会执行对应的动作(并且每个表中的链都有可能被执行,需要根据规则设置而定。)。

3-3.filter表(常用)

filte表作用:
    主要还是对数据包进行过滤,决定数据包是否通过还是丢弃。

包含的链有:
    input链
    forward链
    output链

通过命令查看关于filter表的链信息:
    iptables -t filter -L 

image-20241223224027067

3-4.nat表(常用)

nat表作用:
    用于对数据包的网络地址转换,源地址与目标地址。

包含的链:
    prerouting
    postrouting
    output

通过命令查看关于nat表的链信息
    iptables -t nat -L 

image-20241223224311485


3-5.raw表

raw表作用:
    数据包是否被状态跟踪机制处理,用于记录网络连接状态,便于iptables可以对状态进行更为细致化的过滤策略。比如有些特定的数据包不希望被跟踪记录,就会跳过状态跟踪和nat处理,这要可以提高性能,尤其是大量的不需要链接跟踪的数据包时。如Web服务器的80端口流量。

# raw表优先级最高。

包含的链:
    output
    preouting
    
通过命令查看关于raw表的链信息
    iptables -t raw -L 

image-20241223224510485

3-6.mangle表

mangle表作用:
    可以修改数据包的服务类型、TTL等,并可以配置路由实现QOS。
        1.修改数据包的头部信息,ip头部和tcp/udp头部等,例如修改ttl值,可以防止数据包在网络中无限循序。
        2.实现qos字段,可以实现网络流量的优先级。
        3.可以对流量进行限制,比如某种类型或者特定源或者目标的流量数据。
        4.可以对数据表的数据进行重组。
    

包含的链:
    preouting
    postrouting
    input
    output
    forward

通过命令查看关于mangle表的链信息
    iptables -t mangle -L 

image-20241223224655875


4.路由表

查看命令:
    route # 需要安装 yum install net-tools -y
    
参数:
    -n 将主机名称转为ip

其他命令:
    ip route show
    
    [root@template ~]# ip route show
    default via 192.168.85.2 dev ens33 proto dhcp metric 100 
    192.168.85.0/24 dev ens33 proto kernel scope link src 192.168.85.137 metric 100 
        
        default :默认路由
        via 192.168.85.2:下一个跳转的路由
        dev ens33:指定了流量将通过的网络接口名称,这里是ens33。
        意思是,网络数据会通过ens33网络接口跳转到192.168.85.2网关发送出去流量。
  

route -n 字段解释:
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    
    Destination:目的地
    Gateway :到达目的网络的下一跳IP地址。
    Genmask : 子网有掩码
    Flags:路由标记
        U:路由使用状态。
        G:路由使用网关。
        H:目标间接,通过网关可达。
    Metric:路由的成本或优先级,数值越小表示优先级越高。
    Ref:路由引用次数
    Use:路由被使用的计数器,表示该路由被路由器使用的次数。
    Iface:路由表对应的输出接口,网卡名称
 
 # 两个路由记录的解释:
     本地网络路由:python flask服务ip绑定了 192.168.85.82,那么流量就会在本地而不会经过网关,只能在局域网络使用。
     网络路由:python flask服务的ip绑定了 0.0.0.0 流量就可以通过 192.168.85.2的网关发送出去,可以接受局域网的流量,同时可以接受外部网络接口的流量。

image-20241227225007885


4-1.route命令使用

命令:
    route  # 注意当前命令设置后,重启机器就会消失。

参数:
    add -host 添加主机路由
    add -net 添加网络路由
    add default 添加默认路由
    del -host 删除主机路由
    del -net 删除网络路由
    del default 删除默认路由

示例:
    # 添加本地路由
        记录:route add -host 192.168.85.110 gw 192.168.85.2 
            作用:
                电脑尝试访问 192.168.85.110时,会将数据包发送给网关192.168.85.2,再由网关转发给192.168.85.110,因为是本地路由,这样操作就是多此一举。
                
        记录:route add -host 192.168.1.2 dev eth0  
            作用:
                电脑在尝试访问 192.168.1.2 时,会先将数据包发送到 eth0 接口,再将数据包发送给192.168.1.2。因为是本地路由,这样操作就是多此一举。
    
    # 添加网络路由
         route add -net 10.20.30.40 netmask 255.255.255.248 eth0 
            作用:
                添加网络路由 10.2.30.40 子网掩码 255.255.255.248 通过网卡eth0将数据发送出去
        
        route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.4
            作用:
                添加网络路由 10.2.30.48 子网掩码 255.255.255.248 通过10.20.30.4网关将数据发送出去
        
        route add -net 192.168.1.0/24 eth1
            作用:
                来自 192.168.1.0/24 网络的数据流量通过 eth1 接口发送出去。
    
    # 添加默认路由
        route add default gw 192.168.1.1 
            作用:
                使得所有没有在本地路由表中找到具体路径的数据包都会被发送到该网关。
    
    # 删除路由
        route del 192.168.85.110 # 删除 192.168.85.110 这条路由,可以添加更多内容,跟为准确的删除

# 注意删除:
    route del -net 172.16.19.0 gw 192.168.85.2 netmake 255.255.255.0 # 无法删除
    route del -net 172.16.19.0 netmask 255.255.255.0 gw 192.168.85.2 # 可以删除
    删除时有顺序的:不同的系统顺序不同。ubuntu 是gw在前,netmake在后
        -net 后面直接跟网络地址,然后是 netmask 后面跟子网掩码,最后是 gw 后面跟网关地址。

4-2. 开启 IP 转发功能

IP转发是指将收到的网络数据包从一个网络接口转发到另一个网络接口的过程。当一个Linux系统作为路由器或网关时,需要启用IP转发功能,以实现不同网络之间的数据转发和路由功能。
# ipv4
验证是开启转发
    sysctl net.ipv4.ip_forward # 0没有开启 1开启

1.临时生效
    sysctl -w net.ipv4.ip_forward=1

2.永久生效
    vim /etc/sysctl.conf
    net.ipv4.ip_forward = 1

3.修改后需要生效
     sysctl -p

4.开启临时转发(修改内核文件)
    echo 1 > /proc/sys/net/ipv4/ip_forward


# ipv6
验证是开启转发
    sysctl net.ipv6.conf.all.forwarding # 0没有开启 1开启
    
1.启动ipv6内核转发 (修改内核文件)
    echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

2.永久生效
     vim /etc/sysctl.conf
     net.ipv6.conf.all.forwarding = 1
3.临时生效
    sysctl -w net.ipv6.conf.all.forwarding=1
    
3.修改后需要生效
     sysctl -p

5.iptables命令

命令:
    iptables  # 设置的命令是临时的,重启后就会消失。

组成:如果不指定表默认添加filter表中
    iptable [表] [添加/删除/追加] [协议] [ip范围] [端口] [动作]
    
        1.表:指定规则属于哪个表,如 filter、nat、mangle 或 raw。如果不指定,默认为 filter 表。
            -t filter 指定filter表
            
        2.添加/删除/追加:
            -A 或 --append:在链的末尾添加一条新规则。
            -D 或 --delete:删除链中的一条规则。
            -I 或 --insert:在链的开头插入一条新规则。
            
         3.协议:使用 -p 参数指定协议,如 tcp、udp、icmp 等。
         
         4.IP范围:使用 -s 参数指定源 IP 地址或子网,使用 -d 参数指定目的 IP 地址或子网。
             -s 192.168.0.0/24(带掩码) 或者 -s 192.168.35.110(固定一个)
             
         5.端口:使用 --sport 参数指定源端口,使用 --dport 参数指定目的端口。
             可以指定单个端口,如 --dport 22,或者端口范围,如 --dport 22:80。
        
        6.动作:定匹配规则的数据包应该执行的动作,如 -j ACCEPT、-j DROP、-j REJECT 等。
        
参数:
    -t 指定表,根据指定的表查看指定的表的链规则。
    -p 指定协议:tcp、udp、icmp或者全部,可以查看 /etc/protocols 定义的协议名称,或者使用!代表取反,或者数字0代表all。
    -I 插入一个新规则
    -A 追加一个新规则
    -D 删除规则
    -s 指定ip地址或者ip的范围
    -d 指定目标地址
    -j 指定动作
    -L 显示所有的规则,如果没有指定链的情况下,就显示全部
    -F 清空全部的规则
    -X 删除除了用户定义的链
    -Z 清除计时器
    --sport 源端口
    --dport 目的端口
    -n 数字输出。IP地址和端口会以数字的形式打印。默认情况下,程序试显 示主机名、网络名或者服务(只要可用)。
    -P <链> <动作> 修改某表的链的默认动作
    -i/o 网卡名
    

语法规则:
     iptables  -t 表名  -I/A/D/R 规则链名 [规则号]  -i/o 网卡名 -p 协议名 -s 源ip/源子网  --sport 源端口 -d 目标ip/目标子网 --dport 目标端口 -j 动作

示例:
    1.iptables -t filter -A INTPUT -P tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT
        # 解释:对 filte表INPUT链追加规则,允许 192.168.0.0/24子网的tcp协议对本机的22端口数据包放行。
    
    2. iptables -t filter -A INPUT -s 192.168.1.100 -j DROP
        # 解释:对filter表input链追加规则,对192.168.1.100的全部流量拒绝
    
    3.iptables -t nat -A PREROUTING -p icmp --icmp-type echo-request -j DNAT --to-destination 192.168.2.100
        # 解释:对 nat表PREROUTING链添加规则,访问本机icmp协议类型echo,指定转发到 192.168.2.100 地址
        
    4. iptables -t filter -A INPUT -p udp -j LOG
        # 解释:对filter表input链添加规则,对全部的udp协议进行日志记录
    
    5.iptables -t filter -A INPUT -p tcp --dport 80 -m limit --limit 1/sec -j ACCEPT
        # 解释:对filter表input链添加规则,对访问tcp 80端口的流量允许通过并且进行限制
    
    6.iptables -t filter -I INPUT -s 192.168.19.1 -p tcp --dport 80 -j ACCEPT 
        # 解释:给filter表添加 192.168.19.1 访问本机 tcp协议 80端口 允许放行

# 注意:
    在指定表时,需要对应表存在这个链才能指定,不然无法指定。

image-20240217160312407


5-1.链动作

# 链的动作可以单独使用也可以组合使用。

1.ACCEPT
    表示接受数据包,放行。

2.DROP
    丢弃数据包,并且回复任何消息。

3.REJECT
    拒绝数据包,发送错误信息。

4.SNAT
    修改数据包的源地址,用于源地址伪装。

5.DNAT
    修改数据包的目的地址,用于端口转发。

6.MASQUERADE
    使用nat方式对匹配的数据包进行地址转换

7.LOG
    系统日志中记录规则数据包

8.RETURN
    结束当前规则链,回到上一条规则链

9.REDIRECT
    将数据包重定向到本地机器的另一个端口,通常用于端口转发。

10.LIMIT
    可以限制数据包流量,防止ddos攻击。设置秒,分钟,小时的流量

11.MASQUERADE
    用于动态伪装,当数据包从非NAT接口发出时,自动设置源地址为出口接口的地址。

12.NETMAP
    将数据包的源地址和目的地址映射到另一个地址。

13.MANGLE
    修改数据包的内容,如TTL值、QoS字段等。

14.QUEUE
    将数据包发送到用户空间的程序进行处理,这允许对数据包进行更复杂的操作。

15.NOTRACK
    不跟踪连接,用于Raw表,允许数据包绕过连接跟踪系统。

16.MARK
    设置数据包的标记,以便在后续的链中使用。

17.CONNMARK
    设置或修改现有连接的标记。

18.HELPER
    启用或禁用特定的连接助手模块,这些模块可以用于状态跟踪和NAT。

19.AUDIT
    记录数据包的审计信息。

20.TCPMSS
    设置TCP数据包的最大分段大小(MSS)。

21.DSCP
    修改IP数据包的服务类型(Type of Service, ToS)字段。

5-2.默认策略修改

# 默认策略:
    就是在表内的链,如果设置的规则没有完全匹配的后最终执行的动作,默认是放行(accept)
    如果修改默认策略,比如修改为拒绝(drop),那么设置的所有的防火墙规则就需要修改。

# 怎么修改默认策略
    iptables -t <指定表> -P <链> <动作>

例如修改:
    iptables -t filter -P INPUT DROP
    # 解释:
        指定 filter 表将默认动作修改为拒绝。
    
    如果设置当前的默认规则,那么最简单的就是 ssh 链接就无法使用了,除非在设置一个规则允许访问22:
        iptables -t filter -I INPUT --dport 22 -p tcp -j ACCEPT
    
    如果不设置,并且在生成环境下:
        1.运维人员定时清空iptables的一个脚本,防止其他人员对服务器进行误操作
        2.通过非ssh链接的方式登录服务器,清空iptables,使用ssh进行登录。比如:阿里云vnc协议远程登录
        3.重启服务器,因为这些以操作都临时生效,重启后就会消失,但是考虑当前情况是否必须重启
        4.打电话给idc机房运维删除

image-20241229223742032


5-3.实现命令持久化

netfilter网站: http://www.netfilter.org/

默认配置目录:/etc/sysconfig/iptables /etc/sysconfig/ip6tables

# 因为iptables命令设置的是临时,重启机器后就会失效。

1.安装iptables服务
    yum install iptables-services -y

2.开启内核功能
    modprobe ip_tables # 提供 iptables 功能的核心支持,允许定义基于包过滤的规则,是所有 iptables 功能的基础模块。
    modprobe iptable_filter # 启用 iptables 的过滤功能(filter 表)。
    modprobe iptable_nat # 启用 iptables 的过滤功能(nat 表)。
    modprobe ip_conntrack # 提供连接跟踪功能,跟踪网络连接的状态。
    modprobe ip_conntrack_ftp # 专用于跟踪 FTP 协议的连接状态。
    modprobe ip_nat_ftp # 提供对 FTP 协议的 NAT 支持。
    modprobe ipt_state # 允许基于连接状态的匹配规则 
        --state NEW: 匹配新的连接。
        --state ESTABLISHED: 匹配已建立的连接。
        --state RELATED: 匹配与现有连接相关的连接。
 
3.启动防火墙
    systemctl stop firewalld # 关闭firewalld防火墙(会冲突),与iptables一样也是一款给予netfilter框架的命令行工具
    systemctl start iptables.service

# 注意:
    当启动后,它默认生成的规则,是从 /etc/sysconfig/iptables 配置文件读取生成的。

image-20241229230743936


5-4.命令相关指令参数

1. --line-numbers # 需要配合 -L参数使用
    iptables -nL --line-numbers
    
    --line-numbers 作用:
        列出全部的规则,并且排上序号

2.清空命令
    iptables -F <- 清除所有规则,不会处理默认的规则
    iptables -X <- 删除用户自定义的链
    iptables -Z <- 链的计数器清零(数据包计数器与数据包字节计数器)

5-5.网络连接状态

NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的

5-6.命令持久化操作

iptables-save # 可以读取当前的iptables的配置信息

1.规则导出
    iptables-save > 123.txt # 将规则导出到 123.txt 文件内

2.规则导入
    iptables-resotre  < 123.txt # 将规则导入到iptables中

3.持久化
    iptables-save
    service iptables save
    service ip6tables save
    或者
    iptables-save > /etc/sysconf/iptables

5-7.实战操作

5-7-1.添加

1.设置
    iptables -t filter -I INPUT -s 192.168.85.0/24 -p tcp --dport 22 -j ACCEPT
    # 解释:
        允许 192.168.85.0/24 网段的 可以通过tcp协议,链接22端口。

2.取反设置 
    iptables -t filter -I INPUT ! -s 192.168.85.0/24 -p tcp --dport 22  -j ACCEPT
    # 解释:
        ! -s 192.168.85.0/24 # 除了这个 192.168.85.0/24网段以外都可以链接

image-20241230221757413


5-7-2.删除

语法:
    iptables -t <表> -D <链> <序号>

1.先查出当前链的序号
    iptables -t filter -nL --line-numbers

2.根据链的序号进行删除
    iptables -t filter -D INPUT 1

image-20241230222115409


5-7-3.取反操作说明

例如:
    iptables -t filter -I INPUT -s 192.168.85.148 -p tcp --dport 22 -j DROP
    # 解释:
        只允许当前 192.168.85.148  ip的机器通过 22 tcp协议链接到本机
    
    iptables -t filter -I INPUT ! -s 192.168.85.148 -p tcp --dport 22 -j DROP
    # 解释:
        除了 192.168.85.148 ip的机器,其他的机器都可以允许 22 tcp 协议链接本机
        
# 注意:
    如果机器上存在两个网卡的情况,可能会导致另外的网卡无法使用。

5-7-4.多端口限制操作

参数:
    -m multiport # 指定多个端口模块
    -dport 80,433,8080 # 指定多个端口

iptables -t filter -I INPUT -m multiport -p tcp --dport 80,433,8080 -j DROP

# 或者根据某些恶意访问ip进行过滤拒绝它们访问 80 433 8080端口
    1.根据访问日志进行过滤查询
        cat /var/log/nginx/access.log | awk  '{print $1}' | sort |uniq -c | sort -r
    
    2.在进行根据ip进行封禁
        iptables -t filter -I INPUT -s <-ip->  -m multiport -p tcp --dport 80,433,8080 -j DROP

image-20241230225100719


5-7-5.实现局域网共享上网

实际的过程如下:
    本机:192.168.85.135 访问百度或者阿里的网站 #  vmware虚拟的网卡
    ↓
    网关:192.168.85.2 # vmware虚拟网关
    ↓
    宿主机:windows
    ↓
    路由器
    ↓
    网络资源(百度,阿里)

# 为什么你的虚级可以ping百度,可以链接:
[root@iptable ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.85.2    0.0.0.0         UG    100    0        0 ens33  # 0.0.0.0又转发到192.168.85.2他是网关
192.168.85.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33   # 当前的网段ip 转发到0.0.0.0
在这个/etc/sysconfig/network-scripts/ifcfg-ens33 设置的又关于网关的参数,流量才会通过本机->网关->想要访问的机器上

image-20241230230916418

机器A操作
机器Aip地址:192.168.85.135

机器A:# 清除全部的防火墙规则,将网卡的网关设置为 192.168.85.135
    1.查看当前机器的iptables设置,与路由设置
        iptables -nL
        route -n

    2.对当前的网卡设置网关,网关设置为192.168.85.135
        vim  /etc/sysconfig/network-scripts/ifcfg-ens33 修改一下参数
        
        IPADDR=192.168.85.135
        BOOTPROTO=static
        GATEWAY=192.168.85.135
       
        systemctl restart network

    3.在进行查看路由表,网关已经出现
        route -n  

image-20241230232827472


机器B操作
机器Bip地址:192.168.85.135

机器B:需要设置一个防火墙规则,将数据转发出去

1.设置转发规则:需要再nat表的POSTROUTING设置
    iptables -t nat -A POSTROUTING -s 192.168.85.0/24 -j SNAT --to-source 192.168.85.135
    # 解释:
        将 192.168.85.0/24  网段发送的数据包,将它的源地址修改为 机器B的ip地址 192.168.85.135

2.在机器B设置转发规则
    sysctl -w net.ipv4.ip_forward=1 # 临时生效
    # 永久生效
    echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf 
    sysctl -p 


# 为什么需要设置:iptables -t nat -A POSTROUTING -s 192.168.85.0/24 -j SNAT --to-source 192.168.85.135 规则
    因为路由如下:
    wkx@ubtun64:~$ sudo route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.85.2    0.0.0.0         UG    100    0        0 ens33  # 第一条
    192.168.85.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33  # 第二条
    
    只有将源地址修改为:192.168.85.135
        1.会匹配到路由的第二条:192.168.85.0。
        2.通过第二条跳的网关匹配到0.0.0.0,也就是第一条。
        3.在从第一条的网关 192.168.85.2 出去。
    
    总结:
        将源地址修改为 192.168.85.135 后,出站流量会因为源地址属于 192.168.85.0/24 网段而匹配到第二条直接路由规则,但由于目的地是外部网络,流量将通过第一条规则指定的默认网关 192.168.85.2 发送出去。这个过程确保了流量能够正确地离开本地网络并被路由到正确的目的地。

image-20241230233707104


过程图

image-20241230235439213


5-7-6.本地端口映射操作

目的:将本地的nginx随机端口映射为 80端口

核心:
    nat 表PREROUTING链

1.修改规则
    iptables -t nat -I PREROUTING -p tcp -s 192.168.85.137 --dport 17788 -j DNAT --to-destination 192.168.85.137:80
    # 解释:
        当访问是 1777端口就会将流量在内部转发到80端口上
        
    iptables -t nat -A POSTROUTING -p tcp -d 192.168.85.137 --dport 80 -j SNAT --to-source 192.168.85.137
    # 解释:
        当由本机发送的目标地址为 192.168.85.167:80 的tcp数据包时,将源地址修改为 192.168.85.137
    
    iptables -t nat -A PREROUTING -p tcp --dport 17788 -j LOG --log-prefix "NAT PREROUTING: "
    # 设置一个log 日志
        给 nat 表的 PREROUTING 链设置log日志,让访问端口 17888 时添加一个标识 NAT PREROUTING: 的日志
    可以通过:dmesg | grep "NAT PREROUTING" 查询日志

SELinux

是什么:

  • selinux是一个进程程序,对文件等权限设置的内核模块。属于强制访问控制(MAC),可以针对特定的进程和特定的文件资源来进行控制,即便你有root权限,那么在使用不同的进程时,你的权限不一定是root,需要根据进程的设置而定。将权限的访问以进程的方式进行控制,而不是用户(超出了用户与用户组的权限范围)。

概念:

  1. 主体:就是selinux管理的进程,主体=进程。
  2. 目标:主体进程可以访问的目标资源,一般为文件系统。目标项目=文件系统(文件资源)。
  3. 策略:制定的对某些服务进程的访问安全策略。策略内还有大量的规则进行限制。策略一般分别为:targetd与strict两种默认的,targeted属于针对网络服务的限制比较多,针对本机的限制比较少。strict是完整的selinux限制,限制方面,比较严格。不通过的版本策略不同。
  4. 安全上下文:类似于文件权限的rwx权限控制,主体需要与目标的安全上下文一致才能顺利访问。安全上下文如果设置错误,那么就会导致进程无法访问,简单理解就是权限(rwx)。

运行各个组件之间的关系:

  • 当进程发起访问请求,会提出要求(进程需要读取某个文件内容),selinux就会收到进程访问的请求,然后selinux就会根据策略内的规则进行验证是通过或者拒绝,安全上下文来识别进程和文件资源的安全属性,yes:运行进程访问资源,no:拒绝进程访问资源,同时说明具体拒绝原因。
  • avc:SELinux中的访问向量缓存(Access Vector Cache),用于存储访问决策的结果,以提高性能。
  • 注意:即使selinux策略通过访问允许,最终的解释权还是在文件的rwx权限上。
  • 可以从图中理解,所以的访问都需要经过selinux允许后,在决定执行进程的用户是否有当前文件资源的访问权限。

image-20250101215648078

补充:

  • 安全上下文:是存储到文件的inode内的,当主体(进程)需要读取目标(文件资源),就会读取inode,inode内就可以比较安全上下文件以及rwx等权限值是否正确。

1.安全上下文操作

1-1.安全上下文件

1.读取
    通过 ls -Z 命令读取


2.安全上下文件的内容说明
    system_u:object_r:admin_home_t:s0
    用户:角色:类型:级别

解释:
    用户(User):文件的所有这,与传统的所有者(比如root)不同。
        system_u:系统用户
        user_u:一般用户
        unconfined_u:不受限制用户,表示没有被selinux策略特别限制的进程,这个用户可以执行任何操作,直到selinux策略明确限制。
        
    角色(Role):文件或进程可以扮演的角色。角色用于限制进程可以执行的操作,即使它拥有足够的权限。
        object_r:代表文件或者目录等文件资源。
        system_r:代表进程
    
    类型(Type):是文件或者进程的安全类型,类型定义了进程或者文件可以执行的操作和访问资源。
        admin_home_t:代表是一个管理员家目录。
        etc_t:代表配置文件或者目录
        system_conf_t:系统级别的配置文件目录
    
    级别(Level):用于selinux策略中实现的分层安全,允许系统管理员定义不同级别的敏感信息。
        s0:未分类,标识当前文件没有特别的级别
        s1:秘密
        s2:机密
        s3:绝密
        ....

image-20250101220639944


1-2.理解安全上下文

# 例如 httpd 的文件内安全上下文件

[root@template httpd]# ll -Zd /usr/sbin/httpd /var/www/html/
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/


system_u:代表当前用户都是系统用户
object_r:角色属于文件
s0:文件级别都属于未分类级别

httpd_exec_t:代表当前的文件属于可执行文件
httpd_sys_content_t:可以让httpd域(domain)读取文件类型


# 解释:
    当httpd进程(由httpd_exec_t类型的可执行文件启动)运行时,它会在其安全上下文中运行,该上下文定义了它被允许执行的操作。SELinux策略中的规则会指定httpd_exec_t类型的进程可以读取httpd_sys_content_t类型的文件资源。这意味着httpd进程可以访问/var/www/html/目录下的文件,这是Web服务器用来提供网页内容的典型位置。

image-20250101223229114


1-3.总结安全上下文

总结:
    安全上下文可以理解为,对程序或者文件的一种标记(例如:httpd_exec_t,httpd_sys_content_t),selinux会根据这种标记读取策略中的规则,进行匹配(允许或者拒绝)。

httpd_exec_t是httpd命令的类型属于可执行类型,selinux内部的策略规则就允许这个httpd读取httpd_sys_content_t类型的文件或者文件夹。

2.配置操作

目录 说明,
/etc/selinux selinux的配置文件夹。
/etc/selinux/config 配置文件,设置运行模式与策略。

2-1.启动模式

1.enforcing:
    强制模式,代表selinux正在运行中,且开始限制。开启状态

2.permissive:
    宽容模式,只有警告信息,没有限制。开启状态

3.disabled:
    关闭,selinux没有运行。

2-2.策略

1.targeted: # 默认策略
    默认进程。会保护一组进程,这些进程通常是网络服务或者系统守护进程,如:httpd sshd named 等,对这些关键的进程提提供额外的保护,防止被恶意软件攻击利用,非目标进程不会受到selinux策略的保护。
    
2.minimum
    最小策略。给予默认策略进行了修改,减少了保护进程的数量,主要用于希望对selinux策略影响范围的用户使用。主要用于特定的环境下,用户不希望selinux保护某些特定进程,,最小策略并不是一个预定义的策略,而是用户根据自己的需求定制的策略。
    
3.mls
    多级安全策略,它实现了多级安全(Multi-Level Security)模型。每个进程和文件都被分配了一个安全级别和类别,这些级别和类别用于控制信息流。MLS策略允许更细粒度的访问控制,可以防止敏感信息从一个安全级别泄露到另一个安全级别。MLS策略通常用于需要高度安全的环境,如军事或政府机构,其中信息的保密性至关重要。

2-3.怎么配置

vim /etc/selinux/config

SELINUX=enforcing # 修改模式,开启或者关闭。
SELINUXTYPE=targeted # 修改策略,一般使用默认策略即可。

2-4.网络服务测试-验证

# 使用apcache服务器实验

1.启动httpd服务
    systemctl start httpd

2.通过进程命令查看安全上下文
    ps aux -Z | grep httpd # -Z 可以查看当前进程的安全上下文

3.写入内容修改主页
    echo "测试安全上下文" > /var/www/html/index.html
    # 刷新浏览器网页后就会显示 测试安全上下文 内容

4.查看当前文件类型
    [root@template selinux]# ll -dZ /var/www/html/index.html
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
    当前创建的文件类型时 httpd_sys_content_t 说明可以被httpd进程读取

5.在家目录下创建一个index.html文件,并且移动至/var/www/html文件夹中(覆盖原有文件)
    echo "测试666666" > index.html
    mv index.html /var/www/html/

6.刷新浏览器网页查看就变成为默认网页

# 原因:
    [root@template ~]# ls -Z /var/www/html/index.html 
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/html/index.html
    移动过去的 文件的类型是:admin_home_t httpd服务进程无法读取。

image-20250101231612777


2-5.网络服务测试-修改

-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/html/index.html 
当文件出现 admin_home_t 进程无法读取的类型怎么修改:

1.使用命令 chcon
    命令:
        chcon
    参数:
        -R 连同该目录下的子目录也同时修改,递归修改
        -t 修改安全上下文的类型
        -u 修改用户标识
        -r 修改角色
        --reference=范例文件,将这个范例文件安全上下文作为后续文件的安全上下文修改

2.进行修改,将 /var/www/html/index.html 类型修改为 httpd_sys_content_t类型
    chcon -t httpd_sys_content_t /var/www/html/index.html 

3.使用--reference参数
    chcon --reference=/var/www/html/ /var/www/html/index.html 
    意思:
        依据 /var/www/html/ 文件的上下文类型修改 后面的文件上下文类型 /var/www/html/index.html 

image-20250101232145100


2-6.网络服务测试-还原

命令:
    restorecon

参数:
    -R 递归修改
    -v 显示修改过程

作用:
    恢复默认的安全上下文,也就是还原

例如:
    restorecon ~/123.log

image-20250101232858683


2-7.策略规则管理命令

# 安装相关工具
    yum install setools-console 
    apt-get install selinux-utils

1.seinfo
    作用:
        查看selinux规则角色,类型,用户基本信息
    命令:
        seinfo # 不带任何参数 列出selinux状态,规则布尔值,身份识别,角色,类型信息
    参数:
        -t 列出全部的类型
        -r 列出全部的角色
        -u 列出全部的身份标识
        -b 列出全部的规则种类

2.sesearch
    作用:
        查看详细的规则
    命令:
        sesearch [--all] [-s 主体类型] [-t 目标类型] [-b 布尔值]
    参数:
        -all 列出类型或者布尔值相关信息
        -t 后面要接的类型
        -b 后面还需要接布尔值的类型
    例如:
        sesearch --all -t httpd_log_t # 列出相关httpd_log_t策略规则


# seinfo 与 sesearch 输出的信息存放在 /etc/selinux/targeted/policy 下

3.getsebool
    作用:
        用于查询 SELinux布尔值状态的命令行工具,用或禁用策略中的特定规则集。对规则开启状态进行查看 off开启 on 关闭,
    参数:
        -a 列出全部的
    例如:
        getsebool -a # 查看全部
        getsebool httpd_can_network_connect # 查看特定的
        [root@template ~]# getsebool httpd_can_network_connect
        httpd_can_network_connect --> off

4.setsebool
    作用:
        修改  SELinux布尔值状态的命令行工具,用或禁用策略中的特定规则集。
    参数:
        -P [0|1] 直接将值写入到配置中,永久写入。
    例如:
        [root@template ~]# getsebool httpd_can_network_connect
        httpd_can_network_connect --> off
        [root@template ~]# 
        [root@template ~]# setsebool httpd_can_network_connect=1
        [root@template ~]# 
        [root@template ~]# getsebool httpd_can_network_connect
        httpd_can_network_connect --> on


5.semanage
    yum install policycoreutils-python -y # 安装
    命令:
        semanage {import,export,login,user,port,...} [-a|-d|-m] 
    作用:
        用于管理 SELinux 的策略,而不需要编译源代码。它允许操作系统和 SELinux 用户以及某些对象安全上下文之间的链接。
    参数:
        -a 增加,比如增加一些目录的安全上下文设置
        -m 修改
        -d 删除
    例如:
        semanage fcontext -l # 列出当前 SELinux 策略中定义的所有文件上下文
        semanage fcontext -l | grep /var/www/html # 列出当前  /var/www/html 文件上下文
        semanage fcontext -l | grep httpd_config_t # 列出httpd_config_t 文件上下文
        
        semanage port -l | grep http # 查询http服务允许的端口列表
        semanage port -a -t http_port_t -p tcp 6111 # 对指定服务 http_port_t  允许端口列表添加新的值
        semanage port -d -t http_port_t -p tcp 6111 # 删除指定服务 http_port_t 允许的端口 6111

2-8.相关命令

1.getenforce
    作用:
        可以查看当前selinux属于什么模式
    使用:
        getenforce
    
    [wkx@template opt]$ getenforce 
    Enforcing

2.sestatus
    作用:
        列出使用的策略
    使用:
        sestatus
    
    [wkx@template opt]$ sestatus 
    SELinux status:                 enabled # 是否启动selinux
    SELinuxfs mount:                /sys/fs/selinux # 相关文件数据的挂载点
    SELinux root directory:         /etc/selinux # 配置文件
    Loaded policy name:             targeted # 策略是什么
    Current mode:                   enforcing # 模式
    Mode from config file:          enforcing
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Max kernel policy version:      31


3.setenforce
    作用:
        修改selinux的模式
    使用:
        setenforce
    参数:
        getenforce [0|1]
        0:转为permissive宽容模式
        1:转为enforcing强制模式