Skip to content

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),默认为 filteriptables -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, REJECTiptables -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, alliptables -A INPUT -p tcp --dport 22 -j ACCEPT
--dport port匹配目标端口(需结合 -p tcp-p udpiptables -A INPUT -p tcp --dport 80 -j ACCEPT
--sport port匹配源端口(需结合 -p tcp-p udpiptables -A OUTPUT -p udp --sport 53 -j ACCEPT
-i interface匹配输入网络接口(如 eth0, loiptables -A INPUT -i eth0 -j ACCEPT
-o interface匹配输出网络接口iptables -A OUTPUT -o wlan0 -j DROP
-j target指定规则匹配后的动作(如 ACCEPT, DROP, REJECT, LOG, DNAT, SNATiptables -A FORWARD -j DROP
-m module使用扩展模块(如 state, conntrack, multiport, limitiptables -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:8080

IP伪装(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