Netfilter 初探
Linux 内核在 2.4.x 版本中正式引入 Netfilter 模块,该模块负责网络数据包过滤和 Network Address Translation。 Netfilter 代表着一系列的 Hook ,被内核嵌入到 TCP/IP 协议栈中,数据包在穿梭协议栈时,Hook 会检查数据包,从而达到访问控制的作用。 规则链 Netfilter 模块默认定义了五种类型的 Hook: PREROUTING INPUT FORWARD OUTPUT POSTROUTING 在 Netfilter 里,Hook 也称为 Chain,规则链 我们可以从数据包的来源和走向入手来进行分析这条五条规则链的设计。 首先,数据包按照来源可以分成 Incoming 和 Outgoing 这两种类型。 Incoming 数据包是指其他网卡发来的数据包。这类数据包可能直接奔向用户态的程序, 也有可能被内核转发到其他机器或者其他网卡上,这需要内核做路由判定。 而 Outgoing 数据包是用户态程序准备要发送的数据包。 数据包到达内核之后,内核会为它选择合适的网卡和端口,在此之后便会一层层地穿过协议栈,内核在此过程之中会做出路由判定。 一般情况下,客户端所使用的高端口号。在 Linux 下,我们可以通过 cat /proc/sys/net/ipv4/ip_local_port_range 查看系统会随机使用的端口号范围。 需要注意的是,如果这是内网和外网之间的通信,内核会使用到 NAT 技术来对地址进行转化。 对于 Incoming 数据包而言,内核路由前需要对数据包进行 Destination NAT 转化。 同理,数据包在路由之后也需要做 Source NAT 转化。 根据上面的分析,可以得到以下结论: Incoming 数据包的目的地就在本地:PREROUTING -> INPUT Incoming 数据包需要转发:PREROUTING -> FORWARD -> POSTROUTING Outgoing 数据包:OUTPUT -> POSTROUTING 不同走向的数据包都必定会通过以上五个环节中的部分环节,只要系统管理员在五个环节中设置关卡,就可以做到系统的访问控制。...