目录
[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协议栈无缝契合,支持数据包过滤、地址转换和处理操作
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 四表功能***
-
raw表 :决定是否对数据包进行状态跟踪
- 包含链:OUTPUT、PREROUTING
-
mangle表 :修改数据包内容,做流量整形,设置标记
- 包含链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
-
nat表 :负责网络地址转换,修改源/目标IP地址或端口
- 包含链:OUTPUT、PREROUTING、POSTROUTING
-
filter表 :负责过滤数据包,决定是否放行
- 包含链:INPUT、FORWARD、OUTPUT
2.1.3 五链功能***
-
INPUT :处理入站数据包,匹配目标IP为本机的数据包
-
OUTPUT :处理出站数据包
-
FORWARD :处理转发数据包,匹配流经本机的数据包
-
PREROUTING :路由选择前 处理数据包,用于DNAT
-
POSTROUTING :路由选择后 处理数据包,用于SNAT
2.2 数据包过滤的匹配流程***
2.2.1 规则表应用顺序***
raw → mangle → nat → filter
2.2.2 规则链匹配顺序
- 主机型防火墙
- 入站数据:PREROUTING → INPUT → 本机应用程序
- 出站数据:本机应用程序 → OUTPUT → POSTROUTING
- 网络型防火墙
- 转发数据:PREROUTING → FORWARD → POSTROUTING
2.2.3 规则链内匹配顺序
-
自上向下依次检查,找到匹配规则即停止(LOG策略除外)
-
找不到匹配规则时,按该链的默认策略处理
-
默认策略不参与链内规则的顺序编排
2.2.4 数据包匹配流程详解
-
入站数据流向:外界数据包 → PREROUTING → 路由选择 → INPUT → 应用程序
-
转发数据流向:外界数据包 → PREROUTING → 路由选择 → FORWARD → POSTROUTING
-
出站数据流向:本机数据包 → 路由选择 → 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 通用匹配
-
协议匹配 :
-p 协议名
-
地址匹配 :
-s 源地址
、-d 目的地址
-
接口匹配 :
-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 隐含匹配
-
端口匹配 :
--sport 源端口
、--dport 目的端口
-
TCP标记匹配 :
--tcp-flags TCP标记
-
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 显式匹配
-
多端口匹配 :
-m multiport --sport/dport 端口列表
-
IP范围匹配 :
-m iprange --src-range IP范围
-
MAC地址匹配 :
-m mac --mac-source MAC地址
-
状态匹配 :
-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系统中最强大的防火墙工具,提供了灵活而精细的网络数据包控制能力。通过本文的系统学习,我们掌握了:
-
核心架构 :理解了netfilter与iptables的关系,以及四表五链的结构设计理念
-
匹配机制 :掌握了数据包在表和链间的流转流程 和匹配优先级
-
规则配置 :学会了使用各种管理选项进行规则的添加、查看、删除和修改
-
匹配条件 :熟悉了通用匹配 、隐含匹配 和显式匹配三种匹配方式的应用场景
在实际生产环境中,iptables的合理配置对网络安全至关重要。建议遵循"默认拒绝,按需开放"的原则,结合具体的业务需求设计防火墙规则。同时,要注意规则的测试和验证,避免因配置失误导致的服务中断。通过持续学习和实践,能够更加熟练地运用iptables构建坚固的网络安全防护体系。
重要提醒:在对远程服务器进行iptables配置时,务必先设置允许SSH连接的规则,然后再设置默认策略为DROP,防止因配置失误导致无法远程连接服务器。