Linux iptables 是 Linux 系统中功能强大且应用广泛的防火墙工具,它通过配置规则来控制进出网络数据包的流动,从而保障系统安全,本文将详细介绍 iptables 规则的基本概念、结构、常见操作及最佳实践,帮助读者更好地理解和运用这一工具。

iptables 规则的基本概念与结构
iptables 规则由匹配条件和处理动作两部分组成,匹配条件用于定义数据包的特征,如源/目的 IP 地址、端口号、协议类型等;处理动作则规定了当数据包符合条件时,防火墙应采取的操作,如允许(ACCEPT)、拒绝(REJECT)、丢弃(DROP)等,iptables 规则则按照顺序依次检查,当数据包匹配某条规则时,执行相应的动作并停止后续规则的匹配。
iptables 的规则表(table)是规则存储的逻辑集合,不同表处理网络数据的不同阶段,最常用的表包括 filter 表、nat 表和 mangle 表,filter 表是默认的表,主要用于过滤数据包,实现包过滤防火墙的功能;nat 表用于网络地址转换,常用于共享上网或端口映射;mangle 表则用于修改数据包的头部信息,如服务类型(TOS)字段。
每个表由若干链(chain)组成,链是规则的容器,按照数据包的流向进行分类,PREROUTING 链用于处理刚进入网络栈的数据包,在路由决策之前;INPUT 链用于处理目标为本机的数据包;FORWARD 链用于处理经过本机但不进入本机的数据包;OUTPUT 链用于处理本机发出的数据包;POSTROUTING 链用于处理即将离开网络栈的数据包,在路由决策之后,不同表的链具有不同的功能,nat 表的 PREROUTING 和 POSTROUTING 链常用于地址转换。
iptables 规则的常见操作
-
查看规则
使用iptables -L命令可以列出 filter 表中所有链的规则,默认按顺序显示规则编号、目标、源地址、目的地址、端口等信息,若要查看特定链的规则,可使用iptables -L 链名,iptables -L INPUT,通过-n参数(numeric)可以避免域名解析,直接显示 IP 地址和端口号,提高查看速度;使用-v参数(verbose)可以显示更详细的信息,如数据包数量、字节数等。 -
添加规则
添加规则分为添加到链的末尾(-A 选项)和插入到链的开头(-I 选项),允许来自 192.168.1.100 的 IP 访问本机的 22 端口,可执行:iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT。-s 表示源地址(source),-p 表示协议(protocol),–dport 表示目的端口(destination port),-j 表示动作(jump),若要插入规则到 INPUT 链的开头,可将 -A 改为 -I,iptables -I INPUT 1 -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT,数字 1 表示插入位置。
-
删除规则
删除规则可通过iptables -D命令实现,有两种方式:一是直接指定规则内容,需与添加时的命令完全一致(除 -A/-I 外),iptables -D INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT;二是通过规则编号删除,需先使用iptables -L --line-numbers查看带编号的规则列表,然后执行iptables -D 链名 编号,iptables -D INPUT 3表示删除 INPUT 链的第 3 条规则。 -
修改规则
iptables 本身没有直接修改规则的命令,但可以通过删除旧规则再添加新规则的方式实现,使用iptables -R命令可以替换指定编号的规则,iptables -R INPUT 3 -s 192.168.1.200 -p tcp --dport 22 -j ACCEPT将 INPUT 链的第 3 条规则替换为允许 192.168.1.200 访问 22 端口。
iptables 规则的高级匹配与动作
-
高级匹配条件
iptables 支持丰富的匹配条件,可实现更精细的访问控制,通过-m multiport --dport 80,443可以匹配多个目的端口(如 HTTP 和 HTTPS);通过-m state --state ESTABLISHED,RELATED可以匹配已建立连接或相关联的数据包,实现允许回包的功能,避免影响正常通信;通过-m limit --limit 60/min可以限制匹配速率,防止洪水攻击;通过-m mac --mac-source xx:xx:xx:xx:xx:xx可以根据源 MAC 地址进行过滤。 -
自定义链与动作
当规则数量较多时,可以通过自定义链(iptables -N 链名)将规则分类管理,提高可读性,创建一个名为 WEB_RULES 的自定义链,将 HTTP 和 HTTPS 相关规则添加到该链,然后在 INPUT 链中通过-j WEB_RULES跳转到自定义链,除了 ACCEPT、REJECT、DROP 等基本动作外,还有 LOG 动作(记录日志)、REDIRECT 动作(端口重定向,常用于透明代理)等。
iptables 规则的保存与最佳实践
-
规则保存
iptables 规则默认在内存中存储,重启后会丢失,不同 Linux 发行版的保存方式不同:在 CentOS/RHEL 中,使用service iptables save或iptables-save > /etc/sysconfig/iptables保存规则;在 Debian/Ubuntu 中,使用iptables-save > /etc/iptables/rules.v4保存,并确保安装了iptables-persistent包。
-
最佳实践
- 默认策略:建议将 INPUT 链的默认策略设置为 DROP,仅开放必要的端口,遵循“最小权限原则”。
iptables -P INPUT DROP。 - 规则顺序:将常用规则放在前面,减少匹配次数;将允许已建立连接的规则(
-m state --state ESTABLISHED,RELATED -j ACCEPT)放在 filter 表 INPUT 链的前面,避免影响正常通信。 - 测试与备份:在修改规则前先备份当前规则(
iptables-save > backup.iptables),避免误操作导致无法访问;在生产环境中修改规则时,建议在非高峰期进行,并逐步验证。 - 日志管理:对于需要记录的规则(如拒绝的连接),使用 LOG 动作时,需指定日志前缀和日志级别,并通过日志轮转工具(如 logrotate)管理日志文件,避免日志占满磁盘。
- 默认策略:建议将 INPUT 链的默认策略设置为 DROP,仅开放必要的端口,遵循“最小权限原则”。
通过合理配置 iptables 规则,可以有效提升 Linux 系统的网络安全性,无论是个人服务器还是企业级应用,掌握 iptables 的使用都是系统管理员的必备技能,在实际应用中,需结合具体需求灵活运用匹配条件和动作,并遵循安全最佳实践,确保防火墙规则既高效又可靠。

















