#Linux监控与安全Day04:IPTABLES 防火墙基本操作,匹配条件,主机型 & 网络型防火墙,扩展规则匹配

一、IPTABLES 防火墙基础

1.1 防火墙简介

  1. 定义 :防火墙是控制网络数据进出、按规则放行或拦截,防止非法访问与攻击的安全防护系统。
  2. 防火墙分为两大类:
  • 硬件防火墙(类似于交换机)
  • 软件防火墙
    • 主机型软件防火墙(单主机防护,只保护本机,管控本机进出流量)
    • 网络型软件防火墙(整机做网关,防护整个内网所有设备)
  1. Linux 常用防火墙
    • firewalld:底层依旧调用 IPTABLES 实现功能;
    • IPTABLES:传统 Linux 包过滤防火墙。

      防火墙的工作层级:
      iptables 是基于内核 Netfilter 框架的防火墙工具,作用于 TCP/IP 协议栈的多个层级(主要在网络层和传输层),通过对数据包的过滤、修改和转发来实现网络安全策略。用户通过 iptables 命令配置规则,由 Netfilter 在内核态执行。
      简单讲,iptables / Netfilter 主要工作在网络层(IP 层),但它同时具备感知和操作传输层(TCP/UDP)以及部分应用层信息的能力

1.2 停用 firewalld 并使用 IPTABLES

使用 IPTABLES 前需关闭 firewalld 服务,并禁止开机自启,相关操作命令如下:

bash 复制代码
# 关闭 firewalld 服务
[root@localhost ~]# systemctl stop firewalld
# 设置 firewalld 禁止开机自启
[root@localhost ~]# systemctl disable firewalld
# 查看 firewalld 运行状态(确认已停止)
[root@localhost ~]# systemctl status firewalld
# 查看 firewalld 开机自启状态(确认已禁用)
[root@localhost ~]# systemctl is-enabled firewalld

1.3 IPTABLES 四表五链结构

核心架构:四表五链 ,是 IPTABLES 核心组成。

  • 四张表:raw 状态跟踪表、mangle 包标记表、nat 地址转换表、filter 过滤表(默认表,过滤的核心)。

  • 五条链:INPUTOUTPUTFORWARDPREROUTINGPOSTROUTING

(五条链是内核预先设置的钩子点,数据包走到对应节点时,就会匹配该链上你写的所有规则)

过滤可以在INPUT和OUTPUT设置,一般在INPUT设置最佳

四张表(优先级顺序:raw → mangle → nat → filter)

表的优先级代表数据包处理先后顺序,优先级越高越早处理。

  1. raw 表(连接跟踪表)
    作用:关闭/开启连接跟踪,规避状态检测性能消耗,极少使用。
    内置链:PREROUTINGOUTPUT
  2. mangle 表(修改数据包标记)
    作用:修改数据包TTL、TOS、MARK标记,用于路由策略、流量限速。
    内置链:PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING(五链全覆盖)
  3. nat 表(地址转换表)
    作用:源地址转换SNAT、目的地址转换DNAT、端口映射。不做过滤
    内置链:
    • PREROUTING:DNAT(入站端口映射)
    • POSTROUTING:SNAT/MASQUERADE(内网上网伪装)
    • OUTPUT:本机出站DNAT
  4. filter 表(过滤表,默认表)
    作用:唯一能放行/丢弃数据包的表,做访问控制、防火墙策略。
    内置链:INPUTFORWARDOUTPUT
    • INPUT:发给本机的包
    • OUTPUT:本机发出的包
    • FORWARD:跨主机转发的包(内网访问外网)
五条链(数据包流经的钩子点)
  1. PREROUTING
    数据包刚到达网卡,还未路由判断。
    适用:DNAT、打标记、关闭连接跟踪。
  2. INPUT
    路由判断后,数据包目标是本机进程。
    适用:本机防火墙拦截外部访问本机端口。
  3. FORWARD
    路由判断后,数据包需要跨网卡转发(本机当网关)。
    适用:内网设备上网、网段之间访问控制。
  4. OUTPUT
    本机程序主动向外发送数据包。
    适用:限制本机主动对外访问。
  5. POSTROUTING
    数据包即将离开本机网卡,路由完成后。
    适用:SNAT、地址伪装。

filter 过滤表 (最常用)

包含三条链:INPUTOUTPUTFORWARD

1.4 包过滤匹配流程

  • 规则链内的匹配顺序
    • 按规则顺序比对匹配即停止LOG 日志动作除外)
    • 若无任何匹配,则执行当前链的默认策略

1.5 实验环境搭建

采用模板机链接克隆出 3 台虚拟机,搭配 WindTerm 远程连接,网络及主机规划如下:

二、IPTABLES 基本用法

Linux 系统默认自带 iptables 命令,可直接配置临时防火墙规则;若需要通过 systemctl 管理 iptables 服务、实现规则开机持久加载 ,CentOS/RHEL 系列必须手动安装 iptables-services 软件包

(但事实上临时的也足够使用,因为实际生产环境中服务器一般数年都不会重启)

2.1 通用注意事项

  1. 命令不指定表名时,默认使用 filter 表
  2. 不指定链名时,默认作用于当前表的所有链
  3. 无规则匹配时,执行链(防火墙)的默认规则
  4. 规范:选项、链名、目标操作(-j 后的 target)用大写字母,其余参数小写;
  5. 程序路径:/sbin/iptables

2.2 命令通用格式

iptables [-t 表名] 选项 [链名] [匹配条件] [-j 目标操作]

(如果不指定表,则默认对filter表进行操作)

  • proxy主机操作
bash 复制代码
[root@proxy ~]# iptables  -t  filter  -I  INPUT -p  icmp  -j  REJECT  #拒绝icmp协议,-t 指定表名,-p指定数据包协议
[root@client ~]# ping  192.168.4.5                          #client主机ping测试,不通
From 192.168.4.5 icmp_seq=1  Destination Port Unreachable
From 192.168.4.5 icmp_seq=2  Destination Port Unreachable

2.3 基本目标操作(规则动作)

动作 作用说明
ACCEPT 允许数据包通过、放行
DROP 直接丢弃数据包,不返回任何回应
REJECT 拒绝数据包通过,会返回拒绝提示信息
LOG 记录数据包日志,匹配后继续向下匹配下一条规则

使用DROP会直接丢弃数据包,不返回任何回应,可以节省资源,增加安全性

补充规则:除 LOG 外,其余动作匹配即停止规则匹配

2.4 常用管理选项

注意!关于条件拒绝的条件一定要注意添加的方式(A/I)!拒绝范围越宽泛的规则应越靠底部

2.5 规则管理实操示例

2.5.1 添加规则
  • 添加新的规则:
    • -A末尾追加
    • -I开头插入
      注意:只有 -I(insert 插入) 支持带数字位置-A(append 追加) 不支持跟数字,语法直接报错
bash 复制代码
# filter表 INPUT 链末尾追加规则:允许所有 tcp 协议数据包
[root@proxy ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT

# filter表 INPUT 链开头插入规则:允许所有 udp 协议数据包
[root@proxy ~]# iptables -I INPUT -p udp -j ACCEPT

# filter表 INPUT 链第2行位置插入规则:允许所有 icmp 协议数据包
[root@proxy ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
2.5.2 查看规则列表
  • -L:查看
  • -n:以数字的形式展示
  • --line-numbers:查看规则时间,标记序号
bash 复制代码
# 查看 filter 表 INPUT 链规则(默认格式,会解析域名)
[root@proxy ~]# iptables -t filter -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere            
REJECT     icmp --  anywhere             anywhere             reject-with icmp-port-unreachable
ACCEPT     tcp  --  anywhere             anywhere 

# 数字格式查看规则(不解析域名,推荐使用)
[root@proxy ~]# iptables -t filter -nL INPUT
Chain INPUT (policy ACCEPT)
#动作       协议     源地址                目标地址
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
REJECT     icmp --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0 

# 数字格式 + 显示规则的序号(精准定位规则)
[root@proxy ~]# iptables -t filter -nL INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    REJECT     icmp --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0
2.5.3 删除、清空规则

--D:删除指定规则(-D 是删除单条规则,必须跟「行号」或「完整规则匹配条件」)

  • -F:清空(-F指定表和链,则清除链内所有规则;-F指定表不指定链,会清除表内所有规则;-F什么都不指定,默认清除filter表的所有规则)
bash 复制代码
# 删除 filter 表 INPUT 链中第 3 条规则
[root@proxy ~]# iptables -D INPUT 3
#等同于:iptables -t filter  -D INPUT 3

# 查看规则验证删除结果
[root@proxy ~]# iptables -nL INPUT --line-numbers

# 清空 filter 表所有链的规则
[root@proxy ~]# iptables -F
# 查看验证
[root@proxy ~]# iptables -nL

# 单独清空 nat 表所有规则
[root@proxy ~]# iptables -t nat -F
# 单独清空 mangle 表INPUT链的所有规则
[root@proxy ~]# iptables -t mangle -F INPUT
2.5.4 设置链默认规则
  • 所有链初始默认规则均为 ACCEPT(默认规则优先级最低)
  • 通过 -P 选项可重置默认规则
    • 若将 INPUT 链默认规则设为 DROP,会直接断开 SSH 远程连接。
    • 注意!默认规则只能是ACCEPT或者DROP,不可以是REJECT
bash 复制代码
# 将 INPUT 链默认规则设置为 DROP(拒绝所有未匹配数据包)
[root@proxy ~]# iptables -P INPUT DROP
#等同于:iptables -t filter -P INPUT DROP

# 查看 INPUT 链默认规则
[root@proxy ~]# iptables -nL INPUT | head -1

# 将 INPUT 链默认规则恢复为 ACCEPT
[root@proxy ~]# iptables -P INPUT ACCEPT
# 再次查看默认规则
[root@proxy ~]# iptables -nL INPUT | head -1

三、防火墙匹配条件

3.1 匹配条件分类

  1. 通用匹配 :可直接独立使用,不依赖其他条件,包含:协议、IP 地址、网卡接口等。如:
    • -p 协议名:协议匹配
    • -s 源地址 / -d 目标地址:地址匹配
    • -i 入站网卡 / -o 出站网卡:接口匹配
  2. 隐含匹配 :依赖前置匹配协议 ,包含:端口、ICMP 类型等。如:
    • --sport 源端口 / --dport 目标端口:端口匹配
    • --icmp-type ICMP 类型:ICMP 类型匹配
  3. 取反条件 :使用英文感叹号 ! 实现条件取反。

3.2 过滤规则实战示例

3.2.1 封禁指定 IP / 网段(黑名单)
bash 复制代码
# 拒绝单个 IP:192.168.4.120 访问本机
[root@proxy ~]# iptables -A INPUT -s 192.168.4.120 -j DROP

# 拒绝整个网段:10.0.10.0/24 所有主机访问本机
[root@proxy ~]# iptables -A INPUT -s 10.0.10.0/24 -j DROP

# 查看规则
[root@proxy ~]# iptables -nL
3.2.2 保护指定服务(限制端口访问,黑白名单)

示例:仅指定网段可访问 22 端口(SSH),其余网段全部拒绝。

bash 复制代码
# 允许 192.168.4.0/24 网段访问本机 22 目标端口
[root@proxy ~]# iptables -A INPUT -s 192.168.4.0/24  -p tcp --dport 22 -j ACCEPT

# 允许 192.168.8.0/24 网段访问本机 22 目标端口
[root@proxy ~]# iptables -A INPUT -s 192.168.8.0/24 -p tcp --dport 22 -j ACCEPT

# 不指定IP地址就是拒绝所有其他网段访问本机 22 目标端口
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
  • **--dport**指代目标端口。

    • INPUT链(别人访问本机):--dport 就是本机端口
    • OUTPUT 链(本机访问外部):--dport 是对方机器端口。
  • **--sport**指代源端口

    • 指代发出这个数据包的主机的端口,永远是发送端的端口,和本机 / 对方无关
3.2.3 禁 Ping 配置

ping的通信流程(A ping B):

可以看到ping请求的通信是双向的

Ping 基于 ICMP 协议,分为请求包(echo-request)和响应包(echo-reply)。

需求:本机可以 Ping 其他主机,其他主机无法 Ping 本机

  • 使用INPUT链或者OUTPUT均可

方式一:配置 INPUT 链(拦截入站 Ping 请求)

bash 复制代码
# 拦截所有 ICMP 回显请求(外部主机 Ping 本机)
[root@proxy ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 放行其余 ICMP 数据包(本机 Ping 外部的响应包)
[root@proxy ~]# iptables -A INPUT -p icmp ! --icmp-type echo-request -j ACCEPT

原理就是:丢掉所有的外来的echo-request请求(因为INPUT进的就是请求),但是放行除了echo-request其他所有包,并且因为自己的ping走的是自己的OUTPUT,所以自己ping不受影响,但可以拒绝别的ping。

方式二:配置 OUTPUT 链(控制出站 ICMP)

bash 复制代码
# 放行本机向外发送的 Ping 请求
[root@proxy ~]# iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
# 拦截其余出站 ICMP 数据包
[root@proxy ~]# iptables -A OUTPUT -p icmp ! --icmp-type echo-request -j DROP

这个的原理是:放行自己发出的echo-request,对方回应的包并不是echo-request类型,且OUTPUT 链只管本机发出去的包,不管别人发给本机的包,所以对方的回复不会被拦截,所以本机自己的ping从发送请求到接收回应都不会收影响。

第二个命令拦截所有出站、类型不是 echo-request 的 ICMP 报文,所以外部的ping能进来,但是本机的回复是echo-reply,会被拦截,出不去

测试结果:

  • proxy 主动 Ping 其他主机:正常通信;
  • client / web1 Ping proxy:无法通信。

四、主机型 & 网络型防火墙

4.1 防火墙类型区分

  1. 主机型防火墙 :保护服务器自身,规则作用于本机 ,仅保护防火墙自身(使用 INPUT/OUTPUT 链);
  2. 网络型防火墙 :保护其他服务器,作为网关/路由 ,转发跨网段数据,保护内网其他服务器(核心使用 FORWARD 链)。

4.2 开启内核 IP 转发(路由功能)

Linux 可作为软路由,跨网段转发数据包,网络型防火墙必须开启 IP 转发

bash 复制代码
# 写入配置文件,永久开启 IPv4 转发
[root@proxy ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
# 刷新内核配置,立即生效
[root@proxy ~]# sysctl -p

# 清空原有防火墙规则,准备配置网络策略
[root@proxy ~]# iptables -F
# 查看规则
[root@proxy ~]# iptables -nL

4.3 后端 Web 服务部署(web1 主机)

bash 复制代码
# 安装 httpd 网站服务
[root@web1 ~]# dnf -y install httpd
# 编写测试网页
[root@web1 ~]# echo "test page" > /var/www/html/index.html
# 启动 httpd 服务
[root@web1 ~]# systemctl restart httpd
# 清空 web1 自身防火墙规则
[root@web1 ~]# iptables -F

4.4 网络型防火墙转发规则测试

  1. 未配置转发规则时,client 可正常跨网段访问 web1(需提前配置 client 网关为 192.168.4.5)
bash 复制代码
[root@client ~]# curl 192.168.8.100
test page
  1. 配置 FORWARD 链规则,拦截 client 访问 web1 的 80 端口
bash 复制代码
# 拒绝 192.168.4.100 访问 目标 TCP 80 端口(跨网段转发拦截)
[root@proxy ~]# iptables -I FORWARD -s 192.168.4.100 -p tcp --dport 80 -j DROP
# 查看 FORWARD 链规则
[root@proxy ~]# iptables -nL FORWARD

# 客户端再次访问,无响应(拦截生效)
[root@client ~]# curl 192.168.8.100

INPUT和OUTPUT防护的是本机,若要拦截经过本机路由转发、属于其他主机之间的流量,必须配置在 FORWARD 链。

注意!INPUT、OUTPUT 是 Linux netfilter 在OSI 三层(网络层 IP 协议栈) 设置的过滤关卡;它们可以读取四层传输层(TCP/UDP/ICMP)的信息作为匹配条件,但自身不属于四层

五、扩展规则匹配

5.1 扩展模块基础语法

依赖系统防火墙模块,格式:

bash 复制代码
-m 扩展模块 --扩展条件 条件值

示例:-m mac --mac-source 00:0C:29:74:BE:21

5.2 常用扩展匹配类型

5.3 MAC 地址匹配

  • 使用-m mac模块,不管其IP地址改为多少,根据mac地址封锁主机
  • 适用于交换网络,针对源MAC地址
  • proxy主机操作,禁止client主机的mac地址,每个人的mac地址不一样

根据物理 MAC 地址封锁主机,修改 IP 也无法绕过规则,适用于局域网。

bash 复制代码
# 拦截指定 MAC 地址的主机访问本机
[root@proxy ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:7a:4c:ff -j DROP

# 清空规则
[root@proxy ~]# iptables -F
# 验证清空结果
[root@proxy ~]# iptables -nL

如何查看mac地址:使用ifconfig命令,其中ether后的一串数字就是mac地址:

5.4 多端口匹配(multiport)

一条规则放行多个端口,连续端口用冒号 : 分隔,离散端口用逗号 , 分隔

bash 复制代码
# 一次性放行 20-22、25、80、110、143、16501-16800 端口
[root@proxy ~]# iptables -A INPUT -p tcp -m multiport --dports 20:22,25,80,110,143,16501:16800 -j ACCEPT

# 查看规则
[root@proxy ~]# iptables -nL

5.5 IP 范围匹配(iprange)

精准控制一段连续 IP 地址的访问权限

示例:仅 192.168.4.1~192.168.4.3 可 SSH 登录,禁止从 192.168.4.0/24 网段其他的主机登录

bash 复制代码
# 允许 192.168.4.1 ~ 192.168.4.3 访问 22 端口
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.4.1-192.168.4.3 -j ACCEPT

# 拒绝该网段其余所有主机访问 22 端口
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP

注意:为什么这里

iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP

和之前3.2练习的

iptables -A INPUT -s 192.168.4.0/24 -p tcp --dport 22 -j ACCEPT

指定ip的位置不一样?

因为iptables的匹配条件的逻辑是"与"关系,且iptables 的匹配顺序不影响逻辑。iptables允许在规则中以任意顺序指定匹配条件,只要语法正确,顺序不影响功能。

六、整体知识点总结

  1. 理解防火墙定义、分类,掌握 Linux 下 firewalld 关闭与 IPTABLES 切换操作;
  2. 熟记 IPTABLES 四表五链架构、filter 表作用与数据包匹配流程;
  3. 熟练使用 IPTABLES 基础命令:添加、查看、删除、清空规则、设置默认策略;
  4. 掌握四大基础动作:ACCEPTDROPREJECTLOG 的区别;
  5. 学会通用匹配、隐含匹配,实现封禁 IP、限制端口、禁 Ping 等常规策略;
  6. 区分主机型防火墙网络型防火墙,掌握 Linux 内核 IP 转发开启方式与 FORWARD 链使用;
  7. 掌握扩展模块用法:MAC 地址、多端口、IP 范围匹配,实现复杂防火墙规则配置。