iptables

在OSI中的位置

网络层(Layer 3)

匹配:IP 地址、子网、协议号(TCP/UDP/ICMP)

模块:filter、nat、mangle 都基于 IP 报文

传输层(Layer 4)

匹配:TCP/UDP 端口号

模块:--dport、--sport、--syn 等

数据链路层(Layer 2)

可匹配:MAC 地址

模块:-m mac --mac-source

应用层(Layer 7)

能有限识别应用层特征(如 HTTP 头部)

但不是完整深度包检测(DPI),也不做协议解析

IPv4/IPv6

iptables 默认只管理 IPv4 流量。

ip6tables专门处理 IPv6 流量的工具。两者互不影响。

四表

raw 表:“关闭跟踪”,最优先

  • 核心作用:控制是否对数据包做 连接跟踪(conntrack),是优先级最高的表(先于其他所有表处理)。

    👉 通俗理解:Linux 内核默认会跟踪每个连接的状态(比如是否是已建立的连接),raw 表可以 “豁免” 某些数据包,不让内核跟踪,提升性能。

  • 典型场景:DNS 请求、高并发短连接(减少内核开销)。

对所有出站的 DNS 数据包(53端口)关闭连接跟踪

iptables -t raw -A OUTPUT -p udp --dport 53 -j NOTRACK

mangle 表:“修改数据包”,精细调整

  • 核心作用:修改数据包的头部信息(比如 TOS 字段、TTL 值、添加标记),不做过滤 / 转发,只做 “加工”。

    👉 通俗理解:像给包裹贴标签、改快递单上的备注,不改变包裹的收发地址,只调整附属信息。

  • 典型场景:网络限速、QoS(服务质量)、修改数据包的生存时间(TTL)。

把所有出站数据包的 TTL 值改成 128(防止被运营商限速)

iptables -t mangle -A OUTPUT -j TTL --ttl-set 128

nat 表:“地址转换”,改收发地址

  • 核心作用:修改数据包的 IP 地址 / 端口(网络地址转换),分三种场景:

    • SNAT:源地址转换(比如内网机器访问外网,把内网 IP 换成公网 IP);

    • DNAT:目的地址转换(比如公网访问内网服务器,把公网 IP 映射到内网 IP);

    • MASQUERADE:动态 SNAT(适用于公网 IP 不固定的场景,比如拨号上网)。

      👉 通俗理解:像快递中转站,把包裹的寄件人 / 收件人地址改成中转站的地址,让内网和外网能互通。

典型场景:路由器共享上网、内网服务端口映射到公网。

# SNAT:内网 192.168.1.0/24 访问外网时,源 IP 换成服务器的公网网卡(eth0)IP

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# DNAT:公网访问 80 端口时,转发到内网 192.168.1.100 的 80 端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80

filter 表:“过滤数据包”,最常用

  • 核心作用:对数据包进行 “允许 / 拒绝 / 丢弃” 操作,是 iptables 最核心、最常用的表(默认不指定表时,就是操作 filter 表)。

    👉 通俗理解:像小区保安,检查每个进出的包裹(数据包),符合规则就放行,不符合就拦下。

  • 典型场景:开放 / 关闭端口、禁止某个 IP 访问、允许内网访问外网等。

# 允许所有入站的 SSH 连接(22端口)

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 拒绝来自 192.168.1.200 的所有入站流量

iptables -A INPUT -s 192.168.1.200 -j DROP

五链

PREROUTING(路由前链)

  • 核心作用:数据包进入服务器后,先经过此链,此时还没做 “目标地址路由决策”(判断数据包是给本机的,还是要转发的)。

    👉 通俗理解:快递刚到小区门口,还没分配到具体楼栋,先过第一道安检。

  • 典型场景:DNAT(端口映射)、修改数据包目的地址 / 端口(因为要先改地址,再做路由决策)。

# 把访问本机 8080 端口的流量,提前转到 80 端口(PREROUTING 阶段改)

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination :80

INPUT(入站链)

  • 核心作用:数据包经过路由决策后,确定是发给本机进程(比如 SSH、Nginx),才会进入此链。

    👉 通俗理解:快递确定是给你的,到了你家门口,保安最后检查。

  • 典型场景:管控本机的入站流量(开放 / 关闭端口、禁止特定 IP 访问本机)。

# 允许本机接收 SSH 连接(22端口)

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 拒绝 192.168.1.200 访问本机所有端口

iptables -A INPUT -s 192.168.1.200 -j DROP

FORWARD(转发链)

  • 核心作用:数据包经过路由决策后,确定不是给本机,而是要转发到其他服务器(比如本机是路由器 / 网关),才会进入此链。

    👉 通俗理解:快递不是给你的,是小区里其他住户的,中转时的安检。

  • 典型场景:路由器 / 网关的转发规则(允许 / 禁止内网机器通过本机访问外网)。

# 允许转发内网 192.168.1.0/24 到外网的所有流量

iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

OUTPUT(出站链)

  • 核心作用:本机进程主动发出的数据包(比如本机 ping 外网、访问百度),会先经过此链。

    👉 通俗理解:你要寄快递,先过小区门口保安检查,再发出去。

  • 典型场景:管控本机的出站流量(禁止本机访问某个外网 IP / 端口)。

# 禁止本机访问外网 80 端口(禁止浏览网页)

iptables -A OUTPUT -p tcp --dport 80 -j DROP

POSTROUTING(路由后链)

  • 核心作用:数据包即将离开本机(无论是转发的、还是本机出站的),最后经过此链。

    👉 通俗理解:快递已经通过所有安检,最后贴个快递单(改源地址),准备发往外网。

  • 典型场景:SNAT/MASQUERADE(内网机器通过本机上网,改源 IP 为本机公网 IP)。

# 内网 192.168.1.0/24 访问外网时,把源 IP 换成本机 eth0 网卡的 IP

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

动作

动作

作用

NOTRACK

关闭数据包的连接跟踪(仅 raw 表生效)

TTL

修改数据包的 TTL 值(仅 mangle 表生效)

QUEUE

把数据包交给用户空间程序处理(如自定义防火墙程序)

ULOG

把数据包日志记录到用户空间日志(替代 LOG 动作,更灵活)

动作

核心作用

所属表 / 链

典型场景

ACCEPT

放行数据包

filter 表(所有链)

开放端口、允许可信 IP

DROP

静默丢弃数据包

filter 表(所有链)

屏蔽恶意 IP、危险端口

REJECT

拒绝并返回错误响应

filter 表(所有链)

明确拒绝访问请求

SNAT/MASQ

源地址转换(动态 / 静态)

nat 表(POSTROUTING)

内网共享上网

DNAT

目的地址转换

nat 表(PREROUTING)

端口映射

LOG

记录数据包日志

所有表(所有链)

流量审计、攻击排查

REDIRECT

本机端口重定向

nat 表(PREROUTING/OUTPUT)

本机端口转发

状态

状态类型

通俗解释

适用协议

典型场景

NEW

新连接的第一个数据包(比如客户端发起的 SYN 包,本机首次向外发起的请求)

TCP/UDP/ICMP

允许外部主动访问特定端口(如 SSH)

ESTABLISHED

已建立的连接(三次握手完成,或 UDP/ICMP 有往返流量)

TCP/UDP/ICMP

放行已建立连接的返程流量

RELATED

与已建立连接 “相关” 的新连接(比如 FTP 被动模式的数据连接、ICMP 错误响应)

所有协议

放行附属流量(如 FTP 数据通道)

INVALID

无效连接(数据包无匹配的连接记录、校验错误、超时等)

所有协议

丢弃恶意 / 异常流量

UNTRACKED

未被 conntrack 跟踪的数据包(raw 表中标记为 NOTRACK 的流量)

所有协议

高并发短连接(如 DNS)

常见命令

#查看规则 - "-n"不显示域名,提高效率 "-t"指定表 默认filter表
iptables -L -n

#限制访出 - "-A"插入至表尾 [Chain OUTPUT (policy ACCEPT)]
iptables -A OUTPUT -j DROP
#允许访出 - 插入至表头
iptables -I OUTPUT -d 192.168.80.1 -j ACCEPT
iptables -I OUTPUT -d 192.168.80.1 -p tcp --dport 8785 -j ACCEPT

#限制访入 - "-P"默认策略 [Chain INPUT (policy DROP)]
iptables -P INPUT DROP
#允许访入 - "-p"协议tcp/udp/icmp "--dport"端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#允许访入 - 插入至表头
iptables -I INPUT -s 172.21.32.8 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -s 172.21.32.8 -j ACCEPT

#删除规则
iptables -D OUTPUT -d 192.168.80.1 -j ACCEPT

#网络是双向的 "-s":源地址
同时允许访入和访出才能正常通信
#出
iptables -I OUTPUT -p tcp -d 39.156.66.10 -j ACCEPT
#入
iptables -I INPUT -s 39.156.66.10 -j ACCEPT

#丢弃所有新的访出请求(包括自身新发起的出访请求,但不包括访入时的回包),结果是主动访出不通,外界访问可以回包。
iptables -A OUTPUT -p all -s 0.0.0.0/0 -d 0.0.0.0/0 -m state --state NEW -j DROP

#规则备份
iptables-save > /etc/sysconfig/iptables.save.$(date +%Y%m%d%H%M%S)

#规则保存
iptables-save > /etc/sysconfig/iptables.save

#规则恢复(crontab @reboot)
/usr/sbin/iptables-restore < /etc/sysconfig/iptables.save

# 日志记录
#记录丢弃包
#将INPUT链中所有数据包写入日志,并在日志前缀中添加"iptables-dropped: "
iptables -A INPUT -j LOG --log-prefix "iptables-dropped: "
#tail -f /var/log/messages | grep "iptables-dropped"


#日志解析
Jul 16 17:55:57 wuxk kernel: iptables-dropped: IN=ens32 OUT= MAC=00:0c:29:c5:c8:b9:00:50:56:c0:00:08:08:00 SRC=192.168.72.1 DST=192.168.72.129 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=19890 DF PROTO=TCP SPT=53447 DPT=22 WINDOW=4105 RES=0x00 ACK URGP=0
 
#接口信息:
IN=ens32 表示这个数据包进入的接口是ens32。这通常是一个网络接口的名称,比如以太网接口。

#IP地址信息:
SRC=192.168.72.1 表示数据包的源IP地址是192.168.72.1。
DST=192.168.72.129 表示数据包的目的IP地址是192.168.72.129。

#数据包长度和类型:
LEN=40 表示数据包的总长度是40字节(不包括帧头)。
TOS=0x00 PREC=0x00 分别表示服务类型(Type of Service)和优先级(Precedence),这里都是0,表示没有特别的服务类型或优先级要求。
TTL=128 表示生存时间(Time To Live),数据包在网络中可以经过的最大路由器数。对于IPv4,TTL的初始值通常是64或128,每次经过一个路由器时减1。
ID=19890 是数据包的标识,用于分片的数据包重组。
DF 标志(Don't Fragment)表示这个数据包不应该被分片。

#协议信息:
PROTO=TCP 表示数据包使用的协议是TCP(传输控制协议)。

#TCP标志和窗口大小:
WINDOW=4105 表示TCP接收窗口大小是4105字节,这是接收方告诉发送方它可以接收多少数据而不必等待确认。
RES=0x00 是保留字段,这里为0。
ACK PSH URGP=0 ACK PSH URGP=0表示TCP数据包的头部中,ACK标志位被设置为1(确认号有效),PSH标志位也被设置为1(推送标志),而紧急指针字段URGP为0(没有紧急数据需要处理)。
当PSH被设置为1时,表示发送方希望接收端尽快将数据交给应用层处理,而不是等到缓冲区满或者延迟定时器到期时再交付数据。这对于实时数据或者需要低延迟的应用非常重要。


# 限制访入的前提下 允许对方回复
# 允许已建立连接的流量
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许新建的HTTP、HTTPS连接
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT

# 允许ICMP echo-reply(允许ping响应)
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT


# 查看行号
iptables -L --line-numbers

# 删除第1行策略
iptables -D INPUT 1

防火墙 2026-03-10
安装系统时,无法识别磁盘阵列卡 2026-01-22

评论区