netfilter/iptables是什么?

netfilter/iptables 是在Linux下工作的免费防火墙,完成拆包、过滤、封包、重定向、网络地址转换(NAT)等功能。相比各大厂商昂贵的硬件防火墙来比,它是当前最完善最稳定的防火墙解决方案。

Linux的iptables只是作为内核netfilter的代理,转储rule,真正完成安全防护功能的是位于内核空间中的netfilter模块。

iptables只是作为用户操作的一个记录、更新、删除rule的使用工具。

iptables中最核心的是 四表五链,所有rule动作都是基于 四表五链 操作内核模块netfilter完成工作的。

对于ubuntu的ufw,是基于iptables封装的一层及其友好的操作命令,会在第二篇 Linux防火墙iptables之Kubernetes篇 中,做延伸讲解。

为了更好的理解iptables原理与实践,引入Kubernetes作为演示案例,以图文形式循序渐进的来讲解iptables在Kubernetes中是怎样完成工作的。

此篇主要是通过图文形式讲解iptables的四表五链对应关系、工作过程以及相关名词,用于了解iptables的整体概念。

iptables 基础

我们都知道iptables是按照rule来工作的,rule其实就是操作人员预定义的条件,rule一般的定义为: "如果数据包符合条件,就对对应的数据进行操作"。rule存放在内核空间的信息包filter表中,这些规则包括了源地址、目标地址、源端口、目标端口、传输协议(如ICMP/UDP/TCP)与服务协议(HTTP/FTP/SSH)等。当数据包与rule匹配时,iptables会根据rule定义的条件来处理对应的数据包,比如accept/rejct/drop等操作,用于对防火墙rule的添加、修改、删除等。

如果仅仅通过上述就可以理解netfilter/iptables,那是基本不可能的,因为iptables的抽象层级还是非常高的,为了能很好的理解netfilter/iptables,我们简单的举个栗子来理解。

当客户端访问服务器的某个服务的时候,首先是客户端发送数据报文到网卡,而TCP/IP协议栈是属于内核的一部分,客户端的信息会通过内核的TCP协议传输给用户空间(用户态)的某服务,此时,客户端的数据报文到目标地址为服务所监听的套接字IP地址:端口上,服务响应客户端请求时,会发出响应数据报文的目标地址是客户端,也就是说目标地址转换成了源地址。上面已经提过,netfilter是防火墙的核心工作模块,工作在Linux内核中,想让防火墙达到防护的功能,就需要对内核中的netfilter配置对应的拦截rule,可以理解为检查站。所有进出的数据报文必须经过检查站,经过rule筛选后,放行符合rule的数据包,拦截拒绝rule的数据包,这里面就有了 input 和 output的概念 ,在iptables中的名词是,也就是 四表五链中的五链之二,对于 四表五链,后面会详细的讲解。

上面的描述仅仅是逻辑的一种抽象表达,因为发起者也有可能不是客户端而是其他的服务器,当本机开启了ip_forward功能,就具备了路由转发功能,这个时候就会用到iptables 四表五链 中的 PREROUTINGFORWARDPOSTROUTING

当开启了防火墙的时候,数据报文会经过以下的步骤完成,根据实际场景的改变,经过的链也会有所改变。

当数据报文不需要转发的时候,会进入input链到用户空间经过服务进程处理完成后,然后在由output链通过postrouting链返回目标地址。如果数据报文需要转发的时候,会直接在内核中通过forward链完成转发动作,经由output链直接将数据报文送向目标地址。

由上图可以看出来,四表五链中的五链完整的的工作过程。