iptables和netfilter内部报文处理
一、Iptables和netfilter
1.iptables基础
netfilter强大功能以及灵活性是通过iptables界面来实现。此命令行工具和它的前身ipchains语法相似;不过iptables使用netfilter子系统来增进网络连接、检验和处理方面的能力;ipchains使用错综复杂的规则集合来过滤源地址和目的地址路线,以及两者的连接端口。iptables在一个命令行界面中就包括更为先进的记录方式、选路前和选路后的行为、网络地址转换以及端口转发。
从物理角度,防火墙可以分为硬件防火墙和软件防火墙。
从逻辑角度,主机防火墙(主外)和网络防火墙(主内)。
1. netfilter 与 iptables 的关系
netfilter:
是 Linux 内核中的一个框架,负责实现数据包过滤、网络地址转换(NAT)、端口转发等核心功能。
直接操作网络数据包,属于内核态(Kernel Space)的组件。
iptables:
是用户态(User Space)的命令行工具,用于配置和管理 netfilter 的规则。
语法与其前身 ipchains 类似,但功能更强大,支持更复杂的网络控制逻辑。
关键区别:
ipchains 仅支持简单的静态规则(如基于源/目标 IP 和端口的过滤),且规则链(Chains)设计较为简单。
iptables 通过 netfilter 框架实现了动态规则,例如:
状态跟踪:可识别连接状态(如
ESTABLISHED
、NEW
),允许基于会话的过滤。多表协作:支持
filter
(过滤)、nat
(地址转换)、mangle
(数据包修改)等表,分工更精细。灵活的链(Chains):如
PREROUTING
(路由前处理)、POSTROUTING
(路由后处理),支持复杂的数据包处理流程。示例命令对比:
ipchains(旧):
ipchains -A input -p tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT
仅允许来自
192.168.1.0/24
的 TCP 80 端口流量。iptables(新):
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 80 -j ACCEPT
允许新建和已建立的 HTTP 连接,支持状态跟踪。
2. iptables 的核心功能
网络地址转换(NAT):
SNAT(源地址转换):修改数据包的源 IP,常用于内网设备通过网关访问外网。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
MASQUERADE
是 SNAT 的一种特殊形式,自动使用网关的外网接口 IP(例如eth0
的公有 IP)作为源地址,无需手动指定。DNAT(目标地址转换):修改数据包的目标 IP,用于端口转发或负载均衡。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
端口转发:
将外部请求的端口映射到内部服务器的端口。iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
数据包记录与日志:
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Attempt: "
记录所有 SSH 连接尝试,便于审计。
3. 防火墙的分类
物理角度:
硬件防火墙:
专用设备(如 Cisco ASA、FortiGate),性能高,支持大流量处理。
通常部署在企业网络边界,用于保护整个内部网络。
软件防火墙:
基于软件实现(如 iptables、Windows Defender 防火墙)。
运行在通用服务器或主机上,灵活但性能依赖硬件资源。
逻辑角度:
主机防火墙:
保护单个主机,规则针对本机的进出流量。
示例:禁止外部访问本机的 MySQL 端口(3306)。
iptables -A INPUT -p tcp --dport 3306 -j DROP
网络防火墙:
保护整个网络,部署在网关或核心交换机上。
示例:在网关服务器上屏蔽来自恶意 IP 段的流量。
iptables -A FORWARD -s 10.0.0.0/24 -j DROP
4. iptables 的典型工作流程
数据包在 netfilter 中的处理顺序(以 NAT 和过滤为例):
PREROUTING 链(nat 表):
修改目标地址(DNAT)或端口(端口转发)。
路由决策:
判断数据包是发送给本机(INPUT 链)、需要转发(FORWARD 链),还是由本机发出(OUTPUT 链)。
INPUT 链(filter 表):
过滤进入本机的数据包(如允许 SSH 连接)。
FORWARD 链(filter 表):
过滤转发的数据包(如禁止某些 IP 的流量)。
POSTROUTING 链(nat 表):
修改源地址(SNAT)或伪装(MASQUERADE)。
2.解析netfilter 框架:数据包处理流程与 iptables 表链关系
iptables 的主要构成是表,iptables 的操作是对 iptables 上的表的操作。iptables 内置 4个表,nat/mangle/filter/raw。默认为 FILTER 表的操作。
nat 表的主要用于是网络地址转换;
mangle 表主要作用为对数据包进行标记;
filter 表是专门过滤包,对包进行 drop/accept/reject/log 等操作。
raw 表:关闭 net 表上启用的连接追踪机制。
1. nat 表(Network Address Translation)
功能:
实现网络地址转换(NAT),包括 SNAT(源地址转换)和 DNAT(目标地址转换)。
用于端口转发、内网共享上网等场景。
链归属:
PREROUTING
(路由前处理,如 DNAT)
POSTROUTING
(路由后处理,如 SNAT)
OUTPUT
(本机发出的数据包)示例命令:
SNAT(内网设备通过网关访问外网)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10
作用:将内网流量(如
192.168.1.0/24
)的源 IP 改为网关外网 IP203.0.113.10
。动态 IP 场景:可用
MASQUERADE
代替SNAT
,自动获取外网 IP。DNAT(将外网 80 端口转发到内网服务器)
iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
作用:外网访问网关
203.0.113.10:80
时,流量转发到内网服务器192.168.1.100:80
。
2. mangle 表(数据包标记与修改)
功能:
修改数据包元数据(如 TTL、TOS、QoS 标记)。
通过
MARK
标记数据包,供后续规则或 QoS 工具(如tc
)处理。
链归属:
PREROUTING
、POSTROUTING
、INPUT
、OUTPUT
、FORWARD
(所有链均可使用)。示例命令:
修改 TTL(防路由追踪)
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64
作用:将所有出站数据包的 TTL 设置为 64,隐藏网络拓扑。
标记特定流量(如 VoIP 流量)
iptables -t mangle -A PREROUTING -p udp --dport 5060 -j MARK --set-mark 1
作用:为 SIP 协议(UDP 5060 端口)的数据包打标记
1
,后续可通过 QoS 工具优先处理。
3. filter 表(数据包过滤)
功能:
过滤数据包,决定允许(
ACCEPT
)、拒绝(DROP
/REJECT
)或记录(LOG
)。
链归属:
INPUT
(进入本机的流量)
OUTPUT
(本机发出的流量)
FORWARD
(转发的流量)示例命令:
允许 SSH 连接
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
作用:开放本机的 22 端口,允许外部 SSH 连接。
拒绝特定 IP 访问
iptables -t filter -A INPUT -s 10.0.0.5 -j DROP
作用:屏蔽来自
10.0.0.5
的所有流量。记录 HTTP 请求日志
iptables -t filter -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP Access: "
作用:在系统日志中记录所有 HTTP 访问请求。
4. raw 表(连接追踪豁免)
功能:
关闭
netfilter
的连接追踪(conntrack
)机制。用于高性能场景或处理特殊协议(如 VPN、IPsec)。
链归属:
PREROUTING
(数据包进入时处理)
OUTPUT
(本机发出的数据包)示例命令:
豁免 ICMP 协议的连接追踪
iptables -t raw -A PREROUTING -p icmp -j NOTRACK
作用:不对 ICMP 流量(如
ping
)进行状态跟踪,减少资源占用。豁免内网流量追踪
iptables -t raw -A PREROUTING -s 192.168.1.0/24 -j NOTRACK
作用:内网设备间通信不记录连接状态,提升转发效率。
四张表的优先级顺序
规则处理顺序为:
raw → mangle → nat → filter
raw 表最先处理(决定是否跳过连接追踪)。
filter 表最后处理(最终决定是否允许数据包通过)。
总结
nat 表:实现地址转换,用于共享上网、端口转发。
mangle 表:修改数据包元数据或打标记,支持高级网络管理。
filter 表:核心过滤功能,控制流量进出。
raw 表:优化性能,豁免连接追踪。
netfilter是防火墙真正的安全框架,netfilter位于内核空间。iptables其实为一个命令行工具,位于用户空间。netfilter功能(NAT、数据包内容修改、数据包过滤的防火墙功能)。
iptables中3个链和netfilter之间的关系:
FORWARD 链过滤所有不是本地产生的并且目的不是本地(所谓本地就是防火墙)的包;
INPUT 针对那些目的地是本地的包;
OUTPUT 是用来过滤所有本地生成的包。
3.使用iptables设置过滤规则
通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,对信息包进行过滤。通过使用 netfilter/iptables 系统提供的特殊命令 iptables,建立规则,并将规则加到内核空间内特定的信息包过滤表内的链上即可。
1. 规则的本质:匹配条件与处理动作
iptables 的每一条规则由两部分组成:
匹配条件(Match Criteria):
定义规则适用的数据包特征,例如:
源 IP(
-s 192.168.1.0/24
)目标端口(
--dport 80
)协议类型(
-p tcp
)连接状态(
-m state --state ESTABLISHED
)处理动作(Target Action):
决定匹配到的数据包如何处理,例如:
ACCEPT
:允许通过
DROP
:静默丢弃
REJECT
:拒绝并返回错误
LOG
:记录日志
SNAT/DNAT
:地址转换规则示例:
iptables -A INPUT -s 10.0.0.5 -p tcp --dport 22 -j DROP
匹配条件:来自
10.0.0.5
的 TCP 流量,目标端口为 22(SSH)。处理动作:丢弃(
DROP
)此类数据包,禁止该 IP 的 SSH 访问。
2. 规则的组织:表(Tables)与链(Chains)
表(Tables):
按功能分类规则集合,如filter
(过滤)、nat
(地址转换)。链(Chains):
数据包处理的检查点,如INPUT
(进入本机)、FORWARD
(转发)。规则生效的流程:
用户通过
iptables
命令定义规则,指定表(-t
)和链(如INPUT
)。规则被添加到内核空间的对应表和链中。
数据包经过内核时,按 链的顺序 和 表的优先级 依次匹配规则:
若匹配某条规则,则执行对应动作(如
ACCEPT
或DROP
),后续规则不再检查。若未匹配任何规则,则执行链的默认策略(
POLICY
)。示例流程(以
filter
表的INPUT
链为例):iptables -P INPUT DROP # 默认策略:拒绝所有流量 iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许 HTTP iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSH
效果:
默认拒绝所有进入本机的流量。
仅开放 80 和 22 端口的 TCP 连接。
3. 内核空间与用户空间的协作
内核空间:
netfilter
框架驻留在此,直接处理网络数据包。规则以内核模块形式存储,实时生效。
用户空间:
iptables
是用户态工具,用于编辑和推送规则到内核。规则通过系统调用(如
setsockopt
)传递至内核。类比理解:
内核空间:工厂生产线,负责实际加工(处理数据包)。
用户空间:控制台,管理员通过
iptables
指令调整生产线的过滤逻辑。
4. 规则的应用场景示例
场景 1:保护 Web 服务器
目标:仅允许 HTTP(80)、HTTPS(443)和 SSH(22)流量,拒绝其他所有连接。
iptables -P INPUT DROP iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT
场景 2:防止 SYN 洪水攻击
目标:限制每分钟最多 10 个新 TCP 连接。
iptables -A INPUT -p tcp --syn -m limit --limit 10/minute -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP
场景 3:内网 NAT 共享上网
目标:内网设备通过网关访问互联网。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # SNAT iptables -A FORWARD -i eth1 -j ACCEPT # 允许内网接口转发
5. 规则的持久化
问题:默认情况下,iptables 规则重启后失效。
解决方案:
Ubuntu:使用
netfilter-persistent
保存规则。sudo netfilter-persistent save
CentOS:使用
iptables-save
导出规则文件。iptables-save > /etc/sysconfig/iptables
二、netfilter的5种钩子点
在Linux3.2开始的内核中,netfilter共有5个钩子,分别是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。netfilter在设计时,在ipv4协议中,netfilter数据包的路线上直接选取5个挂接点(HOOK)。在适当的位置调用。nerfilter的5个钩子视图如下:
当物理网络上有数据到来时,ip_rcv()函数会接收,函数在最后会调用NF_HOOK将控制权交给PREROUTING点的处理。如果这个地方没有挂接钩子函数,就会有ip_rcv_finish()函数查询路由表。
三、注册、注销钩子
netfilter的注册和注销钩子函数的接口主要有nf_register_hook/nf_unregister_hook/nf_register_sockopt/nf_unregister_sockopt等。
1.结构nf_hook_ops:结构hf_hook_ops是netfilter架构中常用的结构。
2.注册钩子
为了方便其他的内核模块操作网络数据,netfilter提供注册钩子函数。
3.注销钩子
注销钩子的函数比较简单,注销nf_register_net_hook()函数注册的钩子函数。