iptables 防火墙技术详解

目录

前言

[1 iptables概述](#1 iptables概述)

[1.1 Netfilter与iptables关系](#1.1 Netfilter与iptables关系)

[1.1.1 Netfilter](#1.1.1 Netfilter)

[1.1.2 iptables](#1.1.2 iptables)

[1.1.3 两者关系](#1.1.3 两者关系)

[2 iptables的表、链结构](#2 iptables的表、链结构)

[2.1 四表五链结构介绍](#2.1 四表五链结构介绍)

[2.1.1 基本概念](#2.1.1 基本概念)

[2.1.2 四表功能***](#2.1.2 四表功能***)

[2.1.3 五链功能***](#2.1.3 五链功能***)

[2.2 数据包过滤的匹配流程***](#2.2 数据包过滤的匹配流程***)

[2.2.1 规则表应用顺序***](#2.2.1 规则表应用顺序***)

[2.2.2 规则链匹配顺序](#2.2.2 规则链匹配顺序)

[2.2.3 规则链内匹配顺序](#2.2.3 规则链内匹配顺序)

[2.2.4 数据包匹配流程详解](#2.2.4 数据包匹配流程详解)

[3 编写防火墙规则](#3 编写防火墙规则)

[3.1 iptables安装配置](#3.1 iptables安装配置)

[3.1.1 关闭firewalld](#3.1.1 关闭firewalld)

[3.1.2 安装iptables](#3.1.2 安装iptables)

[3.1.3 设置开机启动](#3.1.3 设置开机启动)

[3.2 基本语法与控制类型](#3.2 基本语法与控制类型)

[3.2.1 语法构成](#3.2.1 语法构成)

[3.2.2 注意事项不指定表名时,默认使用 filter 表](#3.2.2 注意事项不指定表名时,默认使用 filter 表)

[3.2.3 数据包控制类型](#3.2.3 数据包控制类型)

[3.3 基本操作命令](#3.3 基本操作命令)

[3.3.1 常用管理参数](#3.3.1 常用管理参数)

[3.3.2 添加新规则](#3.3.2 添加新规则)

[3.3.3 查看规则列表](#3.3.3 查看规则列表)

[3.3.4 删除清空规则](#3.3.4 删除清空规则)

[3.3.5 设置默认策略](#3.3.5 设置默认策略)

[3.4 规则的匹配条件](#3.4 规则的匹配条件)

[3.4.1 通用匹配](#3.4.1 通用匹配)

[3.4.2 隐含匹配](#3.4.2 隐含匹配)

[3.4.3 拓展](#3.4.3 拓展)

[3.4.4 显式匹配](#3.4.4 显式匹配)

[4 总结](#4 总结)


前言

在企业网络环境中,各种应用系统(如Web网站、电子邮件系统、FTP服务器、数据库系统等)都需要通过网络为用户提供服务。如何有效保护这些服务器,过滤不必要的访问请求甚至恶意入侵,成为网络安全的重要课题。

Linux系统中的iptables防火墙正是为解决这些问题而设计。它工作在网络层,对TCP/IP数据包实施精细化的过滤和限制,属于典型的包过滤防火墙(网络层防火墙)。基于内核实现的iptables具有卓越的性能和稳定性,在全球范围内获得了广泛应用。

本文将系统介绍iptables防火墙的核心概念、结构原理、匹配机制和规则配置方法,帮助读者全面掌握这一重要的网络安全技术。

1 iptables概述

1.1 Netfilter与iptables关系

1.1.1 Netfilter
  • Linux防火墙功能由Netfilter组件提供

  • Netfilter工作在内核空间,集成在Linux内核中

  • 采用模块化设计,具有良好的可扩充性

  • 与IP协议栈无缝契合,支持数据包过滤、地址转换和处理操作

  • 官网文档:https://netfilter.org/documentation/

1.1.2 iptables
  • 属于用户空间(User Space)的防火墙管理体系

  • 管理Linux防火墙的命令行程序

  • 位于/sbin/iptables目录下

  • 使插入、修改和删除数据包过滤表中的规则变得容易

1.1.3 两者关系
  • netfilter:内核态的防火墙功能体系

  • iptables:用户态的防火墙管理工具

  • 后期简称为iptables,基于内核防火墙,内置raw、mangle、nat和filter四个规则表

2 iptables的表、链结构

2.1 四表五链结构介绍

2.1.1 基本概念
  • 规则表:容纳各种规则链的容器

  • 规则链:容纳各种防火墙规则的链条

  • 规则:对数据包进行过滤或处理的具体规则

  • 结构关系:表里有链,链里有规则

2.1.2 四表功能***
  1. raw表 :决定是否对数据包进行状态跟踪

    • 包含链:OUTPUT、PREROUTING
  2. mangle表 :修改数据包内容,做流量整形,设置标记

    • 包含链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
  3. nat表 :负责网络地址转换,修改源/目标IP地址或端口

    • 包含链:OUTPUT、PREROUTING、POSTROUTING
  4. filter表 :负责过滤数据包,决定是否放行

    • 包含链:INPUT、FORWARD、OUTPUT
2.1.3 五链功能***
  1. INPUT :处理入站数据包,匹配目标IP为本机的数据包

  2. OUTPUT :处理出站数据包

  3. FORWARD :处理转发数据包,匹配流经本机的数据包

  4. PREROUTING路由选择前 处理数据包,用于DNAT

  5. POSTROUTING路由选择后 处理数据包,用于SNAT

2.2 数据包过滤的匹配流程***

2.2.1 规则表应用顺序***

raw → mangle → nat → filter

2.2.2 规则链匹配顺序
  1. 主机型防火墙
  • 入站数据:PREROUTING → INPUT → 本机应用程序
  • 出站数据:本机应用程序 → OUTPUT → POSTROUTING
  1. 网络型防火墙
  • 转发数据:PREROUTING → FORWARD → POSTROUTING
2.2.3 规则链内匹配顺序
  • 自上向下依次检查,找到匹配规则即停止(LOG策略除外)

  • 找不到匹配规则时,按该链的默认策略处理

  • 默认策略不参与链内规则的顺序编排

2.2.4 数据包匹配流程详解
  1. 入站数据流向:外界数据包 → PREROUTING → 路由选择 → INPUT → 应用程序

  2. 转发数据流向:外界数据包 → PREROUTING → 路由选择 → FORWARD → POSTROUTING

  3. 出站数据流向:本机数据包 → 路由选择 → OUTPUT → POSTROUTING

3 编写防火墙规则

3.1 iptables安装配置

3.1.1 关闭firewalld
复制代码
systemctl stop firewalld.service
systemctl disable firewalld.service
sentenforce 0
3.1.2 安装iptables
复制代码
yum -y install iptables iptables-services
3.1.3 设置开机启动
复制代码
systemctl start iptables.service
systemctl enable iptables.service

3.2 基本语法与控制类型

3.2.1 语法构成

iptables 【-t 表名】【管理参数】【链名】【匹配条件】【-j 控制类型】

3.2.2 注意事项不指定表名时,默认使用 filter
  • 不指定链名时,默认指表内所有链

  • 除非设置链的默认策略,否则必须指定匹配条件

  • 参数、链名、控制类型使用大写字母

3.2.3 数据包控制类型

|----------------|-----------------------|
| ACCEPT | 允许通过 |
| DROP | 直接丢包,不回应 |
| REJECT | 拒绝通过,回应 |
| LOG | 记录日志信息后传递给下一条规则 |
| SNAT | 修改数据包源地址 |
| DNAT | 修改数据包目的地址 |
| MASQUERADE | 伪装成非固定 公网IP地址 |

3.3 基本操作命令

3.3.1 常用管理参数
选项 功能描述 示例
-A 在指定链末尾追加规则 iptables -A INPUT
-I 在指定链中插入新规则 iptables -I INPUT
-P 指定默认规则 iptables -P OUTPUT ACCEPT
-D 删除规则 iptables -t nat -D INPUT
-R 修改、替换规则 iptables -t nat -R INPUT
-L 查看规则 iptables -t nat -L
-n 数字形式显示 iptables -L -n
-v 显示详细信息 iptables -v -L
--line-number 显示规则编号 iptables -L --line-number
-F 清除链中所有规则 iptables -F
-X 清空自定义链规则 iptables -X
-Z 清空链计数器 iptables -Z
-S 查看链的所有规则 iptables -t nat -S
3.3.2 添加新规则
复制代码
iptables -t filter -A INPUT -p icmp -j REJECT       
#在filter表 INPUT链 行末添加:禁止所有ICMP请求进入本机,并告知被拒者
解释:其他计算机将无法成功 ping 通你的服务器

iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT        
#在filter表 INPUT链 第2行添加:允许所有目标端口为 22 的 TCP 请求进入本机
解释:开放了服务器的 SSH 远程登录端口,允许外部连接
3.3.3 查看规则列表
复制代码
iptables -L INPUT --line-numbers
iptables -nL INPUT
iptables -vnL --line-numbers
3.3.4 删除清空规则
复制代码
iptables -D INPUT 5
iptables -F INPUT
iptables -t nat -F
3.3.5 设置默认策略
复制代码
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

3.4 规则的匹配条件

3.4.1 通用匹配
  1. 协议匹配-p 协议名

  2. 地址匹配-s 源地址-d 目的地址

  3. 接口匹配-i 入站网卡-o 出站网卡

复制代码
iptables -A FORWARD ! -p icmp -j ACCEPT
#在filter表 FORWARD链 行末添加:接收所有非ICMP请求进入本机

iptables -A INPUT -s 192.168.80.11 -j DROP
#在filter表 INPUT链 行末添加:拒绝 IP地址为 192.168.80.11 的数据进入本机,并丢弃不回应

iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP 
#在filter表 INPUT链 行首添加:拒绝 192.168.80.0/24网段的数据通过ens33网卡进入本机,并丢弃不回应
3.4.2 隐含匹配
  1. 端口匹配--sport 源端口--dport 目的端口

  2. TCP标记匹配--tcp-flags TCP标记

  3. ICMP类型匹配--icmp-type ICMP类型

复制代码
iptables -A INPUT -p tcp --sport 1000:3000 -j REJECT
#在filter表 INPUT链 行末添加:拒绝所有从外部发起、且源端口号在1000到3000范围内的TCP连接,并告知被拒者

iptables -A INPUT -p icmp --icmp-type 8 -j DROP        
#丢弃所有发往本机的 ICMP Echo Request 请求包,并丢弃不回应
3.4.3 拓展

--icmp-type 8 vs -p icmp

|---------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
| -p icmp -j DROP | -p icmp --icmp-type 8 -j DROP |
| 这会丢弃所有类型的 ICMP 包,包括 Echo Request (8)、Echo Reply (0)、Destination Unreachable (3) 等 | 这只丢弃 ICMP Echo Request 包 (即入站 ping 请求)。其他类型的 ICMP 包 (如出站 ping 的回复、网络错误消息等)仍然被允许 |
| 影响: 你不仅无法被 ping 通,还可能影响路径 MTU 发现、网络诊断等关键功能,可能导致网络连接问题 | 影响: 效果非常精准。你的服务器仍然可以正常 ping 通外部(因为能收到 Echo Reply (Type 0)),也能接收其他重要的网络控制消息,只是别人无法 ping 通你 |

3.4.4 显式匹配
  1. 多端口匹配-m multiport --sport/dport 端口列表

  2. IP范围匹配-m iprange --src-range IP范围

  3. MAC地址匹配-m mac --mac-source MAC地址

  4. 状态匹配-m state --state 连接状态

复制代码
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
#在filter表 INPUT链 行末添加:接受所有端口号为80,22,21,20,53的TCP数据进入本机

iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
#在filter表 FORWARD链 行末添加:拒绝所有 新连接状态且没有syn标志 的TCP数据,并丢弃不回应

4 总结

iptables作为Linux系统中最强大的防火墙工具,提供了灵活而精细的网络数据包控制能力。通过本文的系统学习,我们掌握了:

  1. 核心架构 :理解了netfilter与iptables的关系,以及四表五链的结构设计理念

  2. 匹配机制 :掌握了数据包在表和链间的流转流程匹配优先级

  3. 规则配置 :学会了使用各种管理选项进行规则的添加、查看、删除和修改

  4. 匹配条件 :熟悉了通用匹配隐含匹配显式匹配三种匹配方式的应用场景

在实际生产环境中,iptables的合理配置对网络安全至关重要。建议遵循"默认拒绝,按需开放"的原则,结合具体的业务需求设计防火墙规则。同时,要注意规则的测试和验证,避免因配置失误导致的服务中断。通过持续学习和实践,能够更加熟练地运用iptables构建坚固的网络安全防护体系。

重要提醒:在对远程服务器进行iptables配置时,务必先设置允许SSH连接的规则,然后再设置默认策略为DROP,防止因配置失误导致无法远程连接服务器。