iptables 防火墙(一)

2024-07-01 1130阅读

iptables 防火墙(一)

  • 一、Linux 防火墙基础
    • 防火墙分类
    • 二、iptables 的表、链结构
      • 规则表
      • 规则链
      • 数据包过滤的匹配流程
      • 三、编写防火墙规则
        • iptables 的安装
        • iptables的基本语法
        • 规则的匹配条件
          • 通用匹配
          • 隐含匹配
          • 显式匹配
          • 四、总结

            在网络安全的世界里,防火墙无疑是我们抵御外部威胁的第一道防线。而iptables,作为Linux系统上最强大的防火墙工具之一,为我们提供了细致控制网络流量的能力。本系列博客将带您逐步了解并掌握iptables的基础知识与配置方法。

            一、Linux 防火墙基础

            防火墙的定义

            • 防火墙是一种由硬件和软件组合而成,在内部网和外部网之间、专有网和公共网之间构造的保护屏障,用已保护用户资料和信息安全的一种技术

              防火墙的作用

              • 主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,从而实现对计算机不安全网络因素的阻断。确保网络正常运行,保障信息安全,为用户提供良好的网络体验

                防火墙分类

                • 逻辑上分:主机防火墙和网络防火墙
                  • 主机型防火墙:针对单个主机进行防护
                  • 网络型防火墙:针对网络进行保护,保护内部的局域网
                  • 物理上分:硬件防火墙和软件防火墙
                    • 硬件防火墙:在硬件上实现防火墙功能,性能高,成本高。
                    • 软件防火墙:依靠软件来实现防火墙功能,性能低,成本低

                      Linux包过滤防火墙概述

                      • Linux防火墙是一种功能强大的信息包过滤系统

                        netfilter

                        • 是Linux内核中的一种包过滤功能体系
                        • 称为Linux防火墙的 “内核态”

                          iptables

                          • 位于 /sbin/iptables,是防火墙规则的管理工具
                          • 称为Linux防火墙的 ”用户态“

                            ——上述2种称呼都可以表示Linux防火墙

                            包过滤的工作层次

                            • 主要是网络层,针对IP数据包
                            • 体现在对数据包内的IP地址、端口等信息的处理上

                              二、iptables 的表、链结构

                              iptables 防火墙(一)

                              规则表

                              • 表的作用:容纳各种规则链
                              • 表的划分依据:防火墙规则的作用相似

                                默认包括4个规则表

                                • raw表:是否对数据包进行状态跟踪
                                • mangle表:是否为数据包设置标记
                                • nat表:是否修改数据包中的源、目标IP地址或端口
                                • filter表:是否放行该数据包(过滤)

                                  规则链

                                  • 规则的作用:对数据包进行过滤或处理
                                  • 链的作用:容纳各种防火墙规则
                                  • 链的分类依据:处理数据包的不同时机

                                    默认包括5种规则链

                                    • INPUT:处理入站数据包
                                    • OUTPUT:处理出站时间包
                                    • FORWARD:处理转发数据包
                                    • POSTROUTING:在进行路由选择后处理数据包
                                    • PREROUTING:在进行路由选择前处理数据包

                                      数据包过滤的匹配流程

                                      • 规则表之间的顺序
                                        • raw→mangle→nat→filter
                                        • 规则链之间的顺序
                                          • 入站:PREROUTING→INPUT
                                          • 出站:OUTPUT→POSTROUTING
                                          • 转发:PREROUTING→FORWARD→POSTROUTING
                                          • 规则链内的匹配顺序
                                            • 按顺序依次检查,匹配即停止(LOG策略例外)
                                            • 若找不到相匹配的规则,则按该链的默认策略处理

                                              iptables 防火墙(一)

                                              三、编写防火墙规则

                                              iptables 的安装

                                              • CentOS 7.3 默认使用 firewalld 防火墙,如果想使用 iptables 防火墙,必须先关闭firewalld 防火墙
                                                # 关闭 firewalld 防火墙
                                                [root@localhost ~]# systemctl stop firewalld
                                                # 关闭自启动
                                                [root@localhost ~]# systemctl disable firewalld
                                                
                                                • Firewalld 防火墙关闭之后,可以通过 yum 方式再安装 iptables,因为默认 CentOS7.3系统中并没有安装 iptables
                                                  # 安装 iptables
                                                  [root@localhost ~]# yum -y install iptables iptables-services
                                                  # 启动 iptables
                                                  [root@localhost ~]# systemctl start iptables
                                                  # 设置开机自启动
                                                  [root@localhost ~]# systemctl enable iptables
                                                  

                                                  iptables的基本语法

                                                  数据包的常见控制类型

                                                  • ACCEPT:允许通过
                                                  • DROP:直接丢弃,不给出任何回应
                                                  • REJECT:拒绝通过,必要时会给出提示
                                                  • LOG:记录日志信息,然后传给下一条规则继续匹配

                                                    添加、查看、删除规则等基本操作

                                                    iptables 命令的常用管理选项
                                                    选项名功能及特点
                                                    -A在指定链的末尾添加(--append)一条新的规则
                                                    -D删除(--delete)指定链中的某一条规则,可指定规则序号或具体内容
                                                    -I在指定链中插入(--insert)一条新的规则,未指定序号时默认作为第一条规则
                                                    -R修改、替换(--replace)指定链中的某一条规则,可指定规则序号或具体内容
                                                    -L列出(--list)指定链中所有的规则,若未指定链名,则列出表中的所有链
                                                    -F清空(--flush)指定链中的所有规则,若未指定链名,则清空表中的所有链
                                                    -P设置指定链的默认策略(--policy)
                                                    -n使用数字形式(--numeric)显示输出结果,如显示 IP 地址而不是主机名
                                                    -v查看规则列表时显示详细(--verbose)的信息
                                                    -h查看命令帮助信息(--help)
                                                    --line-numbers查看规则列表时,同时显示规则在链中的顺序号
                                                    -t指定要操作的表
                                                    -i入站网卡
                                                    -o出战网卡
                                                    -d目的地址
                                                    -p协议名
                                                    -s源地址
                                                    -X删除指定表中用户自定义的规则链
                                                    -N新建一条用户自己定义的规则链
                                                    -Z将所有表的所有链的字节和数据包计数器清零
                                                    -j指定目标动作或跳转
                                                    !条件取反

                                                    添加新的规则

                                                    • 添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则。
                                                    • 例如,若要在 filter 表 INPUT 链的末尾添加一条防火墙规则,可以执行以下操作(其中“-p 协议名”作为匹配条件)
                                                      [root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
                                                      
                                                      • 当使用管理选项“-I”时,允许同时指定新添加规则的顺序号,未指定序号时默认作为第一条。
                                                      • 例如,以下操作添加的两条规则将分别位于 filter 表的第一条、第二条(其中省略了“-t filter”选项,默认使用 filter 表)。
                                                        [root@localhost ~]# iptables -I INPUT -p udp -j ACCEPT
                                                        [root@localhost ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
                                                        

                                                        查看规则列表

                                                        • 查看已有的防火墙规则时,使用管理选项“-L”,结合“–line-numbers”选项还可显示各条规则在链内的顺序号。
                                                        • 例如,若要查看 filter 表 INPUT 链中的所有规则,并显示规则序号, 可以执行以下操作。
                                                          [root@bogon ~]# iptables -L INPUT --line-numbers
                                                          Chain INPUT (policy ACCEPT)
                                                          num  target     prot opt source               destination         
                                                          1    DROP       udp  --  bogon                anywhere            
                                                          2    ACCEPT     tcp  --  anywhere             anywhere            
                                                          3    ACCEPT     all  --  bogon                anywhere            
                                                          4    ACCEPT     all  --  bogon/24             anywhere            
                                                          
                                                          • 当防火墙规则的数量较多时,若能够以数字形式显示地址和端口信息,可以减少地址解析的环节,在一定程度上加快命令执行的速度。
                                                          • 例如,若要以数字地址形式查看 filter 表INPUT 链中的所有规则,可以执行以下操作。
                                                            [root@bogon ~]# iptables -n -L INPUT        # "-n -L"可合写为"-nL" 
                                                            Chain INPUT (policy ACCEPT)
                                                            target     prot opt source               destination         
                                                            DROP       udp  --  192.168.72.1         0.0.0.0/0           
                                                            ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
                                                            ACCEPT     all  --  192.168.72.1         0.0.0.0/0           
                                                            ACCEPT     all  --  192.168.72.0/24      0.0.0.0/0  
                                                            

                                                            删除、清空规则

                                                            • 删除一条防火墙规则时,使用管理选项“-D”。
                                                            • 例如,若要删除 filter 表 INPUT 链中的第三条规则,可以执行以下操作。
                                                              [root@bogon ~]# iptables -nL --line-numbers
                                                              Chain INPUT (policy ACCEPT)
                                                              num  target     prot opt source               destination         
                                                              1    DROP       udp  --  192.168.72.1         0.0.0.0/0           
                                                              2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
                                                              3    ACCEPT     all  --  192.168.72.1         0.0.0.0/0           
                                                              4    ACCEPT     all  --  192.168.72.0/24      0.0.0.0/0           
                                                              [root@bogon ~]# iptables -D INPUT 3
                                                              [root@bogon ~]# iptables -nL --line-numbers        # 确认删除效果
                                                              Chain INPUT (policy ACCEPT)
                                                              num  target     prot opt source               destination         
                                                              1    DROP       udp  --  192.168.72.1         0.0.0.0/0           
                                                              2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
                                                              3    ACCEPT     all  --  192.168.72.0/24      0.0.0.0/0           
                                                              
                                                              • 清空指定链或表中的所有防火墙规则,使用管理选项“-F”。
                                                              • 例如,若要清空 filter 表INPUT链中的所有规则,可以执行以下操作。
                                                                [root@bogon ~]# iptables -F INPUT
                                                                [root@bogon ~]# iptables -nL --line-numbers         # 确认删除效果
                                                                Chain INPUT (policy ACCEPT)
                                                                num  target     prot opt source               destination         
                                                                
                                                                • 使用管理选项“-F”时,允许省略链名而清空指定表所有链的规则。
                                                                • 例如,执行以下操作分别用来清空 filter 表、nat 表、mangle 表。
                                                                  [root@bogon ~]# iptables -F 
                                                                  [root@bogon ~]# iptables -t nat -F 
                                                                  [root@bogon ~]# iptables -t mangle -F
                                                                  

                                                                  设置默认策略

                                                                  • iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。
                                                                  • 例如,执行以下操作可以将 filter 表中 FORWARD 链的默认策略设为丢弃,OUTPUT 链的默认策略设为允许。
                                                                    [root@bogon ~]# iptables -t filter -P FORWARD DROP
                                                                    [root@bogon ~]# iptables -P OUTPUT ACCEPT
                                                                    
                                                                    • 需要注意的是,当使用管理选项“-F”清空链时,默认策略不受影响。
                                                                    • 因此若要修改默认策略,必须通过管理选项“-P”重新进行设置。
                                                                    • 另外,默认策略并不参与链内规则的顺序编排, 因此在其他规则之前或之后设置并无区别。

                                                                      规则的匹配条件

                                                                      常用的隐含匹配条件

                                                                      • 端口匹配:–sport源端口、–dport目的端口
                                                                      • ICMP类型匹配:–icmp-type ICMP类型

                                                                        常用的显式匹配条件

                                                                        • 多端口匹配:-m multiport --sports 源端口列表

                                                                          -m multiport --dports 目的端口列表

                                                                        • IP范围匹配:-m iprange --src-range IP范围
                                                                        • MAC地址匹配:-m mac --mac-source MAC地址
                                                                        • 状态匹配:-m state --state 连接状态
                                                                          [root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
                                                                          [root@localhost ~]# iptables -A FORWARD -p tcp -m iprange -src-range 192.168.4.21-192.168.4.28-ACCEPT
                                                                          [root@localhost ~]#iptables -A INPUT -m mac -mac-source 00:0c:29:c0:55:3f -j DROP
                                                                          

                                                                          通用匹配

                                                                          (1) 协议匹配

                                                                          • 编写 iptables 规则时使用“-p 协议名”的形式指定,用来检查数据包所使用的网络协议(–protocol)
                                                                            # 丢弃通过 icmp 协议访问防火墙本机的数据包,允许转发经过防火墙的除 icmp 协议之外的数据包
                                                                            [root@localhost ~]# iptables -I INPUT -p icmp -j DROP
                                                                            [root@localhost ~]# iptables -A FORWARD ! -p icmp -j ACCEPT            #感叹号”!”表示取反
                                                                            

                                                                            (2) 地址匹配

                                                                            • 编写 iptables 规则时使用“-s 源地址”或“-d 目标地址”的形式指定,用来检查数据包的源地址(–source)或目标地址(–destination)
                                                                              # 拒绝转发源地址为192.168.1.11 的数据,允许转发源地址位于 192.168.7.0/24 网段的数据
                                                                              [root@localhost ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
                                                                              [root@localhost ~]# iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
                                                                              # 检测到来自某个网段(如 10.20.30.0/24)的频繁扫描、登录穷举等不良企图,可立即添加防火墙规则进行封锁
                                                                              [root@localhost ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP
                                                                              [root@localhost ~]# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
                                                                              

                                                                              (3) 网络接口匹配

                                                                              • 编写 iptables 规则时使用“-i 接口名”和“-o 接口名”的形式,用于检查数据包从防火墙的哪一个接口进入或发出,分别对应入站网卡(–in-interface)、出站网卡(–out-interface)
                                                                                # 丢弃从外网接口(ens33)访问防火墙本机且源地址为私有地址的数据包
                                                                                [root@localhost ~]# iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP 
                                                                                [root@localhost ~]# iptables -A INPUT -i ens33 -s 172.16.0.0/16 -j DROP 
                                                                                [root@localhost ~]# iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP
                                                                                

                                                                                隐含匹配

                                                                                (1) 端口匹配

                                                                                • 编写 iptables 规则时使用“–sport 源端口”或“–dport 目标端口”的形式,针对的协议为TCP 或 UDP,用来检查数据包的源端口(–source-port)或目标端口(–destination-port)。
                                                                                • 单个端口号或者以冒号“:”分隔的端口范围都是可以接受的,但不连续的多个端口不能采用这种方式
                                                                                  # 允许为网段 192.168.4.0/24 转发 DNS 查询数据包
                                                                                  [root@localhost ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
                                                                                  [root@localhost ~]# iptables -A FORWARD -d 192.168.4.0/24 -p udp --sport 53 -j ACCEPT
                                                                                  # 开放 20、21 端口,以及用于被动模式的端口范围为 24500~24600
                                                                                  [root@localhost ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
                                                                                  [root@localhost ~]# iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
                                                                                  

                                                                                  (2) ICMP 类型匹配

                                                                                  [root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP 
                                                                                  [root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT 
                                                                                  [root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT 
                                                                                  [root@localhost ~]# iptables -A INPUT -p icmp -j DROP
                                                                                  # 可用的 ICMP 协议类型
                                                                                  iptables -p icmp -h
                                                                                  

                                                                                  显式匹配

                                                                                  (1) 多端口匹配

                                                                                  # 允许本机开放 25、80、110、143 端口,以便提供电子邮件服务
                                                                                  [root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
                                                                                  

                                                                                  (2) IP 范围匹配

                                                                                  # 禁止转发源 IP 地址位于 192.168.4.21 与 192.168.4.28 之间的 TCP
                                                                                  数据包
                                                                                  [root@localhost    ~]#    iptables    -A    FORWARD    -p    tcp    -m    iprange    --src-range 192.168.4.21-192.168.4.28 -j DROP
                                                                                  

                                                                                  (3) MAC 地址匹配

                                                                                  # 根据 MAC 地址封锁主机,禁止其访问本机的任何应用
                                                                                  [root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
                                                                                  

                                                                                  (4) 状态匹配

                                                                                  # 禁止转发与正常 TCP 连接无关的非--syn 请求数据包(如伪造的网络攻击数据包)
                                                                                  [root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
                                                                                  # 只开放本机的 Web 服务(80 端口),但对发给本机的 TCP 应答数据包予以放行,其他入站数据包均丢弃
                                                                                  [root@localhost ~]# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT 
                                                                                  [root@localhost ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT 
                                                                                  [root@localhost ~]# iptables -P INPUT DROP
                                                                                  

                                                                                  四、总结

                                                                                  iptables是一个功能强大的防火墙工具,通过合理的配置可以为我们提供强大的网络安全保障。但请注意,iptables的配置相对复杂,需要具备一定的网络基础和Linux系统管理经验。在配置iptables时,请务必谨慎操作,避免误操作导致网络故障。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]