iptables 核心概念
iptables 是 Linux 系统上配置内核防火墙规则的用户空间工具,它通过和内核中的 netfilter 框架协同工作来实现数据包的过滤、网络地址转换(NAT)和其他数据包修改功能。
网络中的防火墙,是一种将内部网络和外部网络分开的方法,是一种隔离技术。防火墙在内网与外网通信时进行访问控制,依据所设置的规则对数据包作出判断,最大限度地阻止网络中的黑客破坏企业网络,从而加强企业网络安全。
其核心架构基于 表(Tables)、链(Chains) 和 规则(Rules)
表
用于实现特定功能。
- filter:默认表,用于数据包过滤,决定是否允许数据包通过。
- nat:用于网络地址转换(如端口转发、IP伪装)。
- mangle:用于对数据包进行高级修改(如修改 TTL、TOS)。
- raw:用于决定是否对数据包进行连接跟踪。
链
附着在表上,是规则的集合,对应数据包传输路径的不同处理点。
- INPUT:处理发往本机的数据包。
- OUTPUT:处理本机发出的数据包。
- FORWARD:处理经过本机转发的数据包。
- PREROUTING:数据包进入后、路由判断前进行处理(常用于 DNAT)。
- POSTROUTING:数据包发出前、路由判断后进行处理(常用于 SNAT)。
规则
由匹配条件和目标动作组成。数据包按顺序匹配规则,一旦匹配成功则执行相应动作,并不再继续向后匹配。常见动作有:
ACCEPT:允许数据包通过。DROP:丢弃数据包,不响应。REJECT:拒绝数据包,并向发送方返回错误信息。LOG:将数据包信息记录到系统日志,然后继续匹配后续规则。SNAT/DNAT:源/目标地址转换。
数据包处理流程
数据包在链中的处理流程,以及表与链的关系,可以参考下图:
mermaid
flowchart TD
PacketIn[数据包进入] --> PreRouting[PREROUTING 链<br>raw, mangle, nat 表]
PreRouting --> RoutingDecision1{路由判断}
RoutingDecision1 -->|发往本机| InputChain[INPUT 链<br>mangle, filter 表]
InputChain --> LocalProcess[本地进程]
LocalProcess --> OutputChain[OUTPUT 链<br>raw, mangle, nat, filter 表]
OutputChain --> PostRouting[POSTROUTING 链<br>mangle, nat 表]
RoutingDecision1 -->|需要转发| ForwardChain[FORWARD 链<br>mangle, filter 表]
ForwardChain --> RoutingDecision2{路由判断}
RoutingDecision2 --> PostRouting
PostRouting --> PacketOut[数据包离开]规则表之间的顺序: raw→mangle→nat→filter
规则链之间的顺序:
入站:PREROUTING→INPUT
出站:OUTPUT→POSTROUTING
转发:PREROUTING→FORWARD→POSTROUTING
常用命令与规则管理
掌握以下命令可以帮助你有效管理 iptables 规则。
语法结构
bash
iptables [-t 表名] 命令 [链名] [匹配条件] [-j 目标动作]常见控制类型
| 控制类型 | 作用 |
|---|---|
| ACCEPT | 允许数据包通过 |
| DROP | 直接丢弃数据包,不给出任何回应消息 |
| REJECT | 拒绝数据包通过,会给数据发送端一个响应信息 |
| SNAT | 修改数据包的源地址 |
| DNAT | 修改数据包的目的地址 |
注意事项
- 不指定表名时,默认指 filter 表
- 不指定链名时,默认指表内的所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 选项、链名、控制类型使用大写字母,其余均为小写
常用选项
| 选项 | 描述 | 示例 |
|---|---|---|
-t table | 指定要操作的表(如 filter, nat, mangle, raw),默认为 filter表 | iptables -t nat -L |
-A chain | 追加规则到指定链的末尾 | iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
-D chain [rulenum] | 删除指定链中的规则(可按规则编号或完整规则删除) | iptables -D INPUT 1(删除第1条规则) |
-I chain [rulenum] | 插入规则到指定链的指定位置(默认为链首) | iptables -I INPUT 2 -s 192.168.1.0/24 -j ACCEPT |
-L [chain] | 列出指定链或所有链的规则 | iptables -L -v -n(详细数字格式显示) |
-F [chain] | 清空指定链或所有链的规则 | iptables -F INPUT |
-P chain target | 设置链的默认策略(如 ACCEPT, DROP, REJECT) | iptables -P INPUT DROP |
-s address[/mask] | 匹配源 IP 地址或网段 | iptables -A INPUT -s 192.168.1.10 -j DROP |
-d address[/mask] | 匹配目标 IP 地址或网段 | iptables -A OUTPUT -d 10.0.0.0/8 -j REJECT |
-p protocol | 匹配协议类型(如 tcp, udp, icmp, all) | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
--dport port | 匹配目标端口(需结合 -p tcp或 -p udp) | iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
--sport port | 匹配源端口(需结合 -p tcp或 -p udp) | iptables -A OUTPUT -p udp --sport 53 -j ACCEPT |
-i interface | 匹配输入网络接口(如 eth0, lo) | iptables -A INPUT -i eth0 -j ACCEPT |
-o interface | 匹配输出网络接口 | iptables -A OUTPUT -o wlan0 -j DROP |
-j target | 指定规则匹配后的动作(如 ACCEPT, DROP, REJECT, LOG, DNAT, SNAT) | iptables -A FORWARD -j DROP |
-m module | 使用扩展模块(如 state, conntrack, multiport, limit) | iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
查看规则
bash
iptables -L [-t 表名] [-v] [-n] # 列出规则,-v 更详细,-n 不解析域名
iptables -L -n --line-numbers # 查看规则并显示编号规则配置
bash
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 追加规则到链末尾
iptables -I INPUT 1 -s 192.168.1.100 -j ACCEPT # 在链的指定位置插入规则
iptables -D INPUT 3 # 删除指定链中的第3条规则
iptables -F INPUT # 清空指定链的所有规则
iptables -P INPUT DROP # 设置链的默认策略(谨慎操作!)保存与恢复规则
bash
iptables-save > /path/to/iptables.rules # 保存当前规则到文件
iptables-restore < /path/to/iptables.rules # 从文件恢复规则
# 在 CentOS/RHEL 等系统可能使用:
service iptables save
# 在 Debian/Ubuntu 等系统可能需要安装 iptables-persistent隐含匹配
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类 型等条件。 端口匹配: --sport 源端口、–dport 目的端口,可以是个别端口、端口范围--sport和--dport 必须配合-p <协议类型>使用端口可以使用的范围 0-65535
bash
# 允许udp 53端扣访问192.168.4.0/24网段
iptables -A FORWARD -d 192.168.4.0/24 -p udp --sport 53 -j ACCEPT
# 允许20到23端口可以被访问
iptables -A INPUT -p tcp --dport 20:23 -j ACCEPT
# 检查到有SYN的数据包,就丢弃
iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
# 别人ping我主机的请求被丢弃,8代表请求
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
# 我ping别人时,回来的包被允许,0带表回来的icmp包
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# 查看ICMP类型
iptables -p icmp -h显式匹配
要求以“-m扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
bash
# 多端口匹配
# -m multiport --sports 源端口列表
# -m multiport --sports 目的端口列表
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
# IP范围匹配
# -m iprange --src-range IP范围
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
# MAC地址匹配
# -m mac --mac-source MAC地址
iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
# 状态匹配
# -m state --state 连接状态
# NEW:与任何连接无关的
# ESTABLISHED:响应请求或已建立连接的
# RELATED:与已有连接有相关性的,如FTP数据连接
# 例:只开放本机的Web服务,但对发给本机的TCP应答报文予以放行,其他入站报文均丢弃常见配置示例
基本设置
允许SSH、HTTP/HTTPS,拒绝其他入站
bash
iptables -P INPUT DROP # 设置默认策略为拒绝
iptables -A INPUT -i lo -j ACCEPT # 允许本地回环接口
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 允许已建立和相关连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许HTTPS端口转发(DNAT)
bash
# 将到达本机80端口的流量转发到内网主机192.168.1.10的8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080IP伪装(SNAT,常用于共享上网)
bash
# 允许来自内网(eth1)的流量通过外网接口(eth0)出去时进行源地址伪装
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE限制连接速率(防DDoS/暴力破解)
bash
# 限制每分钟最多25个新连接到80端口,爆发限制为100
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 25/minute --limit-burst 100 -j ACCEPT