iptables

核心概念

内核态的Netfilter用户态的iptables两部分组成
Netfilter:工作在Linux内核空间,是防火墙的“核心引擎”。能对TCP/IP数据包进行过滤、地址转换等操作。
iptables:工作在用户空间,是我们直接操作的“管理工具”。位于/sbin/iptables目录下,能帮我们轻松添加、修改、删除防火墙规则。

iptables是包过滤防火墙,主要工作在网络层,针对IP数据包的地址、端口等信息做处理。

四表五链

iptables使用“表”和“链”的结构来组织规则,就像“文件夹”和“文件”的关系——表里有链,链里有规则。

四表:按规则用途分类

表名核心作用包含的链适用场景
raw决定是否对数据包做状态跟踪OUTPUT、PREROUTING很少用,主要用于特殊场景(如避免跟踪某些数据包)
mangle修改数据包内容(如打标记)、流量整形INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING较少用,一般用于复杂的流量管理
nat网络地址转换(修改源/目标IP/端口)OUTPUT、PREROUTING、POSTROUTING常用!比如内网主机通过公网IP上网(SNAT)、外网访问内网服务器(DNAT)
filter过滤数据包(决定是否放行)INPUT、FORWARD、OUTPUT最常用!日常的“允许/拒绝某个端口访问”都在这里配置
重点掌握filter表(过滤)和nat表(地址转换)

五链:按数据包处理时机分类

链名处理时机适用场景
INPUT处理入站数据包(目标IP是本机)控制外部主机访问本机服务(如禁止ping本机)
OUTPUT处理出站数据包(从本机发往外部)一般不建议在这里配置规则,避免影响本机对外访问
FORWARD处理转发数据包(流经本机但目标不是本机)当Linux作为网关时,控制是否转发内网数据包
PREROUTING路由选择前处理数据包修改目标地址(DNAT),比如把外网访问的80端口映射到内网服务器
POSTROUTING路由选择后处理数据包修改源地址(SNAT),比如内网主机通过公网IP上网

数据包的匹配流程:规则生效的顺序

表的应用顺序

数据包会按这个顺序经过不同的表:raw → mangle → nat → filter(filter表最后生效,因为过滤是最终决策)。

链的匹配顺序

不同类型的数据包(入站、出站、转发)会走不同的链路径:

  • 主机型防火墙(数据包直接到本机)

    • 入站:PREROUTING → INPUT → 本机应用(如浏览器、Apache)
    • 出站:本机应用 → OUTPUT → POSTROUTING
  • 网络型防火墙(数据包需要转发)

    • 转发:PREROUTING → FORWARD → POSTROUTING
链内规则的匹配顺序

链内的规则是从上到下依次检查,遵循“匹配即停止”原则(除了LOG规则,它只记录日志,不中断匹配)。如果找不到匹配的规则,就按链的“默认策略”处理(默认是允许,即policy ACCEPT)。

安装启动配置iptables 防火墙

通过 yum 包管理器安装 iptables 核心组件及服务管理工具

yum -y install iptables iptables-services #安装 iptables
systemctl start iptables.service #启动 iptables 服务
systemctl enable iptables.service #配置 iptables 开机自启

语法与数据包控制类型

基本语法

iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

iptables -t filter -A INPUT -p icmp -j REJECT #通过拒绝 ICMP 协议实现禁止 ping

各参数含义说明:

  • 表名:iptables 内置 3 张核心表(未指定时默认使用 filter 表):

    • filter:用于过滤数据包(默认表,主要控制数据包的“允许/拒绝”)。
    • nat:用于网络地址转换(如 SNAT、DNAT,实现内网访问外网、端口映射等)。
    • mangle:用于修改数据包标记(如 TOS、TTL,较少用于常规场景)。
  • 管理选项:表示对规则的操作(如添加、删除、查看等,下文详细说明)。
  • 链名:表内预设的规则链(如 INPUT、OUTPUT、FORWARD,对应数据包的不同流向)。
  • 匹配条件:指定需处理的数据包特征(如协议、端口、IP 地址等,不指定则匹配所有数据包)。
  • 控制类型:数据包匹配后的处理动作(如允许、丢弃、拒绝等,需大写)。

语法注意事项

  1. 未指定表名时,默认操作 filter 表;未指定链名时,默认操作表内所有链。
  2. 除非设置链的“默认策略”,否则必须指定“匹配条件”(否则规则无意义)。
  3. 管理选项、链名、控制类型需使用大写字母(如 -A、INPUT、ACCEPT),其余参数为小写。

数据包常见控制类型

控制类型决定了数据包匹配后的处理方式,常用类型如下(需全部大写)

控制类型英文含义功能说明
ACCEPT允许允许数据包通过,继续向下传递。
DROP丢弃直接丢弃数据包,不向发送端返回任何响应(如 ping 时显示“请求超时”)。
REJECT拒绝拒绝数据包通过,并向发送端返回“拒绝响应”(如 ping 时显示“目标不可达”)。
LOG日志在 /var/log/messages 文件中记录数据包日志,不影响数据包后续处理(需配合其他控制类型使用)。
SNAT源地址转换修改数据包的源 IP(如内网主机通过网关的公网 IP 访问外网)。
DNAT目的地址转换修改数据包的目的 IP(如将公网 IP 的某个端口映射到内网主机)。
MASQUERADE地址伪装类似 SNAT,但适用于公网 IP 不固定的场景(如 ADSL 拨号网络)。
注:LOG 是“辅助动作”,不会终止数据包的匹配流程(即“匹配即停止”规则对 LOG 不生效),数据包会继续匹配下一条规则。

iptables 规则管理:添加、查看、删除与默认策略

常用管理选项速查表

管理选项功能描述用法示例
-A在指定链的末尾追加一条规则iptables -A INPUT -p tcp --dport 80 -j ACCEPT(允许 80 端口 TCP 访问)
-I在指定链的指定位置插入一条规则(默认插在第 1 位)iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT(在 INPUT 链第 2 位插入 22 端口规则)
-P设置链的默认策略(仅支持 ACCEPT/DROP)iptables -P INPUT DROP(INPUT 链默认丢弃所有数据包)
-D删除指定链中的一条规则(支持“按序号”或“按内容”删除)iptables -D INPUT 5(删除 INPUT 链第 5 条规则)
-R修改指定链中的一条规则(按序号替换)iptables -R INPUT 3 -p udp --dport 53 -j ACCEPT(替换 INPUT 链第 3 条规则为允许 53 端口 UDP)
-L查看指定链或表的规则列表iptables -L INPUT(查看 INPUT 链规则)
-n以数字形式显示地址和端口(避免 DNS 解析,加快查询速度)iptables -nL INPUT(数字形式查看 INPUT 链规则)
-v查看规则时显示详细信息(如匹配的数据包数量、字节数)iptables -vnL INPUT(详细查看 INPUT 链规则)
--line-number查看规则时显示规则序号(便于按序号删除/修改规则)iptables -L INPUT --line-numbers(显示 INPUT 链规则序号)
-F清空指定链或表的所有规则(不影响默认策略)iptables -F INPUT(清空 INPUT 链所有规则)
-X清空自定义链的规则(不影响系统预设链)iptables -X(清空所有自定义链)
-Z重置链的计数器(清零匹配的数据包数量、字节数)iptables -Z INPUT(重置 INPUT 链计数器)
-S查看链的规则(以“命令行格式”显示,便于复制复用)iptables -t nat -S POSTROUTING(查看 nat 表 POSTROUTING 链规则)

规则列表字段解读

使用 iptables -L 或 iptables -vnL 查看规则时,输出结果包含多个字段

字段名含义说明
pkts该规则匹配到的数据包总数量
bytes该规则匹配到的数据包总字节数
target规则匹配后的处理动作(即“控制类型”,如 ACCEPT、DROP)
prot规则适用的网络协议(如 tcp、udp、icmp)
opt规则的扩展选项(如 state 表示连接状态)
in数据包流入的网卡(如 eth0,any 表示所有网卡)
out数据包流出的网卡(如 eth0,any 表示所有网卡)
source数据包的源 IP 或网段(如 192.168.1.0/24 表示内网网段)
destination数据包的目的 IP 或网段(如 10.0.0.1 表示目标主机)

image-20250904162235920
image-20250904162235920

添加新规则

添加规则使用 -A(追加到末尾)或 -I(插入到指定位置),需结合“匹配条件”(如协议、端口、IP)和“控制类型”

  • 示例 1:禁止所有主机 ping 本主机
# 在 filter 表 INPUT 链末尾添加规则,拒绝 ICMP 协议数据包
iptables -t filter -A INPUT -p icmp -j REJECT
如果使用-A且规则已经允许了icmp通行则不生效,因为匹配到accept就不会匹配后面的reject,使用-I则可以,因为会插入到第一条。
  • 示例 2:允许 22 端口(SSH)访问
# 在 INPUT 链第 2 位插入规则,允许 TCP 协议 22 端口访问
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT
  • 示例 3:允许所有 TCP/UDP 协议访问(不推荐生产环境)
# 允许所有 TCP 协议数据包进入
iptables -t filter -A INPUT -p tcp -j ACCEPT
# 允许所有 UDP 协议数据包进入
iptables -I INPUT -p udp -j ACCEPT

查看规则列表

查看规则是验证配置是否正确的关键步骤,结合 -n(数字显示)、-v(详细信息(pkts/bytes))、--line-number(规则序号)可提升查看效率

  • 用法一:查看指定链规则并显示序号
# 查看 filter 表 INPUT 链规则,显示规则序号
iptables -L INPUT --line-numbers

image-20250904164441854
image-20250904164441854

  • 用法 2:数字形式查看详细规则
# 数字形式(IP/端口不解析)、详细信息(pkts/bytes)查看 INPUT 链规则
iptables -vnL INPUT

image-20250904164724083
image-20250904164724083

删除与清空规则

当规则配置错误或需更新时,需删除或清空规则,操作需谨慎(尤其是远程服务器,避免误删 SSH 端口规则导致无法连接)

删除单条规则

支持两种删除方式:按规则序号(推荐,更精准)和按规则内容

  • 序号删除:先通过 iptables -L INPUT --line-numbers 查看序号,再删除
# 删除 INPUT 链第 2 条规则
iptables -D INPUT 2
  • 内容删除:需完整匹配规则的“表名、链名、匹配条件、控制类型”
# 删除 filter 表 INPUT 链中“拒绝 ICMP 协议”的规则
iptables -t filter -D INPUT -p icmp -j REJECT
清空所有规则

使用 -F 清空指定表或链的规则,需注意:-F 仅清空规则,不影响默认策略(如 INPUT 链默认 DROP 仍会生效)。

  • 清空指定链规则
# 清空 INPUT 链所有规则
iptables -F INPUT
  • 清空指定表所有规则
# 清空 filter 表所有链规则(默认表)
iptables -F
# 清空 nat 表所有链规则
iptables -t nat -F
# 清空 mangle 表所有链规则    
iptables -t mangle -F
清空规则注意事项
  1. 若规则存在多条相同内容,按内容删除仅删除序号最小的一条。
  2. 按序号删除时,需确保序号不超过当前链的规则总数,否则报错。
  3. 若 INPUT 链默认策略为 DROP,清空规则前需确保已保留 SSH 端口(22)规则,否则会导致远程连接断开(无物理机权限时无法恢复)。

设置默认策略

默认策略是链的“最后一道防线”:当数据包未匹配任何规则时,将执行默认策略。生产环境中推荐将默认策略设为 DROP(白名单模式,仅允许指定规则的数据包通过)

基本语法

iptables [-t 表名] -P <链名> <控制类型>  # 控制类型仅支持 ACCEPT 或 DROP

常见示例

# 设置 INPUT 链默认策略为 DROP(拒绝所有未匹配规则的入站数据包)
iptables -P INPUT DROP

# 设置 FORWARD 链默认策略为 DROP(防火墙默认不转发数据包)
iptables -t filter -P FORWARD DROP

# 设置 OUTPUT 链默认策略为 ACCEPT(允许所有出站数据包,便于服务器主动访问外部)
iptables -P OUTPUT ACCEPT

默认策略注意事项

  1. 默认策略一旦设置立即生效,无需重启 iptables 服务。
  2. filter 表的 INPUT、OUTPUT、FORWARD 链默认策略初始为 ACCEPT,nat 表和 mangle 表默认策略为 ACCEPT。
  3. 修改默认策略后,需及时添加“允许必要服务”的规则(如 SSH、HTTP、DNS 等),避免影响业务正常运行。

推荐文章

云服务器python环境

上周偶然看到一个自动签到的python脚本,用于CTF...

find命令小记

find命令小记1. 按文件名查找查找当前目录及其子目...

评论区(3条评论)

我要评论

昵称
邮箱
网址
0/200
取消
24-хи4ао-web LV1

膜拜老学长

四川
Android
Chrome
ikn0w1T 博主
回复 @ 24-хи4ао-web :

不用膜拜哈哈,学长很普通,一起加油,看好你们新一代。

广东
Windows
Edge
zeph LV1

继续学习

广东
Android
Chrome
可按 ESC 键退出搜索

0 篇文章已搜寻到~