目录
前言
1 iptables概述
1.1 Netfilter与iptables关系
1.1.1 Netfilter
1.1.2 iptables
1.1.3 两者关系
2 iptables的表、链结构
2.1 四表五链结构介绍
2.1.1 基本概念
2.1.2 四表功能***
2.1.3 五链功能***
2.2 数据包过滤的匹配流程***
2.2.1 规则表应用顺序***
2.2.2 规则链匹配顺序
2.2.3 规则链内匹配顺序
2.2.4 数据包匹配流程详解
3 编写防火墙规则
3.1 iptables安装配置
3.1.1 关闭firewalld
3.1.2 安装iptables
3.1.3 设置开机启动
3.2 基本语法与控制类型
3.2.1 语法构成
3.2.2 注意事项不指定表名时,默认使用 filter 表
3.2.3 数据包控制类型
3.3 基本操作命令
3.3.1 常用管理参数
3.3.2 添加新规则
3.3.3 查看规则列表
3.3.4 删除清空规则
3.3.5 设置默认策略
3.4 规则的匹配条件
3.4.1 通用匹配
3.4.2 隐含匹配
3.4.3 拓展
3.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 四表功能***
-
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,防止因配置失误导致无法远程连接服务器。