深入理解 iptables:Linux 防火墙从入门到精通
前言
一、iptables 核心概念解析
1.1 Netfilter 与 iptables 的关系
核心区别:
1.2 iptables 的工作原理
二、iptables 的表与链架构详解
2.1 四张表的功能与作用
2.2 五条链的处理时机
2.3 数据包处理流程详解
规则表优先级顺序:
三种数据流向:
规则匹配机制:
三、iptables 实战配置指南
3.1 环境准备与安装
在 CentOS/RHEL 7+ 中切换至 iptables:
3.2 基础语法结构
注意事项:
3.3 常用控制类型说明
3.4 规则管理实战示例
查看现有规则:
添加规则示例:
删除和清空规则:
设置默认策略:
3.5 高级匹配条件详解
通用匹配:
隐含匹配(需指定协议):
显式匹配(使用扩展模块):
3.6 实用配置案例
基础服务器保护:
NAT 转发配置(网关服务器):
防止常见攻击:
四、维护与故障排除
4.1 规则保存与恢复
4.2 常见问题排查
4.3 监控与日志分析
五、相关参数表
表选择参数
规则管理选项
查看选项
基本匹配条件
基本动作
结语
前言
在当今互联网环境中,企业通过各种应用系统(如 Web 服务器、电子邮件系统、FTP 服务、数据库系统等)为用户提供网络服务。然而,网络安全威胁日益增多,如何有效保护这些服务器,过滤不必要的访问甚至恶意入侵,成为了每个系统管理员必须面对的问题。
Linux 系统中的防火墙工具——iptables,正是解决这一问题的强大武器。本文将深入介绍 iptables 的基本概念、表链结构、数据包处理流程以及详细的规则配置方法,帮助你构建坚实可靠的网络防护体系。
一、iptables 核心概念解析
1.1 Netfilter 与 iptables 的关系
Linux 防火墙功能主要由 Netfilter 组件提供,这是一个集成在内核中的子系统,负责实际的数据包过滤和处理工作。
核心区别:
-
Netfilter:工作在内核空间(Kernel Space),是实际的防火墙功能体系,由一系列信息包过滤表组成,包含内核用来控制信息包过滤处理的规则集。
-
iptables:工作在用户空间(User Space),是管理防火墙规则的命令行工具,位于
/sbin/iptables
,用于插入、修改和删除数据包过滤表中的规则。
简单理解:Netfilter 是引擎,iptables 是方向盘和操控台。
1.2 iptables 的工作原理
iptables 工作在网络层,针对 TCP/IP 数据包实施过滤和限制,属于典型的包过滤防火墙。它会对请求的数据包头部信息进行分析,根据预设的规则进行匹配,决定数据包的命运(放行、拒绝或修改)。
二、iptables 的表与链架构详解
2.1 四张表的功能与作用
iptables 包含四个内置表,每个表都有其特定的用途:
表名 | 功能描述 | 包含的链 |
---|---|---|
raw | 决定是否对数据包进行状态跟踪 | OUTPUT, PREROUTING |
mangle | 修改数据包内容,用于流量整形 | INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING |
nat | 网络地址转换,修改源/目标IP或端口 | OUTPUT, PREROUTING, POSTROUTING |
filter | 过滤数据包,决定是否放行(最常用) | INPUT, FORWARD, OUTPUT |
2.2 五条链的处理时机
链名 | 处理时机 | 典型应用 |
---|---|---|
INPUT | 处理目标为本机的数据包 | 保护本机服务 |
OUTPUT | 处理本机发出的数据包 | 控制出站流量 |
FORWARD | 处理经本机转发的数据包 | 路由器功能 |
PREROUTING | 路由选择前处理数据包 | DNAT(目的地址转换) |
POSTROUTING | 路由选择后处理数据包 | SNAT(源地址转换) |
2.3 数据包处理流程详解
规则表优先级顺序:
raw` → `mangle` → `nat` → `filter
三种数据流向:
-
入站数据流(目标为本机):
text
PREROUTING → INPUT → 应用程序
-
出站数据流(本机发出):
text
应用程序 → OUTPUT → POSTROUTING
-
转发数据流(经本机转发):
text
PREROUTING → FORWARD → POSTROUTING
规则匹配机制:
-
自上而下逐条匹配,遵循"匹配即停止"原则
-
LOG 操作是个例外,记录日志后继续匹配下一条规则
-
若无匹配规则,则执行链的默认策略(默认通常为 ACCEPT)
三、iptables 实战配置指南
3.1 环境准备与安装
在 CentOS/RHEL 7+ 中切换至 iptables:
bash
# 停止并禁用 firewalld systemctl stop firewalld systemctl disable firewalld # 安装 iptables 服务 yum install -y iptables iptables-services # 启动并设置开机自启 systemctl start iptables systemctl enable iptables # 保存当前规则 service iptables save
3.2 基础语法结构
bash
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
注意事项:
-
不指定表名时,默认为
filter
表 -
不指定链名时,默认为表内的所有链
-
选项、链名、控制类型使用大写字母
-
除非设置链的默认策略,否则必须指定匹配条件
3.3 常用控制类型说明
控制类型 | 说明 | 使用场景 |
---|---|---|
ACCEPT | 允许数据包通过 | 放行合法流量 |
DROP | 直接丢弃数据包 | 静默拒绝访问 |
REJECT | 拒绝并发送响应 | 明确拒绝访问 |
LOG | 记录日志信息 | 调试和审计 |
SNAT | 修改源地址 | 出口地址转换 |
DNAT | 修改目的地址 | 入口地址转换 |
MASQUERADE | 动态IP伪装 | 拨号网络环境 |
3.4 规则管理实战示例
查看现有规则:
bash
# 查看 filter 表所有规则(带编号) iptables -L -n --line-numbers # 查看 nat 表规则(数字格式显示) iptables -t nat -nL # 查看详细计数信息 iptables -vnL
添加规则示例:
bash
# 允许 SSH 连接(插入到第2条位置) iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT # 允许本地回环接口 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接和相关的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 拒绝所有 ping 请求 iptables -A INPUT -p icmp --icmp-type 8 -j DROP
删除和清空规则:
bash
# 按编号删除规则 iptables -D INPUT 3 # 按内容删除规则 iptables -D INPUT -p tcp --dport 80 -j ACCEPT # 清空所有规则(慎用!) iptables -F # 清空特定表的规则 iptables -t nat -F
设置默认策略:
bash
# 设置默认拒绝所有入站连接 iptables -P INPUT DROP # 设置默认允许所有出站连接 iptables -P OUTPUT ACCEPT # 设置默认拒绝所有转发 iptables -P FORWARD DROP
重要提示:设置默认策略为 DROP 前,务必先放行必要的管理连接(如 SSH),否则可能导致无法远程管理服务器!
3.5 高级匹配条件详解
通用匹配:
bash
# 基于源地址匹配 iptables -A INPUT -s 192.168.1.100 -j DROP iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 基于目标地址匹配 iptables -A OUTPUT -d 10.0.0.0/8 -j DROP # 基于网络接口匹配 iptables -A INPUT -i eth0 -j ACCEPT iptables -A OUTPUT -o eth1 -j ACCEPT # 基于协议匹配 iptables -A INPUT -p tcp -j ACCEPT iptables -A INPUT -p udp -j ACCEPT iptables -A INPUT -p icmp -j DROP
隐含匹配(需指定协议):
bash
# 端口匹配 iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 目的端口 iptables -A INPUT -p udp --sport 53 -j ACCEPT # 源端口 # 端口范围匹配 iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT iptables -A INPUT -p tcp --dport 1000:2000 -j ACCEPT # ICMP 类型匹配 iptables -A INPUT -p icmp --icmp-type 8 -j DROP # 禁止 ping iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT # 允许 ping 回复
显式匹配(使用扩展模块):
bash
# 多端口匹配 iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT # IP 范围匹配 iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP # MAC 地址匹配 iptables -A INPUT -m mac --mac-source 00:1A:2B:3C:4D:5E -j DROP # 连接状态匹配(最常用) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT # 限制连接速率 iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
3.6 实用配置案例
基础服务器保护:
bash
# 清空所有规则 iptables -F # 设置默认策略 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 允许本地回环 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 开放必要端口 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS # 允许 ICMP (ping) iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/second -j ACCEPT # 记录并拒绝其他所有入站连接 iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " iptables -A INPUT -j DROP
NAT 转发配置(网关服务器):
bash
# 启用 IP 转发 echo 1 > /proc/sys/net/ipv4/ip_forward # SNAT:内网通过公网IP上网 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE # DNAT:将公网IP端口映射到内网服务器 iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80 iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 22 -j DNAT --to-destination 192.168.0.101:22
防止常见攻击:
bash
# 防止 SYN 洪水攻击 iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT # 防止 Ping 洪水攻击 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT # 阻止无效数据包 iptables -A INPUT -m state --state INVALID -j DROP # 防止端口扫描 iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
四、维护与故障排除
4.1 规则保存与恢复
bash
# 保存当前规则(CentOS 6/7) service iptables save # 或 iptables-save > /etc/sysconfig/iptables # 恢复规则 iptables-restore < /etc/sysconfig/iptables # 备份规则 iptables-save > iptables-backup-$(date +%Y%m%d).rules
4.2 常见问题排查
-
规则不生效:检查规则顺序,确认没有更早的匹配规则
-
无法远程连接:检查是否误删了 SSH 规则
-
服务无法访问:确认相关端口的规则已正确配置
-
性能问题:将常用规则放在前面,减少匹配时间
4.3 监控与日志分析
bash
# 查看实时日志 tail -f /var/log/messages | grep IPTABLES # 统计规则匹配次数 iptables -L -v -n # 重置计数器 iptables -Z
五、相关参数表
表选择参数
参数 | 说明 | 示例 |
---|---|---|
-t filter | 过滤表(默认) | iptables -t filter -L |
-t nat | 网络地址转换表 | iptables -t nat -L |
-t mangle | 包修改表 | iptables -t mangle -L |
-t raw | 原始数据包表 | iptables -t raw - |
规则管理选项
选项 | 说明 | 示例 |
---|---|---|
-A | 在链尾追加规则 | iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
-I | 在指定位置插入规则 | iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT |
-D | 删除规则 | iptables -D INPUT 3 |
-R | 替换规则 | iptables -R INPUT 1 -p tcp --dport 80 -j DROP |
-F | 清空链中所有规则 | iptables -F INPUT |
-Z | 清空计数器 | iptables -Z INPUT |
-N | 创建新链 | iptables -N MY_CHAIN |
-X | 删除自定义空链 | iptables -X MY_CHAIN |
-P | 设置链默认策略 | iptables -P INPUT DROP |
查看选项
选项 | 说明 | 示例 |
---|---|---|
-L | 列出规则 | iptables -L |
-n | 数字格式显示 | iptables -nL |
-v | 详细信息显示 | iptables -vL |
--line-numbers | 显示规则行号 | iptables -L --line-numbers |
-x | 显示精确计数值 | iptables -L -x |
--modprobe | 自动加载模块 | iptables --modprobe=ip_tables -L |
基本匹配条件
参数 | 说明 | 示例 |
---|---|---|
-p | 协议匹配 | -p tcp , -p udp , -p icmp , -p all |
-s | 源地址匹配 | -s 192.168.1.1 , -s 192.168.1.0/24 |
-d | 目标地址匹配 | -d 10.0.0.1 , -d 10.0.0.0/8 |
-i | 入站网卡匹配 | -i eth0 , -i lo |
-o | 出站网卡匹配 | -o eth1 , -o ppp0 |
-m | 加载扩展模块 | -m state , -m multiport |
基本动作
动作 | 说明 | 示例 |
---|---|---|
ACCEPT | 接受数据包 | -j ACCEPT |
DROP | 丢弃数据包 | -j DROP |
REJECT | 拒绝并发送错误 | -j REJECT |
RETURN | 返回调用链 | -j RETURN |
LOG | 记录日志 | -j LOG |
结语
iptables 是 Linux 系统中功能强大、灵活性高的防火墙工具,通过深入理解其表链结构、数据包处理流程和规则配置方法,你可以构建出适合各种场景的网络安全防护体系。
在实际应用中,建议遵循"最小权限原则",只开放必要的服务和端口,定期审查和优化防火墙规则,结合日志监控和分析,不断提升网络安全性。