一、 什么是 iptables
二、 iptables 的组成有哪些以及作用
1.Chain(链)
链(Chain) | 功能描述 |
---|---|
INPUT | 匹配进入本机,并且目标 IP 是本机地址的数据包 |
FORWARD | 匹配由本机进行转发的数据包 |
OUTPUT | 匹配由本机发出的数据包 |
PREROUTING | 匹配刚到达本机的所有数据包,可用于修改目的地址,通常用于实现 DNAT 功能 |
POSTROUTING | 匹配即将离开本机的数据包,可用于修改源地址,通常用于实现 SNAT 功能 |
2. Rule(规则)
3. Table(表)
表名 | 备注说明 |
---|---|
filter | 过滤规则表,根据预定义规则过滤符合条件数据包,为 iptables 默认表 |
nat | 全称 Network Address Translation,用于实现网络地址转换(如 SNAT、DNAT ) |
mangle | 修改数据标记位规则表,可修改数据报文的标记、头部等信息 |
raw | 关闭连接跟踪机制,加快数据包穿越防火墙速度,常用于高性能场景 |
security | 用于强制访问控制(MAC )网络规则,依托 Linux 安全模块(如 SELinux ),实际较少使用 |
表名 | 可支持的链 |
---|---|
raw | PREROUTING,OUTPUT |
mangle | PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD |
nat | PREROUTING,POSTROUTING,INPUT,OUTPUT |
filter | INPUT,FORWARD,OUTPUT |

三、iptables 的使用方法
1. 显示规则
要查看当前的 iptables 规则,可以使用命令:iptables -L
这将显示所有规则,包括输入、输出和转发规则。通过观察规则列表,您可以了解当前网络流量的策略。其中iptables -vnL是查看iptables 规则的常用命令。后面加上--line-number 会显示数字对应的规则。
- -v:verbose(详细模式),显示更详细的规则信息,包括数据包计数器(匹配的数据包数量、字节数)、规则选项的完整参数等。
-n
:numeric(数字模式),直接显示 IP 地址和端口号的数字形式,不进行 DNS 反向解析或服务名转换(如显示80
而非http
,显示192.168.1.1
而非主机名),加快命令执行速度。-L
:list(列表模式),列出指定链(或所有链)的规则。若不指定链名,默认显示当前表中所有链的规则(默认表为filter
表)。
输出字段说明:
pkts
:该规则匹配到的数据包数量。bytes
:匹配到的数据包总字节数。target
:规则匹配后执行的动作(如ACCEPT
、DROP
)。prot
:匹配的协议(如tcp
、udp
、all
)。opt
:可选的匹配选项。in
/out
:匹配的入站 / 出站网络接口(*
表示所有接口)。source
/destination
:匹配的源 / 目的 IP 地址(0.0.0.0/0
表示所有地址)
2. 添加规则和永久保存
要添加一个规则,可以使用命令:iptables -A <chain> <rule>
其中,<chain>指定要添加规则的链,例如 INPUT 、OUTPUT 或 FORWARD。<rule>
是规则本身,可以是允许或拒绝特定类型的流量。
例如,如果您想允许 SSH 连接 (TCP 端口 22),可以使用以下命令:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
这表示在 INPUT 链中添加一个规则,允许 TCP 端口 22 的流量通过。
上面命令行的方式是临时生效的,如果想要永久生效需要在配置文件里面进行添加
CentOS/RHEL 6/7 系统:
# 保存规则到 /etc/sysconfig/iptables 文件 service iptables save
Debian/Ubuntu 系统(需安装
iptables-persistent
)# 安装工具 apt-get install iptables-persistent # 保存规则(会写入 /etc/iptables/rules.v4 和 rules.v6) netfilter-persistent save
通用方法(手动导出到文件,重启时恢复):
# 导出规则到文件 iptables-save > /etc/iptables.rules # 编辑开机启动脚本(如 /etc/rc.local),添加恢复命令 iptables-restore < /etc/iptables.rules
3. 删除规则
要删除一个规则,可以使用以下命令:
iptables -D <chain> <rule>
其中,<chain>
和<rule>
是要删除的规则的链和规则本身。例如,如果您要删除前面添加的 SSH 规则,可以使用以下命令:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
这将删除输入链中允许 TCP 端口 22 的流量通过的规则。
4. 修改规则
要修改一个规则,可以先删除旧规则,再添加新规则,或者使用以下命令修改规则:
iptables -R <chain> <rule_number> <new_rule>
其中,<chain>
是要修改的规则的链,<rule_number>
是要修改的规则的编号(可以在 iptables -L 命令的输出中找到),<new_rule>
是要添加的新规则。
例如,如果您要将输入链中允许 SSH 连接的规则更改为允许 HTTP 连接 (TCP 端口 80),可以使用右边的命令:iptables -R INPUT 1 -p tcp --dport 80 -j ACCEPT
这将输入链中编号为 1 的规则更改为允许 TCP 端口 80 的流量通过。
iptables 是一个功能非常强大的工具,以上只是几个最简单的使用示例,还有很多高级选项和用法。限于文章篇幅,此处不做介绍,感兴趣的读者可自行查阅相关文档资料。
5. 命令规则
6. 顺序规则
例如在10.0.0.0网段的主机系统中添加下面的规则,得到的结果不能够连接10.0.0.13主机。
iptables -t filter -A INPUT -s 10.0.0.12 -j DROP # 丢弃10.0.0.12数据包
iptables -t filter -A INPUT -s 10.0.0.0/24 -j REJECT # 拒绝10.0.0.0网段访问
iptables -t filter -A INPUT -s 10.0.0.1 -j ACCEPT <