今天简单回顾一下iptables吧

12 阅读11分钟

iptables是什么

iptables是Linux系统中一款基于内核的包过滤防火墙工具,核心作用是通过定义规则,对进出服务器的网络数据包进行允许、拒绝、转发等管控,是保障服务器网络安全的核心组件。它并非独立防火墙,而是内核netfilter模块的管理接口,支持精细化的端口、IP、协议管控,是必备技能。

iptables的核心作用与应用场景

作为Linux系统的第一道安全屏障,iptables的核心用途覆盖日常运维与生产环境需求:

  • 端口访问控制:仅开放业务所需端口(如Web的80/443、SSH的22端口),拒绝无关端口访问,减少攻击面。
  • IP黑白名单管控:允许指定IP/网段访问服务器(如办公网段SSH登录),拒绝恶意IP。
  • 数据包转发:配合内核转发参数,实现端口映射(如将公网端口映射到内网服务)、跨网段数据包转发,支撑网关、代理场景。
  • 流量日志审计:记录特定端口、IP的访问日志,便于排查异常访问、攻击行为,为安全分析提供依据。
  • 拒绝恶意行为:拦截ICMP ping请求(禁止服务器被ping通)、防止SYN洪水攻击,提升服务器抗攻击能力。

iptables的核心优势

  • 内核级防护:基于Linux内核netfilter模块工作,性能损耗低,适配高并发服务器场景。
  • 规则精细化:支持按IP、端口、协议、数据包状态(NEW/ESTABLISHED/RELATED)等多维度定义规则。
  • 灵活可扩展:支持规则保存/恢复、自定义链管理,可适配单机、集群等不同架构需求。
  • 免费开源:内置于绝大多数Linux发行版(CentOS、Ubuntu等),无需额外安装付费组件。
  • 兼容性强:支持IPv4(iptables)和IPv6(ip6tables),适配各类网络环境。

iptables常说的四表五链

很多新手刚接触iptables就被“表”“链”绕晕,其实可以把它类比成一个带分层关卡的安检系统:数据包就是进入场馆的人,“表”是不同功能的安检区域,“链”是区域内的检查流程,“规则”就是每个流程的检查标准。先搞懂四表五链,后续配置规则会一目了然。

一、核心:四表(功能分类区域)

表按功能划分,优先级从高到低为:raw>mangle>nat>filter,数据包会按优先级依次经过各表的处理,匹配到规则后执行对应动作(未匹配则进入下一个表)。重点掌握filter表和nat表即可,另外两个表相对较少使用。

  • filter 表(过滤表,默认表) :最常用的表,核心负责“允许/拒绝”数据包进出服务器,不修改数据包内容。新手日常配置的端口、IP管控,基本都在这个表操作,包含INPUT(入站)、OUTPUT(出站)、FORWARD(转发)三条核心链。
  • nat 表(地址转换表) :负责修改数据包的IP或端口,实现端口映射、内网穿透等功能。比如把公网IP的8080端口映射到内网服务器的80端口,就需要在这个表配置,包含PREROUTING、POSTROUTING、OUTPUT三条链。
  • mangle 表(修改表) :用于修改数据包的标记(如TTL值、服务类型TOS),主要场景是流量整形、QoS(服务质量)管控,极少用到,本此编写不涉及。
  • raw 表(原始表) :优先级最高,负责关闭数据包的“连接跟踪”功能,减少内核资源占用,多用于高并发服务器优化,此处不深入讲解。

二、关键:五链(数据包流转流程)

链是表内的规则执行序列,按数据包的流转方向划分,共五条核心链,数据包会沿着固定路径经过这些链,触发对应规则。

  • INPUT 链(入站链) :针对“目标是本机”的数据包(如外部电脑访问本机的SSH端口),所有入站数据包都会先经过这条链,是防护的核心链。
  • OUTPUT 链(出站链) :针对“由本机发出”的数据包(如本机访问外部网站),控制本机对外发起的网络请求。
  • FORWARD 链(转发链) :针对“不是目标本机、需要转发给其他机器”的数据包(比如本机作为网关,转发内网机器的请求到公网),仅当本机开启IP转发时生效。
  • PREROUTING 链(路由前链) :在数据包做路由决策前触发,主要用于nat表的端口映射(修改目标IP/端口)。
  • POSTROUTING 链(路由后链) :在数据包做路由决策后触发,主要用于 nat 表的源地址转换(修改数据包的源IP,让内网机器能通过公网IP上网)。

必记:数据包流转简化路径

不用死记所有流程,记住两个核心场景即可:

  1. 外部访问本机(如SSH登录):数据包 → PREROUTING 链 → 路由判断(目标是本机) → INPUT 链(执行过滤规则) → 本机进程。
  2. 本机访问外部(如访问百度):数据包 → OUTPUT 链(执行过滤规则) → 路由判断(目标是外部) → POSTROUTING 链 → 发送到外部。

简单说:入站找 INPUT,出站找 OUTPUT,端口映射找 PREROUTING,内网上网找 POSTROUTING。

怎么使用iptables?

CentOS 7 默认预装iptables,若已安装firewalld(默认防火墙),需先禁用firewalld,再启用iptables。

1. 环境准备

# 安装iptables(若未预装)
yum install -y iptables iptables-services

# 启动iptables并设置开机自启
systemctl start iptables
systemctl enable iptables

# 查看iptables状态
systemctl status iptables

2. 核心操作:规则的增删改查

搞懂四表五链后,规则配置就很简单了。iptables默认操作filter表。

常用命令格式统一为: iptables [-t 表名] 动作 [链名] [匹配条件] -j 目标动作

先聚焦filter表的 INPUT 链(管控入站),先练熟基础操作再拓展其他表和链。

基础规则配置(filter表,最常用)
# 1. 查看当前规则
iptables -L -n --line-numbers
# 说明:-L=列出规则,-n=IP/端口显示数字(不解析域名,更快),--line-numbers=显示规则序号(方便后续删改)

# 2. 允许SSH端口(22)入站(生产环境必开!否则配置完会被自己踢下线)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 拆解:-A=在链末尾加规则,INPUT=作用于入站链,-p tcp=指定TCP协议,--dport 22=目标端口(本机SSH端口),-j ACCEPT=允许通过

# 3. 允许Web/数据库服务端口(80443/3306)入站
iptables -A INPUT -p tcp --dport 80 -j ACCEPT  # HTTP协议
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS协议
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # 假设MySQL

# 4. 允许本机回环地址(lo)访问(必配!否则本地服务会异常)
iptables -A INPUT -i lo -j ACCEPT
# 说明:lo是本机回环网卡,比如本地程序访问127.0.0.1,必须允许

# 5. 允许已建立连接的数据包入站(避免正常通信被拦截)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 拆解:-m state=加载状态匹配模块,ESTABLISHED=已建立的连接,RELATED=关联连接,这两条规则能保证正常通信不中断

# 6. 拒绝所有未匹配的入站数据包(最后配置!先开白名单再关黑名单)
iptables -A INPUT -j REJECT
# 说明:REJECT=拒绝并返回提示,便于排查问题

# 7. 拒绝ICMP ping请求
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
# 说明:--icmp-type 8=ping请求,类型0=ping响应,拒绝请求就无法被ping通
规则的删除与修改
# 1. 按规则序号删除
# 第一步:查看规则序号(记住要删的规则序号,比如3)
iptables -L -n --line-numbers
# 第二步:删除INPUT链中序号为3的规则
iptables -D INPUT 3
# 说明:-D=删除规则,INPUT=目标链,3=规则序号

# 2. 按规则内容删除(需精确匹配,新手慎用,容易删错)
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
# 说明:必须和添加时的规则完全一致,包括空格、参数顺序

# 3. 清空所有规则(谨慎操作!生产环境先备份再清空)
iptables -F INPUT # 仅清空INPUT链规则
iptables -F       # 清空所有链规则(filter表)
iptables -t nat -F # 清空nat表所有规则(进阶用)

# 4. 修改规则(替换指定序号的规则,比如优化SSH访问权限)
iptables -R INPUT 2 -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
# 拆解:-R=替换规则,2=规则序号,-s 192.168.1.0/24=仅允许内网网段SSH登录,更安全
# 用途:把原来允许所有IP SSH登录,改成仅允许内网IP,提升安全性

3. 高级场景:nat表端口映射(内网穿透)

若需将公网服务器端口映射到内网服务器仅供演示,别真的把3306给映射到公网!,需使用nat表配置:

# 场景:本机是公网服务器(公网IP 1.2.3.4,内网IP 192.168.1.1),想把公网3306端口映射到内网MySQL服务器(192.168.1.100:3306),让外部能访问内网MySQL

# 1. 开启内核IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 永久开启IP转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p # 重载配置,立即生效

# 2. 配置端口映射(修改目标IP,用nat表的PREROUTING链)
iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 3306 -j DNAT --to-destination 192.168.1.100:3306
# 拆解:-t nat=指定nat表,PREROUTING=路由前链(先改目标IP再路由),-d 1.2.3.4=目标公网IP,DNAT=目标地址转换,--to-destination=内网目标IP:端口

# 3. 配置源地址转换(让内网服务器响应包能回传,用nat表的POSTROUTING链)
iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 3306 -j SNAT --to-source 192.168.1.1
# 拆解:POSTROUTING=路由后链,SNAT=源地址转换,--to-source=本机内网IP,把内网响应包的源IP改成本机内网IP,确保能正常回传外部

4. 规则保存与恢复

默认情况下,iptables规则仅存于内存,重启服务器后会丢失,需手动保存到配置文件:

# 保存规则到默认配置文件(/etc/sysconfig/iptables)
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables

# 恢复规则(从配置文件加载)
iptables-restore < /etc/sysconfig/iptables
# 重启iptables也会自动加载配置文件
systemctl restart iptables

iptables的核心配置与常用命令汇总

1. 常用命令速查

# 查看规则
iptables -L -n --line-numbers # 带序号、数字格式查看(推荐)
iptables -t nat -L -n # 查看nat表规则

# 规则管理
iptables -A 链名 匹配条件 -j 动作 # 添加规则(末尾)
iptables -I 链名 序号 匹配条件 -j 动作 # 插入规则(指定位置,序号默认1)
iptables -D 链名 序号/规则内容 # 删除规则
iptables -R 链名 序号 匹配条件 -j 动作 # 替换规则
iptables -F 链名 # 清空规则

# 服务管理
systemctl start/stop/restart iptables # 启停重启
systemctl enable/disable iptables # 开机自启/禁用
service iptables save # 保存规则

2. 生产环境常用规则模板

# 1. 清空现有规则
iptables -F
iptables -t nat -F

# 2. 核心规则配置(按“允许必要规则→拒绝其余”顺序)
iptables -A INPUT -i lo -j ACCEPT # 允许本地回环访问
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许已建立连接
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT # 仅允许内网SSH登录
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTP端口
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许HTTPS端口
iptables -A INPUT -p icmp --icmp-type 8 -j DROP # 禁止ping
iptables -A INPUT -j REJECT # 默认拒绝所有未匹配入站数据包

# 3. 保存规则
service iptables save

# 验证:查看配置好的规则
iptables -L -n --line-numbers

注意事项

  • 配置规则时,先允许SSH端口(22)和已建立连接的数据包,再设置默认拒绝,避免误操作导致自己断连服务器。
  • 规则执行顺序为“从上到下”,匹配到第一条规则后即停止执行,需合理安排规则顺序(精确规则放前面)。
  • CentOS 7 若同时安装firewalld和iptables,两者会冲突,需确保仅启用一种防火墙。
  • nat表端口映射需开启内核IP转发,否则映射无效。
  • 生产环境修改规则前,先备份现有规则(iptables-save > iptables_backup),避免配置错误无法恢复。

先写这么多,后面有时间再多写点干货🤭。