深入理解 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
三种数据流向:
  1. 入站数据流(目标为本机):

    text

    PREROUTING → INPUT → 应用程序
  2. 出站数据流(本机发出):

    text

    应用程序 → OUTPUT → POSTROUTING
  3. 转发数据流(经本机转发):

    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 常见问题排查

  1. 规则不生效:检查规则顺序,确认没有更早的匹配规则

  2. 无法远程连接:检查是否误删了 SSH 规则

  3. 服务无法访问:确认相关端口的规则已正确配置

  4. 性能问题:将常用规则放在前面,减少匹配时间

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 系统中功能强大、灵活性高的防火墙工具,通过深入理解其表链结构、数据包处理流程和规则配置方法,你可以构建出适合各种场景的网络安全防护体系。

在实际应用中,建议遵循"最小权限原则",只开放必要的服务和端口,定期审查和优化防火墙规则,结合日志监控和分析,不断提升网络安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值