iptables的表和链

iptables可以设置不同的规则,并且它把规则按用途进行分类,分成了4个表,分别是

用途
raw 表 用于去除数据包上的连接追踪机制(Connection Tracking)。
mangle 表 用于修改数据包的报文头信息,比如服务类型(Type Of Service,ToS)、生存周期(Time to Live,TTL)。
nat 表 用于修改数据包的源或者目的地址等信息,典型的应用是网络地址转换(Network Address Translation)。
filter 表 用于对数据包进行过滤,控制到达某条链上的数据包是继续放行、直接丢弃或拒绝(ACCEPT、DROP、REJECT),典型的应用是防火墙。

📢📢注意iptables不同的表拥有不同的用途,对应的对包的处理动作不一样,比如要想在nat表中加上过滤动作就不会被允许。

比如我想用nat表添加过滤功能的规则, -j 参数后面跟的是具体的过滤行文(例如: ACCEPT、DROP、REJECT)) 。

如下,在nat表下想添加具有过滤功能的规则就会报错

root@ecs-295280:~# iptables -t nat  -A INPUT -p tcp -s 192.168.10.0/24 -j DROP
iptables v1.8.4 (legacy):
The "nat" table is not intended for filtering, the use of DROP is therefore inhibited.

关于iptables具体的常用命令可以参考我的这篇文章iptables的使用

不同类型的表可以在特定的链上添加不同的规则,为什么叫链呢?因为在某一条链上,可以加上很多条规则,就想链表一样,一个接一个。

固定的链类型有以下几种,分别会在数据流出流出的不同路径上起到作用。

用途
PREROUTING 在进入 IP 路由之前触发
INPUT 接收报文不需要经过转发,直接经过 路由到达应用程序之前会触发
FORWARD 报文需要经过转发,通常是在路由判断时发现报文的目的ip段需要主机的另一个网卡去发送
OUTPUT 报文从应用程序发出时,但在路由前会被触发
POSTROUTIN 发出报文经过路由后,会被触发

对每个链和表的作用有了大致的了解后,我们来细看下数据包流出流出过程中,各个链起的作用。

数据包是如何穿越不同的表和链的

数据包流入到应用程序,不需要经过转发

首先来看下不需要经过转发的场景,数据包是如何流动的。

image.png 如上图所示,不同的表在执行同一个链时是会有先后顺序的,这里再提一下conntrack的作用,conntrack也被称作连接跟踪,它的一个典型应用便是nat协议的实现,比如采用snat的包从网卡发出后再回来, NAT 模块收到一个新的报文时,它先查看 conntrack table, 如果其中存在相关连接信息的表项,它会根据这个表项修改报文的 ip 和 端口信息。 除此以外,Conntrack还可用于负载均衡,路由转发,QoS(Quality of Service),以及网络拓扑发现等应用场景。

数据包流入与流出时需要经过转发

接着我们再来看一下关于数据包转发的场景,这里我用docker容器的网桥和物理网卡举例,说明数据流入输出时是如何转发的。

image.png

如上图所示,在判断路由需要转发时,会先经过forward链执行相关规则,然后才将数据包发到对应转发的网卡上,然后执行postroutine链的规则。图中bridge则代表docker容器创建的网桥设备。数据包从互联网流入容器内部时,会由eth0物理网卡转发到bridge网桥,数据包从容器内部流到互联网时,会由beidge网桥转发到eth0物理网卡上。

数据包从应用程序发往互联网

接着最后来看下数据包从应用程序流出到互联网的场景,注意一点,从应用程序发出去的包虽然要路由判断,不过只有在经过nat的output链以后,路由才算真正被确认,因为dnat可以改变目的ip。

image.png