Linux防火墙iptables之概念篇(图文并茂)(一)
- 为什么要学Linux防火墙?当你所在公司,出于安全原因,想上防火墙,而各大云厂商云防火墙和硬件防火墙费用及其昂贵,出于成本考虑,此时Linux的防火墙就是最好的解决方案,如果有较高且复杂的防护需求时,也可以考虑上开源的WAF,如OpenResty、OpenWAF等,这里就不过多叙述了,可以自行谷歌了解。
- Docker底层的网络转发是通过Linux内核模块netfilter/iptables完成工作的,以及流行编排工具Kubernetes的各个网络插件也是,如果对iptables的理解不够深入以及操作不熟练的话,那么在排查网络、路由问题的时候,必然会困难重重。所以学好netfilter/iptables,必将事半功倍。
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 四表五链 中的 PREROUTING、FORWARD、POSTROUTING。
当开启了防火墙的时候,数据报文会经过以下的步骤完成,根据实际场景的改变,经过的链也会有所改变。
当数据报文不需要转发的时候,会进入input链到用户空间经过服务进程处理完成后,然后在由output链通过postrouting链返回目标地址。如果数据报文需要转发的时候,会直接在内核中通过forward链完成转发动作,经由output链直接将数据报文送向目标地址。
由上图可以看出来,四表五链中的五链完整的的工作过程。
- 由当前主机转发数据报文: prerouting –> forward –> postrouting
- 进入当前主机,到达用户空间的服务进程数据报文: prerouting –> input。
- 由当前主机中的用户空间服务进程处理的数据报文: output –> postrouting
什么是链?
通过上述已经了解到,iptables是对经过的数据报文匹配rule,然后执行对应的操作,当数据报文经过检查站的时候,必须匹配当前检查站的rule,而每个检查站中存在的不是一个rule,而是由多个rule组成,当所有rule被应用执行的时候,就形成了链。每个链经过的数据报文都会以顺序匹配对应rule,对符合条件的做对应的操作,如下图所示。
什么是表?
通过上述已经了解到了什么是链,而且也了解到每个链是对n+1的rule做匹配与数据报文处理,那么我们现在想要实现另外一个功能,比如rule1是修改数据报文,rule2是对IP端口做开放或限制,这个时候,我们就用到了iptables中的表功能。iptables的表其实就是把不同功能的rule做了分类管理,而这个功能就是我们上面提到的四表五链中的四表,所有的rule都是由以下的四表归类管理。
filter 负责过滤功能。
模块: iptables_filter
nat 网络地址转换。
模块:iptable_nat
mangle 对数据报文拆解、修改、重新封装的功能;
模块: iptable_mangle
raw 关闭nat表上启用的连接追踪机制;
模块: iptable_raw
欢迎大家关注我的公众号ID:k8stech
文章转自公众号:Kubernetes技术栈