
在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
动作
状态
常见命令
#查看规则 - "-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