tcpdump iptables
有一个问题,如果用iptables做了包过滤,那么用抓包工具(比如tcpdump)是否还能抓到包了?
答案是:可以、也不可以。看包的传递方向。
这其中的理由来说一说。
数据包一般的传输路径依次是网卡 > 设备驱动层 > 数据链路层 > 网络层 > 传输层最后到达应用程序。而包捕获机制是在数据链路层
增加一个旁路处理,对发送和接收到的数据包做过滤、缓冲等相关处理。
包捕获机制并不影响操作系统对数据包的网络栈处理。
包过滤用的iptables,从名字来看,我们知道他是在网络层做的处理。
所以,如果是接收到的包,那么是先经过抓包工具的处理,再进入iptables的处理,这个时候是可以抓到包的。
而如果是发送出去的包,那么先经过iptables的处理(比如这里我们是将包DROP掉),再在进入抓包工具的处理,这个时候是抓不到包的。
iptables:
下面介绍各个表、链的基本功能。我们实际使用最多的是Filter表、NAT表,所以本文主要也是介绍这2个表。
Filter表#
Filter表示iptables的默认表,如果没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
- INPUT链 – 处理来自外部的数据。
- OUTPUT链 – 处理向外发送的数据。
- FORWARD链 – 将数据转发到本机的其他网卡设备上。
NAT表#
NAT表有三种内建链:
- PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
- POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
- OUTPUT链 – 处理本机产生的数据包。
Mangle表#
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
- PREROUTING
- OUTPUT
- FORWARD
- INPUT
- POSTROUTING
Raw表#
Raw表用于处理异常,它具有2个内建链:
- PREROUTING chain
- OUTPUT chain
数据包流向#
下图简要描述了网络数据包通过 iptables 的过程:

(来自https://wiki.archlinux.org/)
1、数据经由互联网到达 nat 表的 PREROUTING;
2、数据到达 filter表的INPUT;
3、数据到达 本机;
4、数据经由 filter表的OUTPUT;
5、数据经由 nat 表的 POSTROUTING;
6、数据到达互联网。
7、我们也可以在数据到达 nat 表的 PREROUTING后,使用 filter表的FORWARD进行转发。
理解数据包流向很重要,这样我们就能很清楚的知道在哪个表哪个链增加对应的规则。